2012-04-16 36 views
5

Tôi có một EXE tham chiếu đến một DLL - ví dụ này tôi sẽ gọi nó là TestDLL.dll.
EXE được viết bằng C# và DLL được viết bằng VB .Net.Lắp ráp ràng buộc và chuyển hướng

Tôi đã tạo phiên bản trình diễn bản demo của DLL - ví dụ - phiên bản TestDLL.dll 1.0.0.0.
Tôi muốn biên dịch EXE với tham chiếu đến phiên bản demo DLL (1.0.0.0). Sau đó - tôi muốn EXE sử dụng cùng một DLL, nhưng tôi sẽ đưa nó vào GAC, của bất kỳ phiên bản nào.
Để làm điều đó, tôi đặt "Sao chép địa phương" tài sản của tài liệu tham khảo của DLL để FALSE.

Mục tiêu của tôi là ví dụ - sau khi biên dịch, tôi sẽ đưa vào GAC TestDLL.dll với phiên bản lắp ráp 2.1.6.0 và EXE sẽ tìm thấy nó bằng cách sử dụng liên kết chuyển hướng assembly. Đối với điều đó, tôi đã sử dụng một tập tin cấu hình. Tôi đã sử dụng liên kết này để tạo ra nó:
http://msdn.microsoft.com/en-us/library/7wd6ex19(v=vs.71).aspx

Vì vậy, tập tin cấu hình của tôi trông về như thế này:

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="myAssembly" 
          publicKeyToken="32ab4ba45e0a69a1" 
          culture="en-us" /> 
     <!-- Assembly versions can be redirected in application, publisher policy, or machine configuration files. --> 
     <bindingRedirect oldVersion="1.0.0.0" 
          newVersion="2.1.6.0"/> 
     </dependentAssembly> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

Vấn đề là sau khi làm tất cả những gì, tôi chạy EXE và khi truy cập vào dll, Tôi nhận được lỗi nổi tiếng: System.IO.FileNotFoundException: Không thể tải tệp hoặc lắp ráp 'TestDLL, Phiên bản = 1.0.0.0, Văn hóa = trung lập, PublicKeyToken = 9d8162944bd6fdc7' hoặc một trong các phụ thuộc của nó. Hệ thống không thể tìm thấy các tập tin được chỉ định. File name: 'TestDLL, Version = 1.0.0.0, Culture = trung tính, PublicKeyToken = 9d8162944bd6fdc7'

Ý nghĩa, EXE có thể không tìm thấy gốc DLL Tôi tham chiếu đến. Tôi biết rằng tôi chỉ có thể "tham chiếu" GAC hoặc sử dụng sự phản chiếu, nhưng tôi không muốn - vì EXE này được cho là chỉ hoạt động theo cách này.

Có ai biết sự cố và cách khắc phục sự cố không?
Cảm ơn

+0

Bạn đã đặt thuộc tính "Phiên bản cụ thể" của tham chiếu thành false? –

+0

Bạn có thể đăng tệp .config không? – Xharze

+0

Chắc chắn, tôi cũng đặt thuộc tính "Phiên bản cụ thể" của tham chiếu thành sai. –

Trả lời

11

Đảm bảo rằng bạn đã đặt đúng publicKeyToken. Trong mã bạn đã cho biết bạn đang sử dụng publicKeyToken="32ab4ba45e0a69a1" là mã thông báo khóa công khai từ liên kết MSDN. Điều này rõ ràng là không phải mã thông báo khóa công khai của hội đồng của bạn. Để làm việc này, bạn cần phải có cả hai assembly (1.0.0.0 và 2.1.6.0) được ký với cùng một khóa. Để trích xuất token khóa công khai bạn có thể sử dụng công cụ sn.exe hoặc nhìn vào ngoại lệ stack trace bạn đang nhận được (nó được nói với bạn rằng publicKeyToken="9d8162944bd6fdc7"):

sn.exe -Tp myassembly.dll 

Nhưng nếu lắp ráp mà thực thi được biên dịch chống lại không ký với cùng một khóa này sẽ không hoạt động.

Ngoài ra tôi thấy rằng bạn đã đặt culture="en-us" nhưng hội đồng của bạn có sử dụng văn hóa này không? Bạn cũng có thể thử culture="Neutral".

Cuối cùng, hãy đảm bảo rằng bạn đã triển khai phiên bản lắp ráp phù hợp vào GAC.

+1

Điều đó sẽ làm điều đó. Văn hóa cũng không đúng. –

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