Hội Binding redirect: Làm thế nào và tại sao?


125

Đây không phải là một câu hỏi vấn đề mà là một câu hỏi hiểu biết chung về hoạt động chuyển hướng ràng buộc lắp ráp.

Truy vấn

  1. Tại sao chuyển hướng ràng buộc chỉ hiển thị phiên bản chính và không phải là số nhỏ, xây dựng và sửa đổi số?
  2. Có phải phiên bản cũ và mới chỉ thay đổi khi có thay đổi trong phiên bản chính?

    <dependentAssembly>
        <assemblyIdentity name="FooBar"  
                          publicKeyToken="32ab4ba45e0a69a1"  
                          culture="en-us" />  
    
        <bindingRedirect oldVersion="7.0.0.0" newVersion="8.0.0.0" />  
    </dependentAssembly>

Nó có thể là bất kỳ phiên bản nào, không chỉ là phiên bản chính. Ví dụ:oldVersion="0.0.0.0-4.1.0.0" newVersion="4.1.0.0"
Evk

@Evk: Tất cả các ví dụ mà tôi thấy chỉ hiển thị phiên bản chính.
Nikhil Agrawal

4
Chà, đó chỉ là những ví dụ, và không nơi nào nói rằng đó là cách duy nhất có thể.
Evk

Câu trả lời:


165

Tại sao các chuyển hướng ràng buộc cần thiết ở tất cả? Giả sử bạn có ứng dụng A tham chiếu thư viện B và thư viện C phiên bản 1.1.2.5. Thư viện B lần lượt cũng tham chiếu thư viện C, nhưng phiên bản 1.1.1.0. Bây giờ chúng tôi có một cuộc xung đột, bởi vì bạn không thể tải các phiên bản khác nhau của cùng một cụm khi chạy. Để giải quyết xung đột này, bạn có thể sử dụng chuyển hướng ràng buộc, thường là phiên bản mới (nhưng cũng có thể là phiên bản cũ). Bạn làm điều đó bằng cách thêm phần sau vào tệp app.config của ứng dụng A, trong configuration > runtime > assemblyBindingphần (xem ở đây để biết ví dụ về tệp cấu hình đầy đủ):

<dependentAssembly>
    <assemblyIdentity name="C"  
                      publicKeyToken="32ab4ba45e0a69a1"  
                      culture="en-us" />  

    <bindingRedirect oldVersion="1.1.1.0" newVersion="1.1.2.5" />  
</dependentAssembly>

Bạn cũng có thể chỉ định một loạt các phiên bản để ánh xạ:

<bindingRedirect oldVersion="0.0.0.0-1.1.1.0" newVersion="1.1.2.5" />  

Bây giờ thư viện B, được biên dịch với tham chiếu đến C của phiên bản 1.1.1.0 sẽ sử dụng C của phiên bản 1.1.2.5 khi chạy. Tất nhiên, bạn nên đảm bảo rằng thư viện C tương thích ngược hoặc điều này có thể dẫn đến kết quả không mong muốn.

Bạn có thể chuyển hướng bất kỳ phiên bản nào của thư viện, không chỉ các phiên bản chính.


Tập tin nào và dưới phần nào làm những điều này đi vào? Ai đó có thể vui lòng cung cấp một liên kết đến nguồn như MSDN hoặc tương tự để tham khảo không? Hãy nhớ rằng mọi người sẽ truy cập vào các bài viết Q / A SO của bạn từ khắp nơi trên công cụ tìm kiếm và các tài liệu tham khảo rất quan trọng. Tôi đã có một đồng nghiệp nói với tôi rằng "chỉ cần thêm một chuyển hướng lắp ráp vào tệp exe của bạn" ngay trước khi đi nghỉ một tuần và tôi đã hạ cánh ở đây và trong khi câu trả lời này có vẻ tuyệt vời thì nó thiếu ngữ cảnh và tham khảo.
đôi

Các câu hỏi hợp lệ @tpartee, tôi đã chỉnh sửa câu trả lời (đang chờ đánh giá ngang hàng) để bao gồm phần cấu hình và liên kết đến docs.microsoft.com/en-us/dotnet/framework/configure-apps/ trộm
Kobus Smit

1
@AlexanderDerck trong tệp cấu hình của ứng dụng A - chúng không có tác dụng (theo như tôi biết) trong các tệp cấu hình của các thư viện, ngoại trừ có thể khi thư viện này là thư viện kiểm tra đơn vị và được "thực thi" theo nghĩa nào đó bởi người chạy thử nghiệm đơn vị.
Evk

1
@AlexanderDerck đã có một câu hỏi vài tuần trước, với nhiều câu hỏi và thậm chí là tiền thưởng, đã hỏi chính xác điều đó, nhưng không ai có thể đưa ra câu trả lời thuyết phục - stackoverflow.com/q/48377474/5311735
Evk

1
@CodeEngine publicKeyToken xác định hội đồng C. Chỉ các hội đồng đã ký có mã thông báo khóa công khai đó xác định chúng. Dưới đây là một câu hỏi liên quan về cách bạn có thể tìm ra mã thông báo mà bạn đã lắp ráp: stackoverflow.com/q/3045033/5311735
Evk

55

Chúng tôi đã gặp một vấn đề với chuyển hướng ràng buộc cho NewtonSoft.Json. Chúng tôi đã tra cứu phiên bản tệp trong win 10 thuộc tính tệp "9.0.1.19813", tra cứu số lượng và chuyển hướng tiếp tục thất bại. Nghiên cứu sâu hơn và thấy rằng chúng tôi đang xem xét phiên bản tập tin chứ không phải phiên bản lắp ráp. Vì vậy, tôi tự hỏi nếu mọi người nhầm lẫn Phiên bản tệp (thường thay đổi) và phiên bản hội (mà bạn không thể thấy trong windows 10 File Explorer). Để xem phiên bản hội của một dll, bạn có thể chạy nó trong powershell. Thay thế tên dll bằng tên bạn muốn tìm phiên bản.

[Reflection.AssemblyName]::GetAssemblyName('C:\development\bin\Newtonsoft.Json.dll').Version

Kết quả ở trên là.

Major  Minor  Build  Revision

-----  -----  -----  --------

9      0      0      0

Xem tài liệu tham khảo:

Làm thế nào tôi có thể thấy phiên bản lắp ráp của một cụm .NET trong Windows Vista và mới hơn (WIndows 7, 2008)?

https://support.microsoft.com/en-nz/help/556041

nhập mô tả hình ảnh ở đây


12
Upvote để mang đến sự khác biệt giữa phiên bản Tệp và phiên bản hội !!
mrid 16/03/19
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.