繁体   English   中英

GetManifestResourceStream()在调试器中返回NULL

[英]GetManifestResourceStream() returning NULL in debugger

我在我的应用程序中嵌入了一些XML资源,它可以加载XSD文件,但不能加载XML文件。 这是我加载XSD文件的方式。

    private static XmlSchema LoadXsdResource(string folder, string xsdName)
    {
        string filename = string.Format("Namespace.{0}.{1}.xsd", folder, xsdName);
        using (Stream stream = Assembly.GetCallingAssembly().GetManifestResourceStream(filename))
        {
            return XmlSchema.Read(stream, (o, e) =>
            {
                log.Warn(string.Format("Napaka pri parsanju XSD sheme {0}: {1}: {2}", e.Severity, e.Message, filename));
            });
        }
    }

在其他地方我加载XML:

XDocument xdoc = XDocument.Load(Assembly.GetCallingAssembly().GetManifestResourceStream("Namespace.Resources.Oddaja.xml"));

这也有效,但前提是我运行已编译的程序集。 当我使用调试器运行它时,我得到一个来自GetManifestResourceStream()NullReferenceException

所以我搞砸了命名空间,对吧? 不,我检查并仔细检查。 命名空间是正确的,如果不是,我将在正在运行的程序集中获得异常。 (每当发生异常时我都会记录)我还会使用.NET Reflector进行双重检查,看看资源是否真的存在我想要的名称。

我还检查了三次并确保Build Action设置为Embedded Resource但没有任何效果。 我提醒你,当我在调试器外部运行exe时,它可以正常打印XML。 但是,当使用调试器运行时,它返回null并且程序崩溃。

什么可能导致GetManifestResourceStream()仅在调试时返回null?

问题是我从Main()运行我的代码。 Assembly.GetCallingAssembly()的文档说明:

返回调用当前正在执行的方法的方法的程序集。

Assembly是调用我Main()方法当然是调试器。 调试器没有我想要的资源而且崩溃了。 LoadXsdResource()方法有效,因为调用程序集是我的并具有我想要的资源。

我想要的是Assembly.GetExecutingAssembly()

获取包含当前正在执行的代码的程序集

如果我将我的代码放在一个类中,这将不会发生。 我想我因为愚蠢而缴税。

Assembly.GetCallingAssembly()确实是个问题。 在进行调试时,Visual Studio托管进程yourapp.vshost.exe将调用您的代码。 这当然不包含您的资源。

解决方法是Project + Properties,Debug选项卡,取消选中“启用Visual Studio主机进程选项”。 但当然真正的解决方法是更多地关注代码的位置与资源的位置,使得GetExecutingAssembly()成为最可能的正确选择。

它的文件名路径错误时返回null。 它变成了完整的路径,就像这个System.IO.Stream s = b.GetManifestResourceStream(“TestApp.XML.test.xml”);

Nanespace.FileFolderName.xmlfilename.xml
TestingEnvironmentNamespace.Test.test.xml

上面的例子展示了如何绘制完美路径的最佳方法。

暂无
暂无

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

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