2010-11-15 58 views
110

我剛剛將一個現有項目複製到一臺全新的機器上,開始在其上開發,並遇到與我引用的程序集(即發生的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時找到它。

我爲什麼在尋找舊版本?我還可以在哪裏搜索以找到這個不好的參考?

回答

124

我的猜測是你正在使用的另一個程序集是引用舊的dll。您是否熟悉所有正在使用的其他項目引用,並且其中是否有任何引用了Telerik dll?

你可以在你的web.config文件中加入綁定重定向嗎?

<dependentAssembly> 
<assemblyIdentity name="Telerik" publicKeyToken="121fae78165ba3d4"/> 
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/> 
</dependentAssembly> 
+0

謝謝!相關的程序集更改使其工作。不過,我應該提到的是,在解決方案或其他DLL中沒有任何其他項目引用Telerik DLL(爲了仔細檢查,我也對整個文件夾進行了加密)。儘管如此,我還是不能爭取成功! – 2010-11-15 20:01:15

+9

我已經有各種類似的問題與不同的版本加載/不加載。您可以嘗試的另一個技巧是手動刪除C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998文件夾中的所有文件。有時,當重新編​​譯網站時,ASP.Net不會清理該文件夾,因爲有些文件鎖定,並且這些DLL可能掛在舊的引用上。這值得一試,我知道它在過去對我有用。 – 2010-11-16 01:47:03

+1

您爲我解決了一個相關的問題 - 謝謝!我的C#應用​​程序中的繼承形式不會在設計器中打開,因爲它正在查找舊版本的引用。原來在引用問題參考的舊版本時已經創建了另一個參考。 – 2011-09-07 16:10:44

2

你有在該解決方案的任何其他項目?(可能是另一個項目是引用的是舊版本),通常在VS,DLL依賴性跨越溶液中的所有項目。

+0

解決方案中沒有其他項目,也沒有其他引用telerik的引用DLL。我只參考MS DLL ala System。* – 2010-11-15 19:51:13

22

我與克里斯康威在這一個(upvoted他)。問題在於你引用了項目中的一個telerik程序集,它引用了另一個不在那裏的telerik程序集。

第一件事:我不會將任何供應商(即:telerik)程序集安裝到GAC中。無論如何,Telerik的東西被編譯成兩個程序集(telerik.web.design和telerik.web.ui)。只需部署這些應用程序。

其次,在每個.proj文件(如.csproj)中將會有一個<reference include..>指向Telerik.Web.UI文件。這通常包含一個版本號。確保放入bin文件夾中的組件與該版本匹配。

第三,確保您的所有項目都使用最新的程序集。還要確保他們從本地路徑而不是GAC抓取程序集。 (我真的不喜歡GAC,它在我一直參與的一些項目上並沒有結束問題)。我們通常有一個「Assemblies」文件夾,所有項目都用於外部裝配參考。

第四,每當網站項目加載時,visual studio都會自動搜索您的gac,並在gac中找到某些內容時重新彙編程序集位置。我不記得它是否曾經爲web應用程序項目做過這件事,但我很久沒有遇到這個問題。這可能在部署過程中導致類似的問題

第五,您可以重新綁定web.config中程序集的版本號。在runtime/assemblybinding部分,您可以使用像這需要每一個Telerik的組件部署在2008年向前它指向一個非常特別的版本如下:

<dependentAssembly> 
    <assemblyIdentity name="Telerik.Web.UI" publicKeyToken="121fae78165ba3d4" /> 
    <bindingRedirect oldVersion="2008.0.0.0-2020.0.0.0" newVersion="2010.02.0713.35" /> 
    </dependentAssembly> 
+1

感謝您的優點。我摔倒了,我必須首先給@Chris Conway解決方案,但你的回答也很有幫助。 – 2010-11-15 20:02:00

+1

@邁克爾:很高興有幫助。順便說一句,我upvoted他也;) – NotMe 2010-11-15 20:03:16

+2

我的意思是「感覺」,這一直困擾着我好幾個月:) – 2011-04-06 17:23:49

2

我的問題是,舊的組件均在_bin_deployableAssemblies文件夾下的Web應用程序。 這意味着在構建項目時,舊的組件會覆蓋GAC組件。

+0

Thx隊友,爲我工作 – Albernazf 2015-03-31 00:17:25

0

它幾乎就像你必須擦掉你的電腦擺脫舊的DLL。我已經嘗試了上面的所有內容,然後去了刪除計算機上的.DLL文件的每個實例並從應用程序中刪除每個引用的額外步驟。然而,它仍然編譯得很好,當它運行它引用dll函數就好了。我開始懷疑它是否從網絡驅動器引用它。

1

