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

Amo*_*tir 47 .net c# configurationsection

我已经使用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);
        }

    }
Run Code Online (Sandbox Code Playgroud)

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

问题出在这里:

 Stream xsdStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(ConfigXsd);
Run Code Online (Sandbox Code Playgroud)

xsdStream为null,所以我猜想无法找到资源!但为什么?

谢谢

Phi*_*ert 94

资源的名称始终为:

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

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

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

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

  • 右键单击该文件并选择“属性”。 (2认同)

小智 52

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

string[] resourceNames =
    Assembly.GetExecutingAssembly().GetManifestResourceNames();
Run Code Online (Sandbox Code Playgroud)

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

  • 给用户1958681 ...是的!就我而言,资源路径是"非标准的",从某种意义上说,它们的名称中没有资源子目录.阵列技巧非常适合于了解正确的命名.非常感谢!! (2认同)
  • 我发现在调试时只需在中间窗口中运行“Assembly.GetExecutingAssembly().GetManifestResourceNames();”就足够了。提供易于阅读的良好格式化输出。 (2认同)

Raj*_*dev 12

就我而言,

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

解:

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

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

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


小智 8

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


小智 5

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

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

然后尝试调试该行:

string[] resourceNames=Assembly.GetExecutingAssembly().GetManifestResourceNames();
Run Code Online (Sandbox Code Playgroud)

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