1

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

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

所以我把命名空间搞砸了,对吧?不,我检查并再次检查。命名空间是正确的,如果不是,我会在正在运行的程序集中遇到异常。(每当发生异常时,我都会记录)我还使用 .NET Reflector 仔细检查了资源是否确实以我期望的名称存在。

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

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

4

3 回答 3

3

问题是我从Main(). 国家的文件Assembly.GetCallingAssembly()

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

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

我想要的是Assembly.GetExecutingAssembly()

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

如果我将我的代码放在一个类中,就不会发生这种情况。我想我是因为愚蠢而交了税。

于 2013-01-18T12:30:56.497 回答
1

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

解决方法是 Project + Properties,Debug 选项卡,取消选中“Enable the Visual Studio hosting process option”。但当然,真正的解决方法是更多地关注代码的位置与资源的位置,做出GetExecutingAssembly()最有可能正确的选择。

于 2013-01-18T13:52:03.300 回答
-1

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

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

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

于 2014-04-24T09:43:10.000 回答