2009-06-11 11 views
63

Chúng tôi có một ứng dụng web được triển khai cho nhiều trang web chỉ có thay đổi giao diện người dùng, phần phụ trợ được chia sẻ có DLL trong GAC nên chúng tôi chỉ phải cập nhật một dll đó và tất cả các trang web đều có bản cập nhật.Dll trong cả thùng và gấc, cái nào được sử dụng?

Có cách nào ghi đè GAC bằng DLL trong thư mục/bin để kiểm tra các tính năng mới trước khi chúng được phát hành không?

Trả lời

78

Nếu nó có cùng số phiên bản với DLL được tham chiếu, GAC sẽ được sử dụng.

Nếu bạn tăng số phiên bản, hãy tạo lại trang web tham chiếu số phiên bản mới, đặt phiên bản mới vào thư mục/bin, khi đó DLL đó sẽ được sử dụng.

Nếu bạn không muốn thay đổi số phiên bản, bạn hoàn toàn không may mắn.

Khi .NET tải tập hợp được đặt tên mạnh, trước tiên, nó cố gắng quyết định số phiên bản nào sẽ sử dụng. Nó thực hiện điều này thông qua tham chiếu đầu tiên, sau đó tìm kiếm publisher policies, sau đó tìm kiếm binding redirects trong tệp cấu hình.

Sau khi thực hiện điều này, nó tìm kiếm hội đồng trong GAC, sau đó trong bất kỳ codebase specified, sau đó nó thăm dò các thư mục hệ thống tệp khác nhau cho DLL. Nếu tại bất kỳ một trong những bước đó, nó tìm thấy phiên bản đúng, nó dừng lại.

Nếu bạn không thay đổi số phiên bản của hội đồng được đặt tên mạnh, .NET sẽ tìm thấy phiên bản gốc trong GAC và ngừng tìm kiếm. Lưu ý rằng vì nó dừng lại khi nó tìm thấy một, và bởi vì tìm kiếm trong GAC là đầu tiên, xác định một codebase cho assembly của bạn sẽ làm không tốt trừ khi bạn cũng chỉ định một số phiên bản mới.

+1

Tôi có hiểu điều này đúng không? Nếu phiên bản 1.0.0.0 nằm trong GAC nhưng tôi biên dịch với phiên bản 1.0.0.1 và đặt 1.0.0.1 trong BIN của tôi, thì GAC bị bỏ qua và BIN được sử dụng.Nếu tôi loại bỏ các .dll từ BIN của tôi sau đó 1.0.0.0 trong GAC sẽ được sử dụng ngay cả khi tôi biên dịch với 1.0.0.1? –

+1

No. Nếu bạn biên dịch dựa vào một hội đồng được đặt tên mạnh, nó sẽ yêu cầu số phiên bản chính xác, trừ khi có chính sách của nhà xuất bản hoặc chuyển hướng ràng buộc có sẵn. –

+1

Chính sách của nhà xuất bản và chuyển hướng ràng buộc cho phép chuyển hướng phiên bản #, vì vậy nếu chương trình của bạn được biên dịch với phiên bản 1.0.0.0 và có chính sách chuyển hướng hoặc nhà xuất bản ràng buộc chỉ định 1.0.0.1 thì phiên bản đó sẽ trở thành phiên bản của nó. –

2

Tôi nghĩ rằng tôi có thể nói cùng suy nghĩ giống như Adam Sills, nhưng lại diễn đạt nó vì sự hiểu biết của tôi. Thông qua thử nghiệm của riêng tôi, có vẻ như đây là những gì sẽ xảy ra:

  • Nếu ứng dụng của bạn được biên dịch với phiên bản 1.0.0.0 và 1.0.0.1 nằm trong GAC, thì bạn có thể bỏ qua .dll từ/bin.
  • Nếu ứng dụng của bạn được biên dịch với phiên bản 1.0.0.1 và 1.0.0.0 nằm trong GAC, thì bạn PHẢI đặt .dll trong/bin của bạn để bỏ qua GAC. Một lỗi sẽ xảy ra nếu phiên bản GAC cũ hơn phiên bản yêu cầu của ứng dụng, trừ khi bạn đưa phiên bản mới hơn vào/bin của mình.

Tôi hy vọng điều này là đúng ...

+1

.NET Framework sẽ * không * chuyển hướng phiên bản của các hội đồng được đặt tên mạnh tự động, ít nhất là .NET 3.5 (thời gian chạy .NET 2.0). Về mặt lý thuyết, .NET 4 có thể thay đổi các quy tắc, nhưng tôi nghi ngờ nó. –

+1

Cảm ơn! Bây giờ tôi thấy lý do tại sao các thử nghiệm của tôi hoạt động với các phiên bản khác nhau. Tôi nghĩ tên mạnh là chìa khóa bạn đăng ký. Nhưng tôi thực sự có hai hội đồng đăng ký trong GAC 1.0.0.0 và 1.0.0.1 cả hai với cùng một mã thông báo khóa công khai. Tôi nghĩ rằng nếu tôi sử dụng cùng một khóa, 1.0.0.1 sẽ thay thế 1.0.0.0. Nhưng đó không phải là trường hợp.
Cảm ơn bạn @Adam vì đã giúp bạn! –

0

Bạn có thể xem thông tin ràng buộc trong file log bằng cách sử dụng hội Binding Log Viewer (Fuslogvw.exe), được bao gồm trong Windows Software Development Kit (SDK).

s

11

tôi đã có thể ghi đè lên GAC với lắp ráp trong thư mục \ bin sử dụng <codebase> Element.

Bằng cách chỉ định <codebase version="1.2.3.4" href="/bin/MyAssembly.dll" /> trong tệp web.config của tôi, tôi có thể yêu cầu ứng dụng của tôi sử dụng phiên bản này thay vì phiên bản được chỉ định trong GAC.

Bạn cũng có thể muốn xem phần tử <probing> để chỉ định vị trí lắp ráp?

+5

bạn nên kiểm tra kỹ xem bài viết của bạn có được ký hay không. GAC được ưu tiên hơn so với codebase và thăm dò. Một khi nó tìm thấy phiên bản đã ký trong GAC nó dừng lại. Tôi đã thử nghiệm điều này với 4.0 và tài liệu MSDN là chính xác, đầu tiên BindingRedirect, sau đó GAC, sau đó CodeBase, sau đó thăm dò cho StrongName hội đồng – CodeCowboyOrg