2009-03-07 31 views
76

.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 lắp ráp 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ôi không hiểu Tên miền ứng dụng

Tất cả những gì tôi biết rằng tôi có thể thực hiện với Miền ứng dụng là tải các hội đồng trong bộ nhớ và tôi có thể giải phóng 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?

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ọ.

Trả lời

97

AppDomain đượ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 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 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.

Cũng có thể chạy 2 AppDomain ở các mức 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 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 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 này cho 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 các 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. –

27

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

  • bạn có thể tắt nó xuống 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 AppDomain mà không phải làm hỏng quy trình của bạn.
  • Vv

Nói một cách đơn giản, đó là ranh giới bảo mật và toàn bộ ranh giới 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.

90

Câu trả lời của JaredPar là tốt, ngoại trừ anh ta không lưu ý 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ỡ bỏ hội đồng vì bất kỳ lý do gì thì bạn cần có 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 tải 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ự động tải Assemblies và không nghĩ rằng bạn sẽ cần phải dỡ bỏ chúng trong cuộc đời của một quá trình duy nhất thì có thể bạn không cần phải 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ộ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ó các 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 để 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 hội đồng.

Tất nhiên, các ứng dụng có thể dựa vào quy trình của hệ điều hành khi bạn muốn dỡ một hội đồng. 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.

+17

Tại sao sử dụng một từ nếu bạn cảm thấy bạn phải xác định từ đó? –

+43

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

+12

@ 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. –

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