【问题标题】:GetManifestResourceStream() returning NULL in debuggerGetManifestResourceStream() 在调试器中返回 NULL
【发布时间】:2013-01-02 03:46:25
【问题描述】:

我在我的应用程序中嵌入了一些 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() 调用我的代码,调用程序集就是调试器。我想要GetExecutingAssembly()...总是这些小事花费我最多的时间。

标签: c# .net visual-studio-2010 debugging embedded-resource


【解决方案1】:

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

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

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

我想要的是Assembly.GetExecutingAssembly():

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      以上示例展示了如何绘制完美路径的最佳方式。

      【讨论】:

        猜你喜欢
        • 2014-03-05
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-03
        相关资源
        最近更新 更多