繁体   English   中英

无法使用GetManifestResourceStream()加载清单资源

[英]Can't load a manifest resource with 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,所以我猜想无法找到资源! 但为什么?

谢谢

资源的名称始终为:

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

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

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

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

获取嵌入资源的实际名称的简便方法:

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

然后只需检查resourceNames数组,您就会知道要传递给GetManifestResourceStream方法的内容。

就我而言,

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

解:

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

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

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

默认情况下,visual studio不会嵌入xsd文件,因此必须确保将xsd文件的“Build Action”属性设置为“Embedded Resource”才能使其正常工作

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

双击您在Resources folder.go下添加到资源的资源,然后选择“Embedded Resources”而不是“none”。

然后尝试调试该行:

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

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

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

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

    程序集objAssembly = Assembly.GetExecutingAssembly();

    string [] strResourceNames = objAssembly.GetManifestResourceNames();

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

    Stream strm = objAssembly.GetManifestResourceStream(strResourceNames);

现在你有Stream你可以随心所欲......

就我而言,它完全不同:

我的UWP App在Debug和Release配置中正确编译,但GetManifestResourceStream仅返回Null Release配置。

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

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

Something.LA.xsd

我没有处理特定的文化,文件名末尾的.LA位被编译器拾取,因为这个文件是针对LA文化的 - 清单中的文件名是以Something.xsd(在文化下)洛杉矶) - 因此我无法找到它(它最终在卫星装配中)。 我通过重命名文件来避免这个问题 - 大概可以明确说明给定嵌入式资源的文化。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM