2013-01-18 80 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 

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

相關問題