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

C# 无法使用GetManifestResourceStream()加载清单资源,c#,.net,configurationsection,C#,.net,Configurationsection,我已经使用XSD创建了一个自定义配置部分。为了解析遵循此新模式的配置文件,我加载了资源my.xsd文件,其中包含以下内容: public partial class MonitoringConfiguration { public const string ConfigXsd = "MonitoringAPI.Configuration.MonitoringConfiguration.xsd"; public const string ConfigSche

我已经使用XSD创建了一个自定义配置部分。为了解析遵循此新模式的配置文件,我加载了资源my.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,因此我猜无法找到资源!但是为什么呢


谢谢

资源的名称始终为:

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

MonitoringAPI.Configuration.Resources.Xsd.MonitoringConfiguration.Xsd


另外,请确保将资源的生成操作设置为嵌入式资源默认情况下,visual studio不嵌入xsd文件,因此您必须确保将xsd文件的生成操作属性设置为嵌入式资源,以使其工作

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

string[] resourceNames =
    Assembly.GetExecutingAssembly().GetManifestResourceNames();
然后只需检查resourceNames数组,就可以确定传递给GetManifestResourceStream方法的内容。

在我的例子中

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

解决方案:

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

选择生成操作作为嵌入式资源。而不是内容-默认情况下


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

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

然后 尝试调试该行:

string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames();
检查您添加的资源是否在阵列中。然后完全从这个数组中复制资源名,并尝试将该名称添加到您的代码中。它可以正常工作

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

获取资源名称,例如

Assembly objAssembly=Assembly.GetExecutionGassembly

字符串[]strResourceNames=objAssembly.GetManifestResourceNames

将资源名称传递给

Stream strm=objAssembly.getManifestResourcestrestResourceNames

现在你有了小溪,你可以做任何你想做的事


在我的情况下,情况完全不同:

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


问题是,在UWP构建配置文件中,仅在那里启用了使用.NET本机工具链编译的设置。禁用后,GetManifestResourceStream按预期工作

我遇到了一个问题,我在许多不同的程序集中嵌入了一堆.xsd文件;一切正常,但ResourceNames正在返回我希望看到的文件,只有一个除外。一个没有被称为:

Something.LA.xsd
我没有处理特定的区域性,文件名末尾的.LA位被编译器拾取,因为该文件是针对LA区域性的-清单中的文件名在区域性LA下作为Something.xsd输入-因此我无法找到它,它最终在附属程序集中。我通过重命名文件来回避这个问题——可能可以显式地声明给定嵌入式资源的区域性

事实上,一个快速的谷歌显示:


根据这个答案,你必须做一些骇客的事情-因此也许重命名该文件并没有那么糟糕:

我的资源与该类位于同一目录中。右键单击该文件并选择“属性”。谢谢,这就是问题所在!我花了半天的时间来解决这个问题,你一分钟就解决了;请注意,资源名称字符串区分大小写您这样说,但对我来说,它只是。。你知道为什么吗?给用户1958681。。。对在我的例子中,资源路径是非标准的,从某种意义上说,它们的名称中没有资源子目录。数组技巧非常适合知道正确的命名。非常感谢!!我的名字里也没有子目录。有人知道为什么吗?我发现只是在运行Assembly.GetExecutionGassembly.GetManifestResourceNames;在中间窗口中进行调试就足够了。提供了一个很好的格式输出,易于阅读。奇怪的是,有人否决了我的答案,因为事实证明GetManifestResourceStream是否来自.NET native确实存在差异。当有人正在查找无法使用GetManifestResourceStream加载清单资源时,这可能确实是原因之一。