我有一個.net 3.5應用程序與許多dll,我試圖重建特定的dll,而不建立整個應用程序,但在替換舊的應用程序後,應用程序拋出異常,因爲它無法加載新的dll 異常: System.IO.FileLoadException:無法加載文件或程序集.... 我知道它搜索具有特定版本和公共令牌的程序集,如何在不構建應用程序的情況下解決此問題?該申請也已簽署但未在GAC中註冊。 P.S: 我該如何跳過再次構建應用程序,或者因爲dll被重建而必須這樣做?使用新的.net dll更新應用程序會給我FileLoadException?
回答
您得到該錯誤的原因是因爲您的程序集已簽名,並且很可能您對其的引用將特定版本屬性設置爲True,並且您更改的程序集的版本號已更改。我嘗試了很多場景,而這是我能夠獲得FileLoadException的唯一場景。如果您已將Target Framework更改爲4.0等較新版本,則會出現BadImageFormatException。即使你說你沒有改變版本號,也要檢查它,或者通過選擇你的參考並右擊並選擇屬性來將特定版本設置爲False。
你的例外可能是這樣的:
Could not load file or assembly 'LoadedAssembly, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=889080b75eb3bad2' or one of its dependencies. The located assembly's manifest
definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
但是你的編譯版本,如果被參考的裝配不再1.0.0.0(或任何版本爲例)。在下面的圖片中(小),你可以看到引用屬性正在尋找版本1.0.0.0,特定版本被設置爲True,並且引用程序集已簽名,實際上是2.0.0.0版本,從而導致FileLoadException。
通過更改版本號並重新編譯或將特定版本設置爲False並僅重建該DLL來解決此問題。你不必重建你的整個應用程序。
你應該重建那些引用這個新DLL的程序集。
Windows事件日誌應提供有關無法加載的更多信息。您是否在新的DLL中引入了另一個依賴項?我遇到過類似的問題,第三方DLL需要安裝C++ Runtime 2005(在大多數開發機器和大多數桌面上都是如此,因爲它非常常見)。
沒有使用原生dll,所有組件都是.net 3.5 –
瘋狂的猜測......你可以檢查DLL所在的文件夾是否標記爲ReadOnly。
右鍵單擊文件夾>屬性>取消選中只讀>單擊應用>選擇所有子文件夾和文件>確定。
重建您的解決方案。
您是否嘗試過使用DEVPATH環境變量?此環境變量允許您定義一個目錄作爲「開發期間的GAC」。所有你需要做的是:
1)下列元素添加到您的machine.config(仔細檢查將要使用什麼樣的位置,你的machine.config中的)
- C:\ WINDOWS \ Microsoft.NET \ Framework64 \ V2.0.50727 \ CONFIG OR
C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ CONFIG *
2)添加一個新的環境變量的名稱DEVPATH
set devpath="e:\temp\Message_DLL\bin\Debug" /// manually, console
/// or open windows config form - see below
3)然後去你的UI應用程序/項目,並添加一個引用到您的DLL DEVPATH目錄。
確保您配置「本地副本=假,具體版本=假」。您可能會看到強名(Starker Name)是true。
4)現在你必須編譯你的UI應用程序一次!之後,您可以根據需要選擇更改DLL中的源代碼。由於DEVPATH變量,您的UI應用程序將始終選擇DLL的最新版本!
注意!我試圖從VS啓動UI應用程序,但加載異常失敗。但從資源管理器窗口啓動它 - 成功了。似乎從VS啓動UI應用程序會導致CLR在其他位置查找引用的DLL。你
備註: 僅在開發時使用此設置。運行時不檢查版本 在DEVPATH中找到的強名稱程序集。它只是使用它找到的第一個組件。
您也可以看看下面的文章/網頁。
CodeProject - Assembly location, binding, deploying
Social MSDN Questions about DEVPATH
我想這應該做的伎倆!
- 1. .net應用程序更新
- 2. 自我更新.net CF應用程序
- 3. FileLoadException與新版本的DLL
- 4. 使用app_offline.htm在更新dll時更新dll時失敗應用程序脫機
- 5. 在線更新DLL應用程序
- 6. 更新一組.net應用程序
- 7. xCode Storyboard更新不會在更新後更新應用程序
- 8. iphone應用程序 - 使用新項目更新應用程序
- 9. 使用msi更新應用程序無法更新dll項目參考
- 10. 我可以使用更新按鈕更新我的android應用程序嗎?
- 11. Android應用程序的自我更新
- 12. 自我更新的應用程序
- 13. 如何更新我的應用程序
- 14. 自我更新的應用程序
- 15. 更新我的Android應用程序
- 16. 爲什麼iPhone應用程序更新會中斷我的應用程序?
- 17. 如何更新我的應用程序/系統/應用程序
- 18. 刷新應用程序來使用最新的更新
- 19. 更新Android應用程序。小更新
- 20. 不帶Webdav的.NET應用程序更新程序組件
- 21. Android SDK - 更新xml不會更新應用程序
- 22. 使用websocket更新ReactJS應用程序
- 23. 使用admin.setAppProperties更新應用程序
- 24. 使用Intent.Up更新Android應用程序
- 25. 使用Three20更新應用程序
- 26. 使用Xcode 5更新應用程序
- 27. .net程序中的自我更新?
- 28. DLL不會更新
- 29. FileLoadException在訪問項目應用程序文件夾中的程序集dll時
- 30. ASP.Net應用程序自我更新
確保新的組件具有相同的名稱和相同的[的AssemblyVersion。簽署這是一個錯誤。 .NET 3.5 SP1不檢查完全信任的簽名。 –
如何更新程序集? – Sharique
我打算假設你確定你的目標是使用新版本的.Net 3.5 ---你可以隨時檢查'LoaderExceptions'來檢查你是否得到更多的信息:'var reflection = ex as ReflectionTypeLoadException; ' –