2011-06-23 47 views
5

我有一個.net 3.5應用程序與許多dll,我試圖重建特定的dll,而不建立整個應用程序,但在替換舊的應用程序後,應用程序拋出異常,因爲它無法加載新的dll 異常: System.IO.FileLoadException:無法加載文件或程序集.... 我知道它搜索具有特定版本和公共令牌的程序集,如何在不構建應用程序的情況下解決此問題?該申請也已簽署但未在GAC中註冊。 P.S: 我該如何跳過再次構建應用程序,或者因爲dll被重建而必須這樣做?使用新的.net dll更新應用程序會給我FileLoadException?

+1

確保新的組件具有相同的名稱和相同的[的AssemblyVersion。簽署這是一個錯誤。 .NET 3.5 SP1不檢查完全信任的簽名。 –

+0

如何更新程序集? – Sharique

+0

我打算假設你確定你的目標是使用新版本的.Net 3.5 ---你可以隨時檢查'LoaderExceptions'來檢查你是否得到更多的信息:'var reflection = ex as ReflectionTypeLoadException; ' –

回答

5

您得到該錯誤的原因是因爲您的程序集已簽名,並且很可能您對其的引用將特定版本屬性設置爲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來解決此問題。你不必重建你的整個應用程序。

enter image description here

0

你應該重建那些引用這個新DLL的程序集。

0

Windows事件日誌應提供有關無法加載的更多信息。您是否在新的DLL中引入了另一個依賴項?我遇到過類似的問題,第三方DLL需要安裝C++ Runtime 2005(在大多數開發機器和大多數桌面上都是如此,因爲它非常常見)。

+0

沒有使用原生dll,所有組件都是.net 3.5 –

0

瘋狂的猜測......你可以檢查DLL所在的文件夾是否標記爲ReadOnly。

右鍵單擊文件夾>屬性>取消選中只讀>單擊應用>選擇所有子文件夾和文件>確定。

重建您的解決方案。

2

您是否嘗試過使用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 

Setting DEVPATH environment variable

3)然後去你的UI應用程序/項目,並添加一個引用到您的DLL DEVPATH目錄。

Adding reference to dll

確保您配置「本地副本=假,具體版本=假」。您可能會看到強名(Starker Name)true

4)現在你必須編譯你的UI應用程序一次!之後,您可以根據需要選擇更改DLL中的源代碼。由於DEVPATH變量,您的UI應用程序將始終選擇DLL的最新版本!

注意!我試圖從VS啓動UI應用程序,但加載異常失敗。但從資源管理器窗口啓動它 - 成功了。似乎從VS啓動UI應用程序會導致CLR在其他位置查找引用的DLL。你


還可以看看MSDNMSDN2

備註: 僅在開發時使用此設置。運行時不檢查版本 在DEVPATH中找到的強名稱程序集。它只是使用它找到的第一個組件。

您也可以看看下面的文章/網頁。

CodeProject - Assembly location, binding, deploying

Social MSDN Questions about DEVPATH

我想這應該做的伎倆!