我剛剛將一個現有項目複製到一臺全新的機器上,開始在其上開發,並遇到與我引用的程序集(即發生的telerik DLL)版本相關的問題。.net揀選錯誤的引用程序集版本
該項目最初引用程序集的舊版本(讓我們稱之爲v1.0.0.0)。我的新機器安裝了最新版本的程序集,所以我想我已經更新了它(讓我們稱之爲新版本v2.0.0.0)。
現在問題是:如果我將舊的v1.0.0.0 dll拷貝到項目文件夾並添加它作爲參考,網站啓動沒有問題。如果我刪除基準(也刪除我的系統上舊的DLL),並添加新的版本(V2.0.0.0),頁面顯示以下異常:
無法加載文件或程序集 「 XXXXXX,Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 121fae78165ba3d4'或 其依賴關係之一。位於 程序集清單定義 與程序集引用不匹配。 (異常來自HRESULT:0x80131040)
顯然,代碼尋找過時的版本,並不能找到它。但爲什麼?
我爲該版本號的grep解決方案文件夾找不到一個引用。我再次檢查了.csproj文件的文本,發現版本正確顯示了最新版本,並且HintPath正確顯示了新DLL的路徑。此外,因爲我沒有在系統上安裝舊的DLL,所以它沒有出現在我的GAC中(儘管v2.0.0.0的確如預期的那樣)。
我再啓用融合日誌查看器,試圖弄清楚爲什麼它尋找的是舊版本,但沒有運氣:
Assembly Load Trace: The following information can be helpful to determine why the assembly 'XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4' could not be loaded.
=== Pre-bind state information ===
LOG: User = MyComp\me
LOG: DisplayName = XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
(Fully-specified)
LOG: Appbase = file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/
LOG: Initial PrivatePath = d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\bin
Calling assembly : WebApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\web.config
LOG: Using host configuration file:
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX/XXXXXX.DLL.
LOG: Attempting download of new URL file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/bin/XXXXXX.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
所有它說,它開始通過尋找舊組裝。我試圖在網上找到解決方案,並看到類似的SO question,但它似乎與我的問題完全相反。該提問者的程序找到了錯誤的DLL而不是引用的DLL。而我的問題是,該程序神祕地尋找錯誤的DLL,並且無法在bin文件夾和GAC中找到正確的DLL時找到它。
我爲什麼在尋找舊版本?我還可以在哪裏搜索以找到這個不好的參考?
謝謝!相關的程序集更改使其工作。不過,我應該提到的是,在解決方案或其他DLL中沒有任何其他項目引用Telerik DLL(爲了仔細檢查,我也對整個文件夾進行了加密)。儘管如此,我還是不能爭取成功! – 2010-11-15 20:01:15
我已經有各種類似的問題與不同的版本加載/不加載。您可以嘗試的另一個技巧是手動刪除C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998文件夾中的所有文件。有時,當重新編譯網站時,ASP.Net不會清理該文件夾,因爲有些文件鎖定,並且這些DLL可能掛在舊的引用上。這值得一試,我知道它在過去對我有用。 – 2010-11-16 01:47:03
您爲我解決了一個相關的問題 - 謝謝!我的C#應用程序中的繼承形式不會在設計器中打開,因爲它正在查找舊版本的引用。原來在引用問題參考的舊版本時已經創建了另一個參考。 – 2011-09-07 16:10:44