【问题标题】:Can't load a manifest resource with GetManifestResourceStream()无法使用 GetManifestResourceStream() 加载清单资源
【发布时间】:2011-03-05 08:49:21
【问题描述】:

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

谢谢

【问题讨论】:

    标签: c# .net configurationsection


    【解决方案1】:

    资源的名称总是:

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

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

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

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

    【讨论】:

    • 我的资源与这个类位于同一目录中。
    • 右键单击文件并选择“属性”。
    • 注意资源名称字符串区分大小写
    • 你这么说,但对我来说只是<Base namespace>.<FileName>。你知道为什么吗?
    • @LightnessRacesinOrbit 资源在项目根目录吗?
    【解决方案2】:

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

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

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

    【讨论】:

    • 致 user1958681 ... 是的!就我而言,资源路径是“非标准的”,因为它们的名称中没有资源子目录。数组技巧非常适合知道正确的命名。非常感谢!!
    • 我的名字中也没有子目录。有谁知道为什么?
    • 我发现只要在中间窗口中运行Assembly.GetExecutingAssembly().GetManifestResourceNames(); 而调试就足够了。提供易于阅读的格式化输出。
    • @LightnessRacesinOrbit - “名称中也没有子目录” - 取决于您的目标环境(WPF、UWP、Xamarin、Standard、Net6)。 IIRC,有些有一个“标准位置”来放置资源(例如“Resources/”),并从名称中省略它。
    【解决方案3】:

    就我而言,

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

    解决方案:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        然后 尝试调试该行:

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

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

        【讨论】:

          【解决方案6】:

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

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

            组装 objAssembly = Assembly.GetExecutingAssembly();

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

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

            流 strm = objAssembly.GetManifestResourceStream(strResourceNames);

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

          【讨论】:

            【解决方案7】:

            就我而言,情况完全不同:

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

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

            【讨论】:

            • 奇怪有人否决了我的答案,因为无论是否来自 .NET 本机,GetManifestResourceStream 确实存在差异。当有人在寻找“无法使用 GetManifestResourceStream() 加载清单资源”时,这确实可能是原因之一。
            【解决方案8】:

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

            Something.LA.xsd
            

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

            实际上,一个快速的谷歌显示: How can I prevent embedded resource file culture being set based on its filename

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

            【讨论】:

              猜你喜欢
              • 2013-05-19
              • 2015-09-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-10-30
              • 2015-07-12
              相关资源
              最近更新 更多