无法使用GetManifestResourceStream()加载嵌入式资源
我正在使用/ 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)
这里有什么问题?
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”是我的项目命名空间 。
“FolderName”是我的项目解决方案资源管理器中的文件夹 。
其中“test.txt”是“FolderName”文件夹中的嵌入资源 。
如果我使用:
assem.GetName().Name
我会得到“Project A”而不是“Project_A”?!?!?!?
您可以在Assembly对象上使用GetManifestResourceNames()来获取整个文件列表(及其名称)。
我不知道为什么但是在我的项目中我不应该包含子文件夹名称。 只是带有文件名的程序集的基名。
此链接将帮助您了解如何使用嵌入式资源。 只有当程序集名称与项目的默认名称空间相同时,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"
。