53

我使用 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 为空,所以我猜找不到资源!但为什么?

谢谢

4

8 回答 8

107

资源的名称始终为:

<Base namespace>.<RelativePathInProject>.<FileName>

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

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

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

于 2010-06-18T10:14:09.243 回答
60

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

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

然后只需检查 resourceNames 数组,您就会确定将什么传递给 GetManifestResourceStream 方法。

于 2013-01-08T15:58:03.740 回答
14

就我而言,

当您尝试通过GetManifestResourceStream(). 由于文件路径无效,您将收到错误消息,并且流将为空。

解决方案:

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

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

构建操作属性设置为嵌入资源

于 2015-08-19T13:03:22.050 回答
9

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

于 2010-10-20T07:26:17.923 回答
5

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

双击您在资源文件夹下添加的资源。转到属性并选择“嵌入式资源”而不是无。

然后尝试调试该行:

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

检查您添加的资源是否在数组中。然后从该数组中准确复制资源名称并尝试将名称放在您的代码中......它工作正常!

于 2015-11-04T07:21:27.997 回答
1

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

  1. 获取资源名称,例如。

    装配 objAssembly = Assembly.GetExecutingAssembly();

    字符串[] strResourceNames = objAssembly.GetManifestResourceNames();

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

    流 strm = objAssembly.GetManifestResourceStream(strResourceNames);

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

于 2016-10-19T12:47:33.803 回答
1

就我而言,这是完全不同的事情:

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

问题是,在 UWP 构建配置文件(并且仅存在)中启用了“使用 .NET Native 工具链编译”设置。禁用后,GetManifestResourceStream 按预期工作。

于 2017-06-12T10:08:09.453 回答
1

我遇到了一个问题,我将一大堆 .xsd 文件嵌入到许多不同的程序集中;一切正常(GetManifestResourceNames 正在返回我希望看到的文件),除了一个。没有被调用的那个:

Something.LA.xsd

我没有处理特定的文化,并且文件名末尾的 .LA 位被编译器拾取,因为该文件用于 LA 文化 - 清单中的文件名作为Something.xsd(在文化下LA) - 因此我无法找到它(它最终出现在卫星组件中)。我通过重命名文件来避开这个问题——大概可以明确地说明给定嵌入式资源的文化。

实际上,一个快速的谷歌揭示: 如何防止基于文件名设置嵌入式资源文件文化

根据这个答案,你必须做一些骇人听闻的事情 - 所以也许重命名文件毕竟不是那么糟糕:)

于 2018-02-01T12:26:32.090 回答