2011-11-16 43 views
0

我正在將一些基於.NET 3.5的項目轉換爲.NET Framework 4.0,並遇到彙編嵌入字符串資源的問題。如何將帶有嵌入字符串資源的.NET 3.5兼容程序集移植到.NET 4.0中?

代碼包含對資源字符串的引用,如Resources.ValidationFailedMsgResources這裏是一個自動生成的類。它的完全限定名是MyAssembly.Properties.Resources(程序集名稱是MyAssembly.dll,爲了簡單起見,其中的所有內容的根名稱空間也是MyAssembly)。項目的「屬性」文件夾包含Resources.resx,其中定義了字符串ValidationFailedMsg(例如「驗證失敗!」),並從中生成Resources.Designer.cs文件。

現在讓我們來運行這個東西。這裏是發生了什麼:

System.IO.FileNotFoundException:未能加載文件或程序集「MyAssembly.resources ....

對不起,有什麼文件???

首先,我理解二進制文件.resource的概念以及如何爲許多文化創建許多這樣的文件,但讓我們先讓一個默認文化工作。從該項目的.NET 2.0到3.5兼容版本,所有的字符串都被嵌入到程序集本身中,所以除了MyAssembly.dll外,框架甚至都沒有找到它們。 我怎樣才能讓它看起來大會,而不是看別的?

其次,我注意到一個.resource文件中的項目的bin \ Debug目錄,但它的命名MyAssembly.Properties.Resources.resources,不MyAssembly.resources和的MSBuild不把它複製到BIN \調試或其他地方MyAssembly被引用。這是對這裏可能會出錯的有用提示嗎?第三,我可以在Visual Studio 2010中打開一個新的空項目,在屬性下添加Resources.resx,在其中放置一個字符串,在代碼中將其引用爲TestProject.Properties.Resources.String1,編譯並運行像魅力。但在舊項目中,即使使用字符串讀取Resource.resx也無濟於事。

你能解釋爲什麼.NET 4.0將這些字符串編譯到一個地方,然後在不同的地方尋找它們,導致FileNotFoundException?將.NET 3.5與此類嵌入式字符串資源兼容的程序集遷移到.NET 4.0的正確方法是什麼?

回答

0

神祕解決了。

.NET(4.0之前)首先查找.resource文件。如果找不到該文件,它會在程序集內部查找所需的資源。

從.NET 4.0開始,如果.resource文件不存在,框架將觸發一個AppDomain.AssemblyResolve事件並傳遞資源文件名來代替程序集名稱。(爲什麼AssemblyResolve? - 這可能是一個錯誤。)只有當這個事件沒有被處理時,.NET 4.0是否會在程序集內查找資源。

事情發生時,應用程序已經註冊了一個AssemblyResolve處理程序。處理程序被編程爲定位DLL並且從未失敗多年,直到.NET 4.0升級的那一天,當時它被要求找到一個不存在的資源文件。

相關問題