2016-11-11 57 views
0

從C#3.5至4,我們開始具有的.resources的例外文件不上的InitializeComponent發現遷移後:的InitializeComponent拋出未發現異常的.resources

An unhandled exception of type 'System.IO.FileNotFoundException' occurred in PresentationCore.dll 

Additional information: Could not load file or assembly 'MYASSEMBLY.resources, Version=1.0.0.0, Culture=en-US, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. 

這是一個WPF組件,其被裝載在 - 需求,並沒有本地化 - 。資源不,也不應該存在。該問題在遷移之前未發生,只有在應用程序中執行了一組特定的操作時纔會發生。在另一個操作中,程序集正確加載,並且Fusion Logs顯示嘗試加載.resources失敗,但沒有拋出異常。

而且,舊的博客文章特別調試的組件負載所說的那樣:

注意:除非你明確地調試資源未能加載,你可能會想要忽略失敗中找到組件將文化設置爲「中性」以外的「.resources」擴展。當ResourceManager探測衛星組件時,這些預計會失敗。 https://blogs.msdn.microsoft.com/suzcook/2003/05/29/debugging-assembly-loading-failures/

我曾嘗試申請在AssemblyInfo.cs中的NeutralResourcesLanguage屬性,但只取得了異常參考另一個第三方,組裝。

什麼可能是這個問題的原因是什麼?

回答

1

的問題是由動態加載的其他程序集的寫的不好AppDomain.AssemblyResolve事件處理程序,在.NET中使用行爲的變化相結合造成的。這些程序集的動態載入特性解釋了有時看不到錯誤的原因。

在InitializeComponent上添加try-catch並檢查異常表明內部異常在堆棧中跟蹤試圖加載.resources dll的調用 - 寫得不好的事件處理程序。

已經之前就已經存在,在.net 3.5,但在.NET 4中有一個變化:

從.NET Framework 4開始,ResolveEventHandler事件引發的所有組件,包括資源集合。在早期版本中,不會爲資源程序集引發該事件。如果操作系統已本地化,則處理程序可能會被多次調用:一次針對回退鏈中的每種文化。

https://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1