Câu hỏi Tôi không hiểu Miền ứng dụng


.NET có khái niệm về Miền ứng dụng mà từ những gì tôi hiểu có thể được sử dụng để tải một assembly vào bộ nhớ. Tôi đã thực hiện một số nghiên cứu về Miền ứng dụng cũng như đi đến cửa hàng sách địa phương của tôi để biết thêm một số kiến ​​thức về vấn đề này nhưng dường như rất khan hiếm.

Tất cả những gì tôi biết rằng tôi có thể làm với Application Domains là tải các assembly trong bộ nhớ và tôi có thể dỡ bỏ chúng khi tôi muốn.

Các khả năng khác mà tôi đã đề cập đến trong Miền ứng dụng là gì? Chủ đề có tôn trọng ranh giới miền ứng dụng không? Có bất kỳ hạn chế nào khi tải Assemblies trong các Miền ứng dụng khác với miền ứng dụng chính ngoài hiệu năng truyền thông không?

Các liên kết đến các tài nguyên thảo luận về Miền ứng dụng cũng sẽ tốt đẹp. Tôi đã kiểm tra MSDN mà không có nhiều thông tin về họ.


76
2018-03-07 21:11


gốc




Các câu trả lời:


AppDomains được hiển thị tốt nhất dưới dạng quá trình trọng lượng rất nhẹ.

Có thể có N AppDomains cho mỗi. Net Process nhưng nói chung chỉ có một. Lợi thế thực sự của AppDomain là chúng cung cấp một ranh giới cách ly trong quá trình của bạn. Các đối tượng chỉ có thể nói chuyện với nhau qua một ranh giới AppDomain thông qua remoting hoặc serialization.

Nó cũng có thể chạy 2 AppDomains ở mức độ bảo mật hoàn toàn khác nhau trong một quá trình. Điều này có thể cho phép bạn chạy ứng dụng chính của mình tại Full Trust trong khi chạy các Plugin không tin cậy ở mức độ tin cậy thấp hơn nhiều.

Thật khó để nói rằng có hoặc không có hay không một chủ đề tôn trọng một AppDomain. Có thể cho một chuỗi duy nhất nằm trong N AppDomain khác nhau. Một tình huống như vậy là có thể nếu một đối tượng trong một AppDomain thực hiện một cuộc gọi từ xa đến một đối tượng trong một AppDomain khác. Chuỗi sẽ phải chuyển đổi giữa các miền AppDomain để hoàn thành.

Những bất lợi của AppDomains là chủ yếu là phức tạp. Từ xa có thể mất một chút thời gian để có được đầu của bạn xung quanh và thiết lập đúng một AppDomain có thể là một quá trình không tầm thường.

Bạn có thể muốn xem qua tài liệu MSDN trên AppDomains. Thật khó để tìm thấy một hướng dẫn succint mô tả chúng bởi vì chúng có nhiều tính năng phức tạp. Điều này cung cấp một cái nhìn tổng quan tốt đẹp mà nếu nó không trả lời câu hỏi của bạn trực tiếp sẽ ít nhất là điểm bạn vào đúng nơi.

http://msdn.microsoft.com/en-us/library/cxk374d9.aspx

Tài liệu này không còn được duy trì, vui lòng tham khảo điều này cho phiên bản cập nhật: https://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.110).aspx


98
2018-03-07 21:18



Mối quan tâm chính là tôi không hiểu capabilties tôi nhận được bằng cách sử dụng chúng. Tôi đọc rằng họ là một quá trình nhẹ nhưng họ dường như mang theo nhiều hơn chỉ và tôi có thể thiếu một cái gì đó mà có thể cắn tôi sau này. IE Tôi đang lấy ra nhiều hơn tôi cần. - Jeremy Edwards


Câu trả lời của JaredPar là tốt, ngoại trừ anh ta không chú ý raison d'etre cho AppDomains - đó là bạn chỉ có thể UNLOAD một Assembly bằng cách dỡ bỏ AppDomain của nó. Nếu bạn là một quá trình hệ điều hành dài, và bạn mong đợi phải tải và sau đó dỡ hàng hội đồng cho bất cứ lý do gì thì bạn cần một AppDomain. Ví dụ nguyên mẫu ở đây là ASP.NET, tải các gói mã ứng dụng theo yêu cầu và sau đó có thể giải nén chúng sau này, khi các ứng dụng không còn được sử dụng tích cực nữa.

