不能使用GetManifestResourceStream()加载清单资源

我已经使用XSD创建了一个自定义配置部分。 为了解析遵循此新架构的配置文件,我使用以下命令加载资源(我的.xsd文件):

public partial class MonitoringConfiguration
    {
        public const string ConfigXsd = "MonitoringAPI.Configuration.MonitoringConfiguration.xsd";
        public const string ConfigSchema = "urn:MonitoringConfiguration-1.0";

        private static XmlSchemaSet xmlSchemaSet;

        static MonitoringConfiguration()
        {
            xmlSchemaSet = new XmlSchemaSet();
            Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);
            XmlReader schemaReader = XmlReader.Create(xsdStream);
            xmlSchemaSet.Add(ConfigSchema, schemaReader);
        }

    }

顺便说一下,我的资源是:MonitoringConfiguration.xsd。 另一个子类的名称空间(表示.xsd文件后面的代码)为MonitoringAPI.Configuration

问题在这里:

 Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);

xsdStream为null,因此我猜找不到资源! 但为什么?

谢谢

Amokrane Chentir asked 2020-06-27T05:48:09Z
8个解决方案
92 votes

资源的名称始终为:

"MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.xsd"

因此,如果您的资源位于“ Resources / Xsd /”中,并且您的默认项目名称空间是“ MonitoringAPI.Configuration”,则资源名称为:

"MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.xsd"

还要确保将您的资源的构建操作设置为“嵌入式资源”

Philippe Leybaert answered 2020-06-27T05:48:40Z
52 votes

简单而正确的方法来获取嵌入式资源的实际名称:

string[] resourceNames =
    Assembly.GetExecutingAssembly().GetManifestResourceNames();

然后只需检查resourceNames数组,就可以确定要传递给GetManifestResourceStream方法的内容。

user1958681 answered 2020-06-27T05:49:05Z
12 votes

就我而言

当您尝试通过Build Action访问文件时,由于文件路径无效,您将收到一条错误消息,并且stream将为null。

解:

右键单击添加到解决方案中的文件,然后单击“属性”。

选择Build Action作为Embedded Resource。(而不是Content-默认情况下)

Build action property set to embedded resource

RajeshKdev answered 2020-06-27T05:49:43Z
8 votes

默认情况下,Visual Studio不会嵌入xsd文件,因此您必须确保xsd文件的“生成操作”属性设置为“嵌入资源”以使其起作用

Huy Thai answered 2020-06-27T05:50:03Z
5 votes

只需在form1.resx下添加您的资源->添加现有项

双击在Resources folder.go下添加到属性的资源,然后选择“嵌入式资源”而不是没有。

然后尝试调试该行:

string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames();

检查添加的资源是否在数组中。 然后从该数组中精确复制资源名称,然后尝试将该名称放在代码中。

Rittika answered 2020-06-27T05:50:39Z
1 votes

您可以通过传递资源名称来获得资源流,如下所示...

  1. 获取资源名称,例如

    装配objAssembly = Assembly.GetExecutingAssembly();

    字符串化资源名称=程序集。

  2. 将资源名称传递给...

    流strm = objAssembly.GetManifestResourceStream(strResourceNames);

现在您有了Stream,您可以做任何您想做的事...

Sanjay Dwivedi answered 2020-06-27T05:51:25Z
0 votes

就我而言,这是完全不同的东西:

我的UWP App在“调试和发布”配置中正确编译,但是GetManifestResourceStream返回仅Null的发布配置。

问题是,在UWP Build Configuration文件中(仅在那里)启用了“使用.NET Native工具链编译”设置。 禁用后,GetManifestResourceStream会按预期工作。

Marcus answered 2020-06-27T05:51:54Z
0 votes

我遇到了一个问题,我将整个.xsd文件堆嵌入许多不同的程序集中; 除了一个以外,其他所有东西都正常工作(GetManifestResourceNames返回了我希望看到的文件)。 一个没有被称为:

Something.LA.xsd

我没有处理特定的区域性,文件名末尾的.LA位已由编译器获取,因为此文件用于LA区域性-清单中的文件名以Something.xsd的形式进入(在区域性下) 洛杉矶)-因此我找不到它(它最终出现在卫星装置中)。 我通过重命名文件来回避这个问题-大概可以明确说明给定嵌入式资源的文化。

实际上,一个快速的Google会发现:如何防止根据嵌入文件名设置嵌入资源文件的区域性

根据此答案,您必须要做一些骇人听闻的事情-因此,重命名文件毕竟还不算太糟:)

GHC answered 2020-06-27T05:52:29Z
translate from https://stackoverflow.com:/questions/3068736/cant-load-a-manifest-resource-with-getmanifestresourcestream