2009-10-13 57 views
15

我最近有一些問題hibernate.cfg.xml文件我還沒有在下面一行。無法加載文件或程序在NHibernate的

<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property> 

現在,這是我固定碰到下面的錯誤。

無法加載文件或程序集'NHibernate,Version = 2.1.0.4000,Culture = neutral,PublicKeyToken = aa95f207798dfdb4'或其依賴項之一。定位的程序集清單定義與程序集引用不匹配。 (異常來自HRESULT:0x80131040)

爲什麼我得到這個錯誤,我該如何解決它?

+0

這是一個asp.net應用程序嗎? –

回答

13

這些文件應該在同一目錄中引用的文件,NHibernate.dll:

  • Antlr3.Runtime.dll
  • Iesi.Collections.dll
  • log4net.dll
  • Castle.Core.dll
  • Castle.DynamicProxy2.dll

而且你應該添加一個引用或複製這一個了:

  • NHibernate.ByteCode.Castle.dll
-1

它看起來像NHibernate的DLL沒有被複制到你的應用程序的bin目錄。確保它被引用並存在於bin目錄中。

+0

NHibernate.dll位於bin文件夾中,我在代碼中使用了以下兩個代碼:「使用NHibernate;使用NHibernate.Cfg;」 – GaryDevenay

0

NHibernate的具有比其他nhibernate.dll一些其他組件。你有沒有把他們全部(來自同一個版本)?

0

您應該引用依賴程序集(我想這是「NHibernate.ByteCode.Castle」),並設置他們的「複製本地」屬性設置爲true。

1

你可能有代碼引用兩個不同版本的DLL的NHibernate的。您使用NHibernate下載的NHibernate.dll可能與您下載的版本不同,比如Castle ActiveRecord。試着堅持NHibernate.ByteCode.Castle附帶的NHibernate DLL版本。並確保您的GAC中沒有NHibernate DLL(任何版本)(至少在解決此問題之前)。

2

我最近與1.0 RTM版本FluentNHibernate的,這需要最新升級我們的項目NHibernate位。這導致了你遇到的同樣的問題。

我們的項目的結構是這樣的:

Repository root 
    Solution 
     Web 
      References 
       DataAccess 
     ... other projects/layers ... 
     DataAccess 
      References 
       ..\ReferenceAssemblies\NHibernate.dll 
       ..\ReferenceAssemblies\FluentNHibernate.dll 
    ReferenceAssemblies 

(所有的外部DLL的駐留在ReferenceAssemblies目錄。)

我第一次嘗試要解決的問題是要通過增加NHibernate的參考.ByteCode.Castle.dll添加到DataAccess項目。這工作...但只在開發中...

當我將Web應用程序發佈到我們的客戶驗收測試服務器(在TeamCity的幫助下和一個包含對aspnet_compiler.exe的調用的腳本自動發生)時,無法找到NHibernate.ByteCode.Castle.dll 。

我不確定爲什麼這種情況正在發生,但我懷疑它與我們的應用程序中沒有任何代碼實際調用該特定dll中的代碼有關。還有,(如果我錯了,請糾正我)沒有從NHibernate.dll到NHibernate.ByteCode.Castle的硬編碼引用,所以在某處(可能未使用的)dll被忽略了。

第二(和成功)嘗試是一個參考直接添加到缺少DLL到Web項目。現在,我可以刪除我在第一次嘗試中添加的參考,沒有任何問題。

(我不是特別喜歡在那個特定的項目具有這樣的參考,但嘿!):-)

5

我假設你最近升級到NHibernate的2.1?

如果是這樣,我的猜測是你有不同的項目引用不同版本的NHibernate。

這件事發生在我身上,比您想象的更難追蹤。

這是我花了解決這個問題的步驟:

  1. 刪除您的項目在所有的bin目錄中的所有文件。通常,Clean Solution可以很好地適用於此,但它不會,您可能需要通過命令行調用或手動執行。
  2. 編輯所有的.csproj文件。用文本編輯器編輯它們或執行Unload Project然後編輯你的.csproj文件。
  3. 確保所有HintPath節點指向的DLL

相同的(新)版本,希望能弄清楚這個問題你。

2

在我的情況下,「清潔解決方案」,然後是「重建解決方案」解決了這個問題。

4

我也有這個問題。

對我來說,問題是FluentNHibernate期望NHibernate(2.1.0.4000)的版本不同於我在項目中包含的版本(2.1.2.4000)。我偶然下載了每個庫的最新版本,我偶然發現了這一點。

爲了解決這個問題,我將我的NHibernate引用改爲指向FluenNHibernate 1.0 RTM(2.1.0.4000)附帶的NHibernate的舊版本。

另一個解決方案可能是從app.config文件中顯式設置您的程序集綁定。

+0

對於app.config參考爲+1。我需要在FakeItEasy中尋找類似的問題。 – Aligned

1

我在將NHibernate升級到3.0以及Spring到使用NH 3.0的每晚生成後出現此問題。問題在於Spring.Data.NHibernate30.dll引用了舊版本的NHibernate.dll(v 3.0.0.2002),並且我有v 3.0.0.4000。

我的解決方案是打開項目Spring.Data.NHibernate30源碼,刪除舊版本的NHibernate的引用,添加引用到版本3.0.0.4000,重建,現在在我的項目中添加引用這個(新建)的Spring版本.Data.NHibernate30.dll。

4

作爲日後參考: 如果your're經歷Randy Klingelheber指出(NHibernate和FluentNHibernate,或其他任何相關庫之間的依賴關係問題)同樣的問題,你可以指定爲針對舊版本的組件重定向。這防止了必須重新編譯相關程序集。

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="NHibernate" publicKeyToken="aa95f207798dfdb4" /> 
     <bindingRedirect oldVersion="3.0.0.3001" newVersion="3.0.0.4000" /> 
    </dependentAssembly> 
    </assemblyBinding> 
</runtime> 

此代碼對重定向(在我的情況3.0.0.3001)舊版本中實際使用的一個(3.0.0.4000)的請求。 publicKeyToken包含在錯誤消息中。

1

我剛剛發生過這種事 - 在我的情況下,這是我第一次嘗試NHibernate(和流利NHibernate的)。我已經在一個.dll程序集中實現了我的大部分應用程序,並由一個單獨的可執行程序集引用。可執行文件沒有直接引用NHibernate,它給了我錯誤。

我正在使用NuGet來拉下流利NHibernate,所以我也將Fluent NHibernate引用添加到可執行程序集。不感覺超級乾淨,但它將依賴關係存入.bin文件夾並解決錯誤。 (有趣的是,它似乎沒有(似乎?)發生在其他庫,如NLog)

1

我面臨同樣的問題。我清除了「臨時Internet文件」,這個問題就消失了。

0

您的解決方案中可能有不同的項目。那些項目可能引用了不同版本的NHibernate.dll。檢查所有項目的版本並重建項目

相關問題