.NET 4 載入不同於 .NET 3.5 的程序集
隨著遷移到 .net 4,我們開始面臨庫的問題。假設我們有我們的庫 MyLib.dll,它引用互操作程序集 Interop.dll。Interop.dll 引用了 MissingInterop.dll。
所以引用可以顯示為:
MyLib.dll -> Interop.dll -> MissingInterop.dll在 MyLib.dll 中,我們僅使用來自 Interop.dll 的部分類,因此我們從不呼叫任何需要 MissingInterop.dll 的東西,而在 .net 3.5 中它工作得很好這就是我們不使用 MyLib.dll 發布 MissingInterop.dll 的原因。
當我們從在 .net 4 下執行的程序中使用 MyLib.dll 時,應用程序失敗並出現以下異常:
FileNotFoundException:“無法載入文件或程序集’MissingInterop.dll,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null’或其依賴項之一。系統找不到指定的文件。”`
我還注意到 Interop.dll 引用了其他失去的 dll,但 .net 不會嘗試載入它們。我發現了不同之處。MissingInterop.dll 中的某些類型用於 Interop.dll 中的方法參數,而其他缺失庫中的類型僅用作方法返回類型,即在 Interop.dll 中我可以看到:
Class C1 MethodA : void (valuetype [MissingInterop]MissingAssembly.TypeA&) Class C2 get_Status : valuetype[AnotherMissingInterop]AnotherMissingAssembly.TypeB().NET 4 嘗試載入 MissingInterop.dll 但不嘗試載入 AnotherMissingInterop.dll。
.NET 3.5 沒有嘗試載入 MissingInterop.dll 和 AnotherMissingInterop,因為它們沒有在執行路徑中使用。
我知道 .NET 4 有新的 Fusion,但我還沒有發現任何地方描述的這種重大變化。有人知道為什麼 .NET 4 會嘗試載入不需要的東西嗎?有沒有辦法在不重新編譯程式碼或添加失去文件的情況下解決這個問題?
當您將應用程序從 .NET 3.0、3.5 遷移到 4.0 時,您需要將此 mylib.dll 從外部包含到您的項目中並編譯它們,或者如果可能的話,您擁有程序集的原始碼,然後將其更改為 .net 4.0
可能不是(根據經驗)。在較早的步驟中存在類似的問題(不記得是 2.0 -> 2.1 還是 3.0 -> 3.1。但那是不久前的事了)我們有機器報告安裝了較早的版本並崩潰。當我們清理網路安裝並實際安裝較低版本,然後進行更新時,一切正常。微軟可能會偷偷出一個更新檔。我傾向於用 MS 來提高它。你有一個看似經過充分研究的 bug,在這種情況下,無論是否支持契約,他們都非常不願意最終向你收費。(反正我的經驗)