不能用GetManifestResourceStream()加载嵌入资源

本文关键字:加载 嵌入资源 GetManifestResourceStream 不能 | 更新日期: 2023-09-27 18:15:14

我嵌入了一个二进制文件与/linkres: compiler参数,但当我试图加载它与:

System.Reflection.Assembly myAssembly = System.Reflection.Assembly.GetExecutingAssembly();
string[] names = myAssembly.GetManifestResourceNames(); // it is really there by its name "shader.tkb"
Stream myStream = myAssembly.GetManifestResourceStream( names[0] );

这导致

 Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'shader.tkb' or one of its dependencies. The system cannot find the file specified. ---> System.IO.FileNotFoundException: The system cannot find the file specified. (Exception from HRESULT: 0x80070002)
--- End of inner exception stack trace ---
at System.Reflection.RuntimeAssembly.GetResource(RuntimeAssembly assembly, String resourceName, UInt64& length, StackCrawlMarkHandle stackMark, Boolean skipSecurityCheck)
at System.Reflection.RuntimeAssembly.GetManifestResourceStream(String name, StackCrawlMark& stackMark, Boolean skipSecurityCheck)
at System.Reflection.RuntimeAssembly.GetManifestResourceStream(String name)

这里有什么问题?

不能用GetManifestResourceStream()加载嵌入资源

1 -文件的构建操作应该是嵌入式资源。
2 -你不能只指定资源名称。必须在资源名

之前指定整个程序集名称。
Assembly assembly = this.GetType().Assembly;
assembly.GetManifestResourceStream(
    assembly.GetName().Name + "." + "SubFolderNameIfAny" + ".shader.tkb");

项目命名空间可能需要考虑:

对我有用的是:

System.Reflection.Assembly assem = this.GetType().Assembly;         
using( Stream stream = assem.GetManifestResourceStream("Project_A.FolderName.test.txt") )   

其中"Project_A"是我的projects 命名空间
其中"FolderName"是我的项目解决方案资源管理器中的文件夹
其中"test.txt"是内嵌资源在"FolderName"文件夹中。

assem.GetName().Name

我会得到"Project A"而不是"Project_A"?

此链接将帮助您了解如何使用嵌入式资源。Aseem给出的解决方案仅在程序集名称与项目的默认名称空间相同时才有效,如项目属性的"应用程序"选项卡中所述。

需要做的(即使程序集名称与项目的默认名称空间不相同)是:

using System.IO;
using System.Reflection;
Assembly myAssembly = Assembly.GetExecutingAssembly();
Stream myStream = assembly.GetManifestResourceStream(fullResourceName);

,其中fullResourceName是您希望访问的嵌入式资源的完全限定名。

如果资源(这里是shader.tkb)在项目的根文件夹中,则fullResourceName = "Default.Namespace.Of.Project.shader.tkb"。如果资源存在于项目文件夹中名为Resources的文件夹中,则fullResourceName = "Default.Namespace.Of.Project.Resources.shader.tkb" .

您可以在Assembly对象上使用GetManifestResourceNames()来获取整个文件列表(及其名称)。

我不知道为什么,但在我的项目中,我不应该包括子文件夹名称。只是带有文件名的程序集的基本名。