2013-01-18 56 views
1

我在我的应用程序中嵌入了一些XML资源,它可以加载XSD文件,但不能加载XML文件。这是我如何加载XSD文件。GetManifestResourceStream()在调试器中返回NULL

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?

+2

什么是当你在调试器正在运行调用程序集(我拉了这一点作为一个局部变量,并检查第一个。) –

+0

是的乔恩我只是想过,因为我愚蠢地调用我的代码从'Main()'调用程序集是调试器,我想'GetExecutingAssembly()'...它总是这些小东西这花费我最多的时间。 – vanneto

回答

1

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

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

3

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

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

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

我想什么是Assembly.GetExecutingAssembly()

获取组件包含当前执行的代码。

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

-1

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

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

上面的例子显示了最好的方法如何映射完美路径

相关问题