GetManifestResourceStream()在调试器中返回NULL

本文关键字:返回 NULL 调试器 GetManifestResourceStream | 更新日期: 2023-09-27 17:54:05

我在应用程序中嵌入了一些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 ?

GetManifestResourceStream()在调试器中返回NULL

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

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

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

我要的是Assembly.GetExecutingAssembly():

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

如果我把我的代码放在一个类中,这就不会发生了。我想我为我的愚蠢付了税。

Assembly.GetCallingAssembly()确实是问题所在。当你调试时,你的代码被Visual Studio Hosting进程yourapp.vshost.exe调用。其中当然不包含您的资源。

一个解决方案是项目+属性,调试选项卡,取消勾选"启用Visual Studio托管进程选项"。但当然,真正的解决办法是更多地关注代码的位置而不是资源的位置,使GetExecutingAssembly()成为最可能正确的选择。

文件名路径错误时返回null。它变成了这样的完整路径System.IO.Stream s = b.t getmanifestresourcestream ("TestApp.XML.test.xml");

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

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