Miền ứng dụng .NET là gì?


83

Đặc biệt, những tác động của việc chạy mã trong hai miền ứng dụng khác nhau là gì?

Dữ liệu thường được truyền qua ranh giới miền ứng dụng như thế nào? Nó có giống với việc truyền dữ liệu qua ranh giới quy trình không? Tôi tò mò muốn biết thêm về sự trừu tượng này và nó hữu ích cho việc gì.

CHỈNH SỬA: Phạm vi hiện có tốt của lớp AppDomain nói chung tại Tôi không hiểu Miền ứng dụng


3
Phần đầu tiên là bản sao của stackoverflow.com/questions/622516/i-dont-und hieu-appdomains . Có lẽ câu hỏi nên được chỉnh sửa để chuyển dữ liệu.
John Saunders,

Rất tiếc, bỏ lỡ điều đó. Điều này có thể được đóng lại.
Luke

Câu trả lời:


78

Một AppDomain về cơ bản cung cấp một khu vực bị cô lập trong đó mã chạy bên trong của một quá trình.

Một cách dễ hiểu về nó gần giống như một quy trình nhẹ hơn nằm bên trong quy trình chính của bạn. Mỗi AppDomain tồn tại trong một quy trình hoàn toàn biệt lập, cho phép bạn chạy mã một cách an toàn (nó có thể được tải xuống mà không làm hỏng toàn bộ quy trình nếu cần), với bảo mật riêng biệt, v.v.

Về chi tiết cụ thể của bạn - nếu bạn chạy mã trong 2 AppDomains khác nhau trong một quy trình, mã sẽ chạy riêng lẻ. Mọi giao tiếp giữa các AppDomains sẽ được tuần tự hóa hoặc xử lý thông qua MarshallByRefObject. Nó hoạt động rất giống như sử dụng sự hối hận trong vấn đề này. Điều này cung cấp một lượng lớn bảo mật - bạn có thể chạy mã mà bạn không tin tưởng, và nếu nó làm sai, nó sẽ không ảnh hưởng đến bạn.

Có nhiều chi tiết khác trong mô tả của MSDN về Miền ứng dụng .


Bạn có thể làm rõ những gì bạn có nghĩa là "nếu nó làm điều gì đó sai"?
Luke

11
Một ví dụ: Nếu bạn có một chuỗi chưa được xử lý trong một nhóm luồng, nó sẽ chia nhỏ miền ứng dụng. Thông thường, điều này sẽ giết quá trình của bạn - điều này rất nguy hiểm nếu bạn đang tải mã người dùng hoặc một plugin. Chạy trong một miền ứng dụng riêng biệt có nghĩa là bạn có thể xử lý điều đó tốt hơn nhiều - nếu AppDomain thứ hai phải bị chia nhỏ, bạn có thể xử lý điều đó mà không làm hỏng quy trình của mình.
Reed Copsey, 07/07/09

20

Nó là một lớp cách ly được cung cấp bởi .NET runtime. Do đó, miền ứng dụng tồn tại trong một quy trình (1 quy trình có thể có nhiều miền ứng dụng) và có không gian địa chỉ ảo của riêng chúng.

Miền ứng dụng hữu ích vì:

  • Chúng ít tốn kém hơn các quy trình đầy đủ
  • Chúng đa luồng
  • Bạn có thể dừng một cái mà không giết mọi thứ trong quá trình này
  • Phân tách tài nguyên / cấu hình / v.v.
  • Mỗi miền ứng dụng chạy ở cấp độ bảo mật riêng

1

Nếu bạn nhìn nó từ góc độ chi tiết bên trong bộ xử lý, nó đặt giá trị khác nhau cho thanh ghi Code Segment (CS). mã và thanh ghi CS: IP (Con trỏ lệnh) là thanh ghi được bộ xử lý thực thi.

(Tôi đã chọn đọc lướt thảo luận liên quan đến bảng trang cho ngắn gọn).

AppDomain đánh dấu ranh giới này. để đảm bảo an toàn cho mã.

Lý do đưa ra nền tảng này là để loại bỏ câu hỏi như sau: 1. làm thế nào chúng ta có thể truy cập tài nguyên trên hai miền ứng dụng (có bằng cách sử dụng đường ống hoặc một số cơ chế chia sẻ khác không trực tiếp như CS: IP không thể được đặt thành một số miền ứng dụng khác). Nó chỉ là hệ điều hành có thể làm điều đó. Không phải CLR)

  1. Có thể có nhiều chuỗi trong miền ứng dụng. Về mặt kỹ thuật là có vì giá trị CS sẽ có trong quy trình hiện tại. bạn có thể thay đổi IP thành một cái gì đó khác bằng một câu lệnh nhảy (kết hợp hàm gọi / goto)

  2. hai luồng trong hai miền ứng dụng khác nhau có thể giao tiếp không (Không. Tham khảo điểm 1.)

  3. hai chuỗi trong một miền ứng dụng có thể giao tiếp được không (Có. tham khảo điểm 2)

Một số kết hợp khác của những trường hợp này có thể được giải đáp khi có ít kiến ​​thức về cách hoạt động của CS: IP.


0

Mỗi ứng dụng chạy trong một quy trình, AppDomain cũng là một quy trình nhẹ hoặc chúng ta có thể nói đơn vị logic có nhóm các cụm (đây là một vùng chứa chứa nhóm các cụm) và điều này tồn tại bên trong quy trình ở mức cô lập của cùng một quy trình , điều này cho phép chạy nhiều tập hợp trong cùng một quy trình và ngăn chúng truy cập trực tiếp.

Chạy ứng dụng Dot Net trong AppDomain: Sau khi chạy bất kỳ ứng dụng dot net nào, trình bao hệ điều hành sẽ tải CLR vào một quy trình và AppDomain mới được tạo trong cùng một quy trình và tải tất cả các tập hợp trong AppDomain đã tạo, bây giờ từ mã AppDomain sẽ được thực thi.

Khi nào nên tùy chỉnh AppDomain: Chúng ta có thể tạo AppDomain của riêng mình, bây giờ vấn đề là chúng ta có thể tạo AppDomain của riêng mình trong trường hợp nào. Giả sử thời gian chạy chúng ta cần thêm hoặc bớt các hợp ngữ mà không làm gián đoạn ứng dụng đang chạy thì chúng ta có thể tạo AppDomain của riêng mình.

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.