2009-10-13 52 views
15

Gần đây tôi đã có một số vấn đề với các tập tin hibernate.cfg.xml như tôi đã không có dòng sau trong.Không thể tải tập tin hoặc lắp ráp trong NHibernate

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

Bây giờ này là cố định tôi nhận được lỗi sau.

Không thể tải tệp hoặc lắp ráp 'NHibernate, Version = 2.1.0.4000, Culture = neutral, PublicKeyToken = aa95f207798dfdb4' hoặc một trong các phụ thuộc của nó. Định nghĩa tệp kê khai của assembly được đặt không khớp với tham chiếu assembly. (Ngoại lệ từ HRESULT: 0x80131040)

Tại sao tôi gặp lỗi này và cách khắc phục?

+0

Đây có phải là ứng dụng asp.net không? –

Trả lời

13

Những tập tin này phải ở trong cùng thư mục với tập tin tham chiếu, NHibernate.dll:

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

Ngoài ra, bạn nên thêm một tham chiếu hoặc sao chép này quá:

  • NHibernate.ByteCode.Castle.dll
-1

Dường như dll NHibernate không được sao chép vào thư mục bin của ứng dụng của bạn. Hãy chắc chắn rằng nó được tham chiếu và tồn tại trong thư mục bin.

+0

NHibernate.dll nằm trong thư mục bin và tôi có cả hai cách sử dụng sau trong mã "sử dụng NHibernate; sử dụng NHibernate.Cfg;" – GaryDevenay

0

NHibernate có một vài hội đồng khác ngoài nhibernate.dll. Bạn đã có tất cả trong số họ (từ cùng một bản phát hành)?

0

Bạn nên tham khảo các hội đồng phụ thuộc (tôi đoán đó là "NHibernate.ByteCode.Castle") và đặt thuộc tính "bản sao cục bộ" thành true.

1

Bạn có thể có mã tham chiếu hai phiên bản khác nhau của NHibernate DLL. NHibernate.dll mà bạn tải xuống với NHibernate có thể là một phiên bản khác với phiên bản bạn tải xuống, chẳng hạn như Castle ActiveRecord. Cố gắng gắn bó với phiên bản của NHibernate DLL đi kèm với NHibernate.ByteCode.Castle. Và chắc chắn rằng bạn không có các NHibernate DLL (bất kỳ phiên bản) trong GAC của bạn (ít nhất là cho đến khi bạn nhận được vấn đề này giải quyết).

2

Gần đây tôi đã nâng cấp dự án của chúng tôi với RTM phiên bản 1.0 của FluentNHibernate, mà yêu cầu mới nhất Bit NHibernate. Điều này dẫn đến cùng một vấn đề bạn đang gặp phải.

cấu trúc của dự án của chúng tôi là một cái gì đó như thế này:

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

(cư trú Tất cả các DLL bên ngoài trong thư mục ReferenceAssemblies.)

nỗ lực đầu tiên của tôi để giải quyết vấn đề là bằng cách thêm một tham chiếu đến NHibernate .ByteCode.Castle.dll vào dự án DataAccess. Điều này làm việc ... nhưng chỉ trong phát triển ...

Khi tôi xuất bản ứng dụng web lên máy chủ kiểm tra chấp nhận khách hàng của chúng tôi (tự động xảy ra với sự trợ giúp của TeamCity và tập lệnh có chứa lệnh gọi aspnet_compiler.exe), NHibernate.ByteCode.Castle.dll không tìm thấy ở đâu .

Tôi không chắc chắn lý do tại sao điều này xảy ra, nhưng tôi nghi ngờ rằng nó có liên quan đến thực tế là không có mã nào trong ứng dụng thực sự gọi mã trong dll cụ thể đó. Ngoài ra, có (đúng tôi nếu tôi sai) không có tài liệu tham khảo hardcoded từ NHibernate.dll để NHibernate.ByteCode.Castle, do đó, một nơi nào đó xuống dòng (có lẽ không sử dụng) dll bị bỏ qua.

Số thứ hai (và thành công) cố gắng là thêm tham chiếu đến dll bị thiếu trực tiếp vào dự án web. Bây giờ, tôi có thể xóa tham chiếu mà tôi đã thêm vào trong lần thử đầu tiên mà không gặp bất kỳ sự cố nào.

(Tôi không đặc biệt thích có một tài liệu tham khảo ví dụ trong đó dự án cụ thể, nhưng hey!) :-)

5

Tôi giả sử bạn vừa mới nâng cấp NHibernate để 2.1?

Nếu vậy, tôi đoán là bạn có các dự án khác nhau tham chiếu các phiên bản NHibernate khác nhau.