如果您在從Visual Studio環境(ASP.NET Development Server)測試和/或調試應用程序時遇到此問題,則需要刪除開發網站文件夾上的所有臨時文件。要知道該文件夾的位置,請在Windows托盤圖標(它應該有一個這樣的標題:ASP.NET Development Server - Port ####)上找到ASP.NET Development Server圖標,右鍵單擊該圖標並選擇Show細節;這個字段的物理路徑會告訴你什麼是臨時文件夾,應該刪除所有的項目以解決問題。建立並重新運行網站,問題應該解決(再次解決開發環境)。

2
  1. 轉到C:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ CONFIG
  2. 找到machine.config文件
  3. 在記事本中打開
  4. 找到衝突的dll
  5. 刪除這一點,保存。

彙編組件

addassembly = DLLNAME,版本= 1.0.0000。0000文化=中性公鑰= 「QWEWQERWETERY」

組件編譯

爲我工作。

+1

我也發現了這個惡夢 - 即使你從GAC中刪除程序集,它在「C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ machine.config」中留下錯誤的版本引用。 – 2015-08-26 07:13:21

16

我嘗試了大部分的答案,但仍然無法讓它工作。這爲我工作:

參考上點擊右鍵 - >性能 - >變化 '特定版本' 爲假。

enter image description here

希望這有助於。

+3

+1。它幫助我 – 2013-11-08 06:28:07

+28

這就是投票+1的意思。 – xr280xr 2014-06-11 15:03:08

+4

但是有時候,簡單的upvote並沒有充分總結出回答多麼高興和鬆了一口氣 - 在花費數小時和數小時試圖解決一個甚至不應該成爲問題的愚蠢問題之後,您嘗試使用Google搜索它方式,遇到不同的答案比你以前嘗試,並繁榮!它現在有效!畢竟,有時只需按下upvote按鈕並不能對這種壓倒性的感覺做出正確的判斷,老兄,你真的讓我擺脫這個困擾。 – 2017-12-16 03:47:13

1

萬一是救人3小時......我的情況有點不同。我的代碼使用DevExpress v11.1 v11.1.4.0。我已經在代碼中正確引用了它。但.net內存分析器在GAC中安裝了DevExpress v11.1 v11.1.12.0。實際上,它不是我引用的組件,而是它們在內部引用的組件,但它們失敗了。儘可能地嘗試,GAC始終首先被檢查。它編譯並運行良好,但我無法查看勝利表單設計器,堆棧跟蹤根本沒有任何幫助。最後卸載.net內存分析器並全部恢復。

2

這不是一個明確的答案,爲什麼,但我們有這個問題,以下是我們的環境,什麼解決它:

開發1:

解決方案包含項目A引用的NuGet包,一個引用Project A的MVC項目。啓用NuGet Package Restore,然後更新NuGet包。抱怨NuGet lib無法找到運行時錯誤 - 但錯誤是它尋找舊的,未更新的版本。解決方案(這很荒謬):在調用Project A的MVC項目的第一行代碼上設置一個斷點。使用F11引入。解決 - 再也沒有問題。

開發2:

相同的解決方案和項目,但魔法設置斷點和步驟的解決方案不起作用。看到無處不在的版本重定向或其他對此Nuget包的不良引用,刪除包並重新安裝它,擦除bin,obj,Asp.Net Temp,沒有任何解決方法。最後,更名爲Project A,運行MVC項目 - 修復。將它重命名爲原來的名稱,它保持不變。

我沒有任何解釋爲什麼這種工作,但它確實讓我們擺脫了嚴重的困境。

0

當在引用不同版本的相同DLL的應用程序的兩個版本之間切換時,我有相同的消息。儘管我在不同的文件夾中測試,但我不小心將較新版本複製到舊版本。

因此,首先要檢查的是應用程序文件夾中引用DLL的版本。以防萬一。

0

也許這有幫助或可能沒有。我清理了我的調試版本和發佈版本,然後重命名了OBJ文件夾。這終於讓我充滿了希望。之前的步驟基本上是項目移除參考,並將它們添加回項目屬性中。

0

我對引用不同版本的Newtonsoft.json的不同程序集有同樣的問題。我工作的解決方案是從Nuget Package Manager Console運行update-package。

4

嘗試:

  • 清理臨時項目文件
  • 清洗構建和OBJ文件
  • 清洗舊版本安裝在 C:\Users\USERNAME\.nuget\packages\

爲我工作。

+0

清理C:\ Users \ USERNAME \ .nuget \ packages \目錄是我所缺少的。非常感謝! – Herdo 2017-08-19 13:13:04

0

我有一個類似的問題,我不得不從bin和obj文件夾中刪除所有內容,並重建以解決我的問題。希望這可以幫助。

0

在我的Visual Studio 2015年,我保證有問題的Visual Studio項目的參考路徑列表爲空:

enter image description here

+0

爲什麼downvotes?至少解釋!!!! – crazyTech 2018-02-27 19:47:33

+0

您對2個不同的問題發佈了完全相同的答案? – AK47 2018-02-28 00:55:13

相關問題