GetManifestResourceStream返回NULL
这是一个C#.NET 4.0应用程序:
我将文本文件embedded为资源,然后尝试在对话框中显示它:
var assembly = Assembly.GetExecutingAssembly(); var resourceName = "MyProj.Help.txt"; using (Stream stream = assembly.GetManifestResourceStream(resourceName)) { using (StreamReader reader = new StreamReader(stream)) { string result = reader.ReadToEnd(); System.Windows.Forms.MessageBox.Show(result, "MyProj", MessageBoxButtons.OK); } }
解决scheme是MyProjSolution,可执行文件是MyProj.exe。 Help.txt是一个embedded式资源。 但是,stream是空的。 我试过MyProjSolution.Help.txt和MyProjSolution.MyProj.Help.txt,但似乎没有任何工作。
您可以通过使用检查资源是否正确embedded
//From the assembly where this code lives! this.GetType().Assembly.GetManifestResourceNames() //or from the entry point to the application - there is a difference! Assembly.GetExecutingAssembly().GetManifestResourceNames()
debugging时。 这将列出您的代码被写入的程序集中embedded的所有资源的所有(完全限定的名称)。
请参阅MSDN上的Assembly.GetManifestResourceNames() 。
只需复制相关名称,然后使用该名称,而不是在variables“resourceName”中定义的任何名称。
注意 – 资源名称区分大小写,如果您错误地embedded了资源文件,它将不会显示在调用GetManifestResourceNames()返回的列表中。 另外 – 确保从正确的程序集中读取资源(如果使用多个程序集) – 从当前正在执行的程序集而不是从引用的程序集中获取资源都很容易。
编辑 – .NET核心
有关如何使用.NET Coreembedded的详细信息,请参阅此SOpost 。
检索清单信息看起来是相似的 – 只需使用this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames()
从代码正在执行的程序this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames()
获取清单。
我还没有想出如何在.NET Core中做相当于Assembly.GetExecutingAssembly()
工作呢! 如果有人知道 – 请让我知道,我会更新这个答案。
我有一个类似的问题首先检查文件是否包含在您的项目中,然后去属性,并将该文件的生成操作设置为embedded式资源。 这对我工作。
这是我的空值的原因。
http://adrianmejia.com/blog/2011/07/18/cs-getmanifestresourcestream-gotcha/
如果资源的“构build操作”属性未设置为“embedded资源”,则GetManifestResourceStream方法将始终返回NULL
使用所有需要的文件assembly.GetManifestResourceStream设置此属性后,开始返回correntstream而不是NULL
只是一个警告。
我无法作为embedded式资源访问我的文件,即使我指定它是,即使它具有该生成操作属性。 浪费了很多时间敲我的头。 我embedded了一个名为(xxx.cs.txt)的.txt附加的csharp代码文件。 出于某种原因,GetManifestResourceNames()和GetManifestResourceStream()方法将不会看到名称中包含.cs的文件。
我简单地把它改名为xxx.txt,一切都很好。
奇怪的。
我有同样的问题,谢谢杰伊我发现它是目录名称中的连字符。
当您引用资源stream时, ProjectName.ResourceFolder.Sub-Directory
变为ProjectName.ResourceFolder.Sub_Directory
。
在我的情况下,问题是寻找资源的代码是在一个不同的项目,资源本身。
您只能访问代码所在的项目中的资源。 我以为我可以把所有的资源放在网页项目中,但是我也需要邮件项目中的图片。
希望这能帮助那些和我一样的人。
我觉得真正有用的调用Assembly.GetExecutingAssembly().GetManifestResourceNames();
。
您可能需要在GetManifestResourceStream
参数中指定您的txt文件的path,或者您可以尝试将txt文件粘贴到与您的可执行文件相同的目录中。 希望有所帮助!