Điều này xảy ra với tôi và khó theo dõi hơn bạn nghĩ.

Đây là các bước tôi đã để giải quyết nó:

  1. Xóa tất cả các file trong thư mục bin tất cả các dự án của bạn. Thông thường Clean Solution hoạt động tốt cho điều này, nhưng nó không, bạn có thể phải làm điều đó với một cuộc gọi dòng lệnh hoặc bằng tay
  2. Chỉnh sửa tất cả các tệp .csproj của bạn. Chỉnh sửa chúng bằng trình chỉnh sửa văn bản hoặc thực hiện Unload Project sau đó chỉnh sửa tệp .csproj của bạn.
  3. Hãy chắc chắn rằng tất cả các nút HintPath bạn trỏ đến cùng (mới) phiên bản của DLL

Đó hy vọng sẽ làm sáng tỏ vấn đề này cho bạn.

2

Trong trường hợp của tôi, "Giải pháp làm sạch", tiếp theo là "Giải pháp xây dựng lại" đã giải quyết được sự cố.

4

Tôi cũng gặp sự cố này.

Đối với tôi, vấn đề là FluentNHibernate dự kiến ​​một phiên bản khác của NHibernate (2.1.0.4000) so với tôi đã bao gồm trong dự án (2.1.2.4000). Tôi tình cờ hiểu điều này bằng cách tải xuống riêng các bản phát hành mới nhất của mỗi thư viện.

Để khắc phục sự cố, tôi đã thay đổi tham chiếu NHibernate để trỏ đến phiên bản cũ hơn của NHibernate đi kèm với FluenNHibernate 1.0 RTM (2.1.0.4000).

Một giải pháp khác có thể được đặt rõ ràng ràng buộc lắp ráp của bạn từ tệp app.config.

+0

+1 cho tham chiếu app.config. Tôi cần phải tìm ở đó cho một vấn đề tương tự với FakeItEasy. – Aligned

1

Tôi gặp sự cố này sau khi nâng cấp NHibernate lên 3.0 và Spring to night build sử dụng NH 3.0. Vấn đề là Spring.Data.NHibernate30.dll tham chiếu phiên bản cũ hơn của NHibernate.dll (v 3.0.0.2002) và tôi đã có v 3.0.0.4000.

Giải pháp của tôi là mở dự án Spring.Data.NHibernate30 nguồn, xóa tham chiếu đến phiên bản cũ hơn của NHibernate, thêm tham chiếu đến phiên bản 3.0.0.4000, xây dựng lại và bây giờ trong dự án của tôi thêm tham chiếu đến phiên bản Spring mới này .Data.NHibernate30.dll.

4

Là tài liệu tham khảo trong tương lai: Nếu bạn đang gặp phải sự cố tương tự Randy Klingelheber chỉ ra (sự cố phụ thuộc giữa NHibernate và FluentNHibernate hoặc bất kỳ thư viện phụ thuộc nào khác), bạn có thể chỉ định chuyển hướng cho hội đồng nhắm mục tiêu phiên bản cũ. Điều này ngăn cản một người phải biên dịch lại hội đồng phụ thuộc.

<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> 

Mã này chuyển hướng yêu cầu cho các phiên bản cũ (3.0.0.3001 trong trường hợp của tôi) đến một thực tế sử dụng (3.0.0.4000). PublicKeyToken được bao gồm trong thông báo lỗi.

1

Tôi chỉ có điều này xảy ra với tôi - trong trường hợp của tôi đây là lần đầu tiên tôi thử NHibernate (và Fluent NHibernate). Tôi đã thực hiện hầu hết các ứng dụng của tôi trong một hội đồng .dll, được tham chiếu bởi một hội đồng thực thi riêng biệt. Các thực thi, mà không có tài liệu tham khảo để NHibernate trực tiếp, đã cho tôi lỗi.

Tôi đang sử dụng NuGet để kéo xuống NHibernate thông thạo, vì vậy tôi đã thêm tham chiếu Fluent NHibernate vào các hội đồng thực thi. Không cảm thấy siêu sạch, nhưng nó được phụ thuộc vào thư mục .bin và giải quyết lỗi. (hài hước là nó không (dường như?) xảy ra với các thư viện khác, như NLog)

1

Tôi đang đối mặt với cùng một vấn đề. Tôi đã xóa '' Temporary Internet Files '', và vấn đề này đã biến mất.

0

Bạn có thể có các dự án khác nhau trong giải pháp của mình. Những dự án có thể tham khảo các phiên bản khác nhau của NHibernate.dll. Kiểm tra các phiên bản trong tất cả các dự án và xây dựng lại dự án

Các vấn đề liên quan