Tôi không hiểu Miền ứng dụng


80

.NET có khái niệm Miền ứng dụng mà từ những gì tôi hiểu có thể được sử dụng để tải một hợp ngữ vào bộ nhớ. Tôi đã thực hiện một số nghiên cứu về Tên miền ứng dụng cũng như đến cửa hàng sách địa phương của mình để có thêm một số kiến ​​thức về chủ đề này nhưng nó có vẻ 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 Tên miền ứng dụng là tải các tập hợp vào 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 của 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 các Cụm từ trong các Miền ứng dụng khác với các Miền ứng dụng chính ngoài hiệu suất giao tiếp không?

Liên kết đến các tài nguyên thảo luận về Miền ứng dụng cũng sẽ rất tốt. Tôi đã kiểm tra MSDN mà không có nhiều thông tin về chúng.

Câu trả lời:


100

AppDomains được hình dung tốt nhất là một quá trình có trọng lượng rất nhẹ.

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

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

Thật khó để nói có hay không đối với việc một chuỗi có tôn trọng AppDomain hay không. Có thể một luồng duy nhất nằm trong N AppDomains khác nhau. Tình huống như vậy có thể xảy ra nếu một đối tượng trong một AppDomain thực hiện cuộc gọi từ xa đến một đối tượng trong một AppDomain khác. Luồng sẽ phải chuyển đổi giữa các AppDomains để hoàn thành.

Nhược điểm của AppDomains chủ yếu là sự phức tạp. Việc khởi động lại có thể mất một chút thời gian để giúp bạn hoàn thiện và thiết lập đúng cách một AppDomain có thể là một quá trình không hề nhỏ.

Bạn có thể muốn xem qua tài liệu MSDN trên AppDomains. Thật khó để tìm một hướng dẫn thành công mô tả chúng 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 trực tiếp câu hỏi của bạn thì ít nhất sẽ đưa bạn đến đúng chỗ.

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 tài liệu này để biết phiên bản cập nhật: https://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.110).aspx


4
Mối quan tâm chính là tôi không hiểu khả năng tôi nhận được khi sử dụng chúng. Tôi đọc rằng chúng là một quy trình nhẹ nhưng chúng dường như mang lại nhiều hơn thế và tôi có thể thiếu thứ gì đó 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

92

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

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

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

Có những tình huống vượt trội hơn. Giống như, giả sử bạn muốn tải 2 phiên bản khác nhau của Assembly cùng một lúc. Bạn có thể gặp phải những cạm bẫy nếu 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 biện minh cho sự tồn tại của AppDomains là quá trình chạy lâu dài phải có khả năng dỡ bỏ các tập hợp.

Tất nhiên, các ứng dụng có thể dựa vào quy trình hệ điều hành khi bạn muốn dỡ bỏ một lắp ráp. Nói cách khác, bạn có thể có 3 hoặc 4 quy trình hợp tác đang chạy, mỗi quy trình có một tập hợp các Cụm lắp ráp riêng và khi bạn muốn dỡ bỏ một lắp ráp, chỉ cần tắt quá trình lưu trữ lắp ráp đó. Nhưng AppDomain cung cấp một cơ chế hiệu suất cao hơn để làm điều đó, mà không yêu cầu dừng / bắt đầu quá trình hoặc kết hợp giữa các quá trình, vẫn nặng hơn so với các ứng dụng liên kết giữa AppDomain được mô tả trước đây. Ý tôi là nó vẫn đang hối hận nhưng chuyển đổi ngữ cảnh chậm hơn và nhiều hơn.


17
Tại sao lại sử dụng một từ nếu bạn cảm thấy phải định nghĩa nó?
BlueRaja - Danny Pflughoeft

44
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 về khoa học máy tính.
Cheeso

13
@ BlueRaja-DannyPflughoeft và nó giúp giáo dục những người có thể không quen với thuật ngữ nước ngoài thường được sử dụng là gì, nó gói gọn một cách hoàn hảo một ý tưởng được định nghĩa vụng về hơn nhiều bằng tiếng Anh.
Sam Holder

6
@SamHolder Bài báo được liên kết trên Wikipedia cho biết bản dịch tiếng Anh là "lý do tồn tại". Điều đó dường như không quá vụng về với tôi.
Bognar

5
Đố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 nêu rõ ràng ở bất kỳ đâu trên MSDN, theo như tôi có thể tìm thấy.
Dan Ling

27

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 sự ổn định của chương trình của bạn.
  • Bạn có thể tải mã và cấp cho quy trình của riêng bạn ít đặc quyền hơ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 trường hợp ngoại lệ của AppDomain mà không cần phải làm hỏng quy trình của mình.
  • Vân vân.

Nói một cách đơn giản, đó là một ranh giới bảo mật và hầu hết là một ranh giới quy trình. Về hiệu suất, nhiều AppDomains trong một quy trình không thể hiện chi phí đáng kể. Khởi chạy một quy trình riêng biệt thay vì một AppDomain tốn kém hơn nhiều.

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.