2010-03-22 37 views
25

Tôi biết rằng có 3 bối cảnh ràng buộc khác nhau hoặc bối cảnh tải:3 loại bối cảnh ràng buộc là gì?

Load 
LoadFrom 
LoadNeither 
  1. bối cảnh tải là gì?
  2. Chúng là gì?
  3. Tại sao việc lắp ráp tải quá phức tạp?
  4. Trong "LoadNeither", "không phải" của cái gì?

Cảm ơn trước ...

--------------- Sau đây là một số trích dẫn hữu ích Gần đây tôi đã tìm thấy ----------- ---------

Hiểu được bối cảnh

Không có bài viết trên Binder là hoàn toàn không giải quyết bối cảnh bộ nạp và lý do cho sự tồn tại của họ. Các bối cảnh của trình tải thường là nguồn gây nhầm lẫn. Hãy nghĩ về ngữ cảnh của trình tải như các thùng logic trong một miền ứng dụng chứa các assembly. Tùy thuộc vào cách các hội đồng đang được nạp, chúng rơi vào một trong ba ngữ cảnh của trình tải. Để đơn giản, tất cả các assembly có mặt trong GAC, hoặc trong ApplicationBase, hoặc trong PrivateBinPath bên dưới ApplicationBase, được nạp bằng Assembly.Load sẽ được tải trong ngữ cảnh Load (Tải ngữ cảnh). . Các hội đồng được giải quyết bằng sự kiện AssemblyResolve cũng nằm trong thể loại này.

LoadFrom context Nếu bạn đang cố tải một assembly bằng cách cung cấp một đường dẫn cụ thể nằm ngoài ApplicationBase, và assembly sẽ không được tìm thấy trong ngữ cảnh Load, thì assembly được nạp trong ngữ cảnh LoadFrom.

Không bối cảnh nào Nếu bạn đang cố tải một assembly bằng Assembly.LoadFile(), Assembly.Load (byte []), hoặc Reflection.Emit, các assembly đó được nạp vào trong bối cảnh Không.

Trong trường hợp các assembly được nạp vào ngữ cảnh LoadFrom, trước tiên Binder kiểm tra xem assembly chính xác (cùng một định danh và vị trí) đã có mặt trong ngữ cảnh Load hay chưa. Nếu có, nó loại bỏ thông tin assembly trong ngữ cảnh LoadFrom và sử dụng thông tin assembly từ ngữ cảnh Load. Để xác định xem đó có phải là cùng một hội đồng hay không, thông tin vị trí là quan trọng và chúng tôi sẽ trình bày điều này ngay. Trong .NET Framework 1.1, điều này được gọi là liên kết thứ hai của LoadFrom, vì Binder được sử dụng để thực hiện hai bước - đầu tiên để đặt assembly trong ngữ cảnh LoadFrom, và sau đó đẩy nó vào ngữ cảnh Load nếu nó tìm thấy một danh tính assembly phù hợp và vị trí trong ngữ cảnh Tải.

Đảm bảo rằng lắp ráp được tải vào ngữ cảnh Tải nhiều nhất có thể. Đối với điều này, hội đồng phải được định vị từ GAC, ApplicationBase hoặc PrivateBinPath của AppDomain. Các hội đồng được nạp vào bối cảnh này sẽ tự động nhận được các lợi ích của NGen và các phụ thuộc của hội đồng có mặt trong bối cảnh này được tự động chọn.

Việc tải các assembly vào ngữ cảnh LoadFrom có ​​những ưu điểm riêng của nó — nó cho phép nhiều assembly bên ngoài ApplicationBase được nạp bằng cách chỉ định đường dẫn của chúng.

Bây giờ, hãy nói về vị trí lắp ráp, trong khi xác định xem lắp ráp được nạp thông qua LoadFrom() có giống với Assembly được nạp thông qua Load() hay không. Ngay cả khi các kiểu trong hai assembly giống hệt nhau, nếu hai assembly được nạp từ các đường khác nhau, chúng không được coi là giống hệt như các bối cảnh của trình tải có liên quan. Điều này dẫn đến các tình huống mà cùng một assembly được nạp liên tục trong cùng một miền ứng dụng, nhưng trong các ngữ cảnh khác nhau (Load và LoadFrom) và một loại trong assembly trong ngữ cảnh Load sẽ không được cho phép cùng loại trong ngữ cảnh LoadFrom (ngay cả khi họ là những hội đồng tương tự như xa như các bản sắc lắp ráp có liên quan). Đây là một trong những nhược điểm của LoadFrom. Ngoài ra, các assembly trong ngữ cảnh LoadFrom không tự động gặt hái những lợi ích của NGen.

Đối với bối cảnh Không, các hội đồng trong ngữ cảnh này không thể bị ràng buộc, trừ khi ứng dụng đăng ký sự kiện AssemblyResolve. Bối cảnh này nói chung nên tránh.

Vậy tại sao CLR có trình nạp ngữ cảnh ở vị trí đầu tiên? Các bối cảnh của trình tải giúp đảm bảo tính độc lập tải trong khi tải các hội đồng. Ngoài ra, chúng cung cấp một thước đo cách ly cho các hội đồng và các phụ thuộc của chúng khi chúng được nạp vào các ngữ cảnh khác nhau.

- Từ Understanding The CLR Binder

+0

Tôi không biết tại sao tôi không thể nhìn thấy tín hiệu đánh dấu ở phía bên trái của câu trả lời. – smwikipedia

+2

câu hỏi hay và tóm tắt các trích dẫn tốt. tuy nhiên, tôi vẫn cảm thấy bối rối về bối cảnh tải. –

+1

@AndrewGarrison Thực ra, tôi lại bối rối một lần nữa. Microsoft có thể làm cho mọi thứ đơn giản hơn một chút không? – smwikipedia

Trả lời

15

Có lẽ chỉ có một vài người có thể trả lời "tại sao" một phần của câu hỏi. Các ngữ cảnh tải chủ yếu liên quan đến cách các phụ thuộc bị ràng buộc. Sự hiểu biết của tôi là:

  • Load, tải lắp ráp vào AppDomain bằng cách sử dụng vị trí "truyền thống" và phương pháp ràng buộc. Việc lắp ráp được nạp có thể được sử dụng như một phụ thuộc cho các hội đồng tiếp theo được nạp trong ngữ cảnh Load.
  • LoadFrom, tải lắp ráp vào các phụ kiện AppDomain tìm phụ thuộc như Load nhưng có một sự khác biệt: các cụm này sẽ không được sử dụng để giải quyết phụ thuộc của Load cụm ngữ cảnh.
  • LoadNeither chỉ tải một bản. Nếu nó có các phụ thuộc chưa được giải quyết, bạn sẽ cần tự giải quyết chúng thông qua sự kiện AssemblyResolve.

Đây là một blog tuyệt vời về nó: http://blogs.msdn.com/suzcook/archive/2003/05/29/57143.aspx

+0

Cảm ơn bạn đã trả lời. Tôi có thêm một câu hỏi: khi tôi thêm một tham chiếu lắp ráp trong VisualStudio thông qua trình đơn ngữ cảnh "thêm tài liệu tham khảo", ngữ cảnh nào được tham chiếu trong? Cảm ơn một lần nữa. – smwikipedia

+0

'Tải', tôi tin. –

+1

Không có kết nối trực tiếp. Nhưng Add Reference thường đặt thuộc tính Copy Local thành True để một bản sao của assembly được đặt trong thư mục build project. Điều này cho phép CLR dễ dàng tìm thấy nó vì nó là đường dẫn thăm dò mặc định. Tải. –

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