Chi phí bạn trả cho khả năng dỡ bỏ là độc lập - bạn cần giao tiếp qua ranh giới AppDomain, Không thể thực hiện cuộc gọi phương thức đơn giản. Bạn cần quản lý vòng đời AppDomain. Vv

Nếu bạn chỉ cần tải động Assemblies và không nghĩ rằng bạn sẽ cần phải dỡ chúng trong suốt quá trình của một quá trình sau đó bạn có thể không cần chạy nhiều AppDomain. Một ví dụ điển hình ở đây có thể là một ứng dụng phong phú hỗ trợ một mô hình trình cắm thêm, nơi nó tìm ra các hội đồng trình cắm thêm trong thư mục "v.v" và tải chúng lên. Tuy nhiên, nếu mô hình trình cắm thêm yêu cầu dỡ tải các trình cắm thêm ... tốt.

Có những trường hợp ngoại lệ. Giống như, giả sử bạn muốn tải 2 phiên bản khác nhau của một hội đồng cùng một lúc. Bạn có thể gặp phải những cạm bẫy nếu bạn không tách biệt chúng với AppDomains. Nhưng điều đó sẽ khá hiếm.

Kịch bản cốt lõi mà biện minh cho sự tồn tại của AppDomains là quá trình chạy dài mà phải có khả năng dỡ bỏ các assembly.

Tất nhiên, các ứng dụng có thể dựa vào quá trình hệ điều hành khi bạn muốn dỡ bỏ một assembly. Nói cách khác, bạn có thể có 3 hoặc 4 quá trình hợp tác đang chạy, mỗi tiến trình có tập hợp Assemblies của riêng nó và khi bạn muốn dỡ bỏ một assembly, chỉ cần tắt quá trình lưu trữ assembly đó. Nhưng AppDomain cung cấp một cơ chế cao cấp hơn để làm điều đó, mà không yêu cầu quá trình dừng / bắt đầu hoặc xử lý chéo, mà vẫn còn nặng hơn so với cross-AppDomain comms được mô tả trước đây. Tôi có nghĩa là nó vẫn còn remoting nhưng nó là chậm hơn và bối cảnh nhiều hơn chuyển đổi.


90
2018-03-07 23:03



Tại sao sử dụng một từ nếu bạn cảm thấy bạn phải xác định nó? - BlueRaja - Danny Pflughoeft
Bởi vì thật thú vị khi sử dụng các từ tiếng Pháp trong câu trả lời cho các câu hỏi khoa học máy tính. - Cheeso
@ BlueRaja-DannyPflughoeft và nó giúp giáo dục những người có thể không quen thuộc với những gì là một thuật ngữ nước ngoài thường được sử dụng mà hoàn toàn đóng gói một ý tưởng đó là nhiều hơn nữa vụng về được xác định bằng tiếng Anh. - Sam Holder
@SamHolder Bài báo Wikipedia được liên kết nói rằng bản dịch tiếng Anh là "lý do cho sự tồn tại". Điều đó không có vẻ quá vụng về được định nghĩa với tôi. - Bognar
Đối với tiền của tôi, đây là câu trả lời tốt nhất, bởi vì "raison d'etre" không được ghi rõ ở bất cứ đâu trên MSDN, theo như tôi có thể tìm thấy. - Dan Ling


Một số điều bạn có thể làm với AppDomains:

  • bạn có thể tắt nó mà không gây nguy hiểm cho chương trình của bạn.
  • Bạn có thể tải mã và cung cấp ít đặc quyền này hơn quy trình của riêng bạn (ví dụ: quy trình của bạn chạy hoàn toàn đáng tin cậy nhưng bạn tải mã trong một AppDomain riêng biệt thậm chí không thể tạo tệp trên đĩa.)
  • Bạn có thể xử lý các ngoại lệ chưa được xử lý của một AppDomain mà không phải làm hỏng quá trình của bạn.
  • Vv

Nói một cách đơn giản, đó là ranh giới an ninh và toàn bộ ranh giới của quy trình. Theo như hiệu suất đi, nhiều AppDomains trong một quá trình không đại diện cho chi phí đáng kể. Việc khởi chạy một quá trình riêng biệt thay vì một AppDomain sẽ tốn kém hơn rất nhiều.


27
2018-03-07 21:46