AppDomain là gì?


118

AppDomain là gì? Những lợi ích của AppDomains là gì hoặc tại sao Microsoft mang khái niệm về AppDomains, vấn đề gì không có AppDomain?

Vui lòng xây dựng.

+4

http://stackoverflow.com/questions/665668/usage-of-appdomain-in-c Thật thú vị khi được trả lời bởi cùng một người! 17 mar. 102010-03-17 22:04:18

  0

Một lưu ý bổ sung, lớp ApplicationManager nằm trên đầu trang của TẤT CẢ chạy AppDomains. 08 jan. 112011-01-08 18:14:35

  0

http://stackoverflow.com/a/41410172/993672 trả lời ở đây 01 jan. 172017-01-01 15:28:43

104

An AppDomain cung cấp một lớp cách ly trong một quy trình. Tất cả mọi thứ bạn thường nghĩ là "mỗi chương trình" (biến tĩnh, vv) thực sự là trên mỗi AppDomain. Đây là hữu ích cho:

  • plugins (bạn có thể dỡ bỏ một AppDomain, nhưng không phải là lắp ráp trong một AppDomain)
  • an ninh (bạn có thể chạy một bộ mã có mức tín nhiệm cụ thể)
  • cách ly (bạn có thể chạy các phiên bản khác nhau của hội vv)

Cơn đau là bạn cần phải sử dụng remoting, vv

See MSDN để biết thêm thông tin. Thành thật mà nói, nó không phải là một cái gì đó bạn cần phải mess với rất thường xuyên.

+11

Một chút (nhưng quan trọng) điều đề cập đến: AppDomains không bao gồm chủ đề. 22 feb. 092009-02-22 13:04:38

  0

@ RüdigerStevens bạn có ý gì? 30 sep. 152015-09-30 11:53:03

+5

@AgentFire: Nếu một số mã đang chạy trong một số chuỗi và một số mã AppDomain gọi từ một AppDomain khác, thì chuỗi "vượt qua" biên giới AppDomain và chạy mã từ AppDomain khác đó. Vì vậy, chủ đề không thuộc về AppDomains cụ thể ... mặc dù người ta có thể nói rằng một sợi "thuộc" vào tên miền mà mã đã tạo ra nó. Nhưng một chuỗi có thể chạy mã từ bất kỳ AppDomain nào. 02 oct. 152015-10-02 16:04:46

  0

@ RüdigerStevens thực sự là một lợi thế. 02 oct. 152015-10-02 18:37:20

+2

Như @Marc chỉ ra, suy nghĩ về một AppDomain như là một lớp phụ cô lập là một ý tưởng tốt. Tôi muốn đưa điều này vào một bối cảnh: [Process> CLR> AppDomain> Assembly with statics> Thread with stack]. Điều đó có nghĩa là một tiến trình lưu trữ một Runtime Language (CLR) chung. CLR có một hoặc nhiều AppDomain. Mỗi AppDomain tải một hoặc nhiều assembly. Mỗi assembly có các varibales tĩnh riêng và một hoặc nhiều luồng. Mỗi luồng có ngăn xếp riêng. 05 jul. 162016-07-05 23:31:06

  0

tôi đoán, nó sẽ là một sự rò rỉ trừu tượng, nếu chủ đề không bối cảnh bất khả tri như thế này. Ngoài ra, nếu bạn xem luồng như một số máy đi qua luồng điều khiển, các lệnh thực thi serially dọc theo dòng, bạn sẽ thấy nó không quan tâm nơi chuỗi lệnh này sẽ dẫn anh ta đến đâu, có thể là cùng một miền mà nó bắt đầu trong hoặc khác. tất cả các lệnh trông giống nhau và được xử lý tương tự, bất cứ nơi nào chúng nằm "vật lý". khái niệm xuất xứ của lệnh là trực giao với chủ đề i và làm gì trong thế giới một chiều của nó. heh. 01 aug. 172017-08-01 06:46:59


31

AppDomains có thể được xem dưới dạng quy trình nhẹ. Chúng chia sẻ nhiều đặc điểm giống nhau của một quy trình, ví dụ: họ có bản sao riêng của họ về các hệ thống thống kê, hội đồng và vv, nhưng chúng được chứa trong một quá trình duy nhất. Từ quan điểm của hệ điều hành, một quá trình chỉ là một quá trình cho dù có bao nhiêu AppDomain có thể chứa.

Không giống như quy trình, AppDomain không có bất kỳ chủ đề nào trừ khi bạn tạo chúng một cách rõ ràng. Một chuỗi có thể chạy mã trong bất kỳ AppDomain nào.

AppDomains là một phần của cùng một quá trình và do đó thực sự chia sẻ cùng một vùng được quản lý. Điều này thường không phải là một vấn đề vì mô hình lập trình AppDomain ngăn chặn truy cập ngầm giữa các miền AppDomain. Tuy nhiên, một số tham chiếu thực sự được chia sẻ giữa các miền AppDomain chẳng hạn như các đối tượng kiểu và chuỗi nội bộ.

  0

Chỉ một ghi chú. Chuỗi nội bộ dường như không được chia sẻ trên các AppDomain khác nhau 16 dec. 142014-12-16 08:40:57


41

Miền ứng dụng triển khai khái niệm về không gian bộ nhớ ảo liền kề giữ mã và tài nguyên trong bộ nhớ có thể truy cập trực tiếp hoặc tham chiếu.

Các miền AppDomain riêng biệt không chia sẻ dung lượng bộ nhớ và do đó, một AppDomain không thể trực tiếp tham chiếu nội dung trong một miền khác. Cụ thể, dữ liệu phải được chuyển giữa các miền AppDomain thông qua quá trình sao chép theo giá trị. Đặc biệt, các đối tượng tham chiếu, dựa vào các con trỏ và do đó các địa chỉ bộ nhớ, trước tiên phải được tuần tự hóa từ nguồn và sau đó deserialization vào đích AppDomain.

Trước đây trên các hệ thống Windows, ranh giới bộ nhớ đã được thực hiện bởi các quy trình; tuy nhiên, quá trình xây dựng là tài nguyên chuyên sâu. Họ cũng phục vụ một mục đích kép như ranh giới thread. Mặt khác, các miền ứng dụng chỉ liên quan đến ranh giới bộ nhớ hoặc không gian địa chỉ. Chủ đề có thể 'chảy' trên AppDomains (có nghĩa là, một thủ tục có thể gọi một điểm vào trong một AppDomain khác và chờ cho nó trở về. Chủ đề được gọi là 'tiếp tục' thực hiện trong AppDomain khác). Một lợi ích đáng kể của kiến ​​trúc này là các mẫu giao tiếp giữa các miền ứng dụng vẫn không thay đổi đáng kể cho dù các AppDomain đang ở trong cùng một quy trình, các quy trình khác nhau hoặc trên một máy khác nhau: cụ thể là quá trình serialization và deserialization (marshaling) của dữ liệu tham số.Lưu ý 1: ý nghĩa của một thread vượt qua một AppDomain là của một cuộc gọi chặn hoặc đồng bộ vào một AppDomain khác (so với một cuộc gọi không chặn hoặc không đồng bộ mà sẽ sinh ra một thread để tiếp tục thực hiện trong AppDomain đích và tiếp tục trong AppDomain hiện tại mà không phải chờ phản hồi).

Lưu ý 2: có một thứ như Lưu trữ cục bộ của chủ đề. Tuy nhiên, một tên tốt hơn sẽ là App-Domain Thread Local Storage vì các chủ đề để lại dữ liệu của chúng sau khi chúng vượt qua App-Domains nhưng chọn chúng sao lưu khi chúng quay trở lại: http://msdn.microsoft.com/en-us/library/6sby1byh.aspx

Note3: A Net Runtime là một tiến trình Windows ứng dụng với một đống liên kết. Nó có thể lưu trữ một hoặc nhiều AppDomain trong heap đó. Tuy nhiên, AppDomains được thiết kế để không biết gì về nhau và giao tiếp với nhau thông qua marshaling. Có thể hiểu rằng một tối ưu hóa có thể được thực hiện mà bỏ qua việc marshaling giữa giao tiếp AppDomains chia sẻ cùng một .Net Runtime và do đó cùng một Windows Process heap.

  0

Vâng, tôi đã nhầm lẫn giữa tuyên bố của bạn ** Riêng biệt AppDomains không chia sẻ không gian bộ nhớ ** và @Brian Rasmussen ** AppDomains là một phần của quá trình tương tự và do đó thực sự chia sẻ cùng một vùng được quản lý **. Bạn có thể làm rõ một chút được không? 18 aug. 162016-08-18 02:39:12

  0

Khi AppDomains là một phần của cùng một tiến trình Windows (và do đó trong cùng một cá thể .Net thời gian chạy), chúng nhất thiết sẽ nằm trong cùng một vùng được quản lý của Windows Process; tuy nhiên, tình huống này thường sẽ không nhìn thấy được đối với ứng dụng .Net. Hãy nhớ rằng, ứng dụng .Net không phải là một ứng dụng Windows Process và thực sự chạy trong một loại máy ảo. 18 aug. 162016-08-18 07:19:05