GetManifestResourceStream返回NULL

Ron*_*Ron 83 c# embedded-resource

这是一个C#.NET 4.0应用程序:

我将文本文件嵌入为资源,然后尝试在对话框中显示它:

    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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

解决方案是MyProjSolution,可执行文件是MyProj.exe.Help.txt是一个嵌入式资源.但是,流为空.我已经尝试了MyProjSolution.Help.txt和MyProjSolution.MyProj.Help.txt,但似乎没有任何效果.

Jay*_*Jay 160

您可以使用以检查资源是否已正确嵌入

//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()
Run Code Online (Sandbox Code Playgroud)

调试时 这将列出编写代码的程序集中嵌入的所有资源的所有(完全限定名称).

请参阅MSDN上的Assembly.GetManifestResourceNames().

只需复制相关名称,然后使用它代替您在变量'resourceName'中定义的任何名称.

注意 - 资源名称区分大小写,如果您错误地嵌入了资源文件,它将不会显示在对GetManifestResourceNames()的调用返回的列表中.另外 - 确保从正确的程序集中读取资源(如果使用了多个程序集) - 从当前正在执行的程序集而不是从引用的程序集中获取资源都很容易.

编辑 - .NET核心有关如何使用.NET Core嵌入的详细信息,
请参阅此SO帖子.

检索清单信息看起来很相似 - 只是用于this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames()从执行代码的程序集中获取清单.

我还没想出如何Assembly.GetExecutingAssembly()在.NET Core中做相同的操作 !如果有人知道 - 请告诉我,我会更新这个答案.

  • 那很有效.ProjectName.Resources.Help.txt是嵌入的资源名称. (5认同)
  • 我很高兴能帮到你!如果您认为此帖已回答您的问题,请不要忘记将此标记为已接受的答案. (2认同)
  • 是的,所以在 .Net Standard 中它应该是 [ProjectName].[Namespace].[Resource]。我错过了项目名称。谢谢! (2认同)

Jit*_*dra 55

我有一个类似的问题,首先检查文件是否包含在项目中,然后转到属性并将该文件的构建操作设置为Embedded Resource.这对我有用.


Nat*_*ate 10

这是我的null值的原因.

http://adrianmejia.com/blog/2011/07/18/cs-getmanifestresourcestream-gotcha/

如果资源"构建操作"属性未设置为"嵌入资源",则GetManifestResourceStream方法将始终返回NULL

使用所有需要的文件设置此属性后.GetManifestResourceStream开始返回corrent流而不是NULL


Bel*_*ris 7

只是一个警告.

我无法访问我的文件作为嵌入式资源,即使我指定它是,即使它具有该Build Action属性.浪费了很多时间敲打我的脑袋.我嵌入了一个csharp代码文件,其名称后附加了.txt(xxx.cs.txt).由于某种原因,GetManifestResourceNames()和GetManifestResourceStream()方法将不会在其名称中看到带.cs的文件.

我简单地将它重命名为xxx.txt,一切都很好.

奇怪的.

  • 今天这已经浪费了太多时间了!如果您使用“Resource”而不是“Embedded Resource”,它将嵌入它,这使得它变得更奇怪......从名称中删除“.cs.”使其工作。啊。 (2认同)
  • 似乎用双扩展它根本不起作用. (2认同)

Axe*_*ass 5

就我而言,问题在于查找资源的代码与资源本身位于不同的项目中。

您只能访问与代码位于同一项目中的资源。我以为我可以将所有资源放在网页项目中,但我在邮件项目中也需要图像。

希望这对与我有同样情况的人有所帮助。

我发现打电话真的很有用Assembly.GetExecutingAssembly().GetManifestResourceNames();


Ozl*_*zlu 5

嵌入式文件的“ Build Action”属性应设置为“ Embedded Resource”,以正确运行该行,如下所示:

Stream stream = assembly.GetManifestResourceStream(resourceName)
Run Code Online (Sandbox Code Playgroud)

右键单击文件,单击属性,然后将“构建操作”属性设置为“嵌入资源”:

在此处输入图片说明

  • 这是我的问题。我使用 Resources.resx 添加了它,但它不起作用。 (2认同)