2010-02-05 31 views
15

Tôi hiểu khoảng AppDomain là gì, tuy nhiên tôi không hiểu đầy đủ về cách sử dụng cho một AppDomain.Miền ứng dụng được sử dụng để làm gì?

Tôi tham gia vào một ứng dụng C#/C++ dựa trên máy chủ lớn và tôi tự hỏi cách sử dụng AppDomains có thể cải thiện tính ổn định/bảo mật/hiệu suất.

Đặc biệt:

  • Tôi hiểu rằng một lỗi hoặc ngoại lệ tử vong trong một miền không ảnh hưởng đến lĩnh vực ứng dụng khác đang chạy trong cùng một quá trình - Điều này cũng đúng với không được quản lý/C++ ngoại lệ, thậm chí có thể đống tham nhũng hoặc các vấn đề bộ nhớ khác.
  • Giao tiếp giữa các miền AppDomain hoạt động như thế nào?
  • Làm cách nào để sử dụng AppDomains khác với việc đơn giản sinh ra nhiều quy trình?
+1

Tôi khuyên bạn nên chia nhỏ quetion này thành ít nhất 2 - một về ngoại lệ một về liên lạc giữa AppDomain. – Mikeon

Trả lời

13

Các trường hợp sử dụng cơ bản cho một AppDomain là trong một môi trường được lưu trữ mã bên thứ 3, vì vậy nó sẽ là cần thiết không chỉ để tải hội đồng động mà còn dỡ bỏ chúng.

Không có cách nào để giải phóng một bản lắp ráp riêng lẻ. Vì vậy, bạn phải tạo một AppDomain riêng biệt để chứa bất cứ thứ gì có thể cần phải được dỡ xuống.Bạn có thể sau đó thùng rác và xây dựng lại toàn bộ AppDomain khi cần thiết.

Nhân tiện, mã gốc bị hỏng heap không thể được bảo vệ khỏi bất kỳ tính năng nào của CLR. Cuối cùng CLR được thực thi nguyên bản và chia sẻ cùng một không gian địa chỉ. Vì vậy, mã nguồn gốc trong quá trình có thể viết nguệch ngoạc trên tất cả các bên trong của CLR! Cách duy nhất để phân lập mã gốc có hành vi xấu (nghĩa là hầu hết) là quá trình cô lập thực tế ở cấp hệ điều hành. Khởi chạy các tiến trình mutiple .exe và yêu cầu chúng giao tiếp thông qua một số cơ chế IPC.

+0

Tôi nên làm rõ - Tôi chỉ đề cập đến mã gốc * của riêng tôi! –

1

Tôi không tuyên bố là chuyên gia về AppDomains, vì vậy câu trả lời của tôi sẽ không bao gồm tất cả. Có lẽ tôi nên bắt đầu bằng cách liên kết với một giới thiệu tuyệt vời của một chàng trai đi ra như là một chuyên gia, và những gì có vẻ như covering all aspects of AppDomain usage.

Cuộc gặp gỡ chính của riêng tôi với AppDomains đã nằm trong trường bảo mật. Ở đó, lợi thế lớn nhất mà tôi đã tìm thấy là khả năng có một tên miền chính chạy trong sự tin tưởng cao tạo ra một số tên miền con với các quyền hạn chế. Bằng cách hạn chế quyền có độ tin cậy cao, không sử dụng miền ứng dụng, các quy trình bị hạn chế sẽ vẫn có quyền nâng cao đặc quyền của riêng chúng.

4

Thực tế, đó là không đúng là lỗi nghiêm trọng trong một AppDomain không thể tác động đến người khác. Trong trường hợp của những điều xấu, tốt nhất đặt cược nó để phá vỡ quá trình. Có một vài ví dụ, nhưng thành thật mà nói tôi đã không nhớ họ - Tôi chỉ đơn giản là một lưu ý tinh thần "điều xấu = xé xuống quá trình (kiểm tra)"

Lợi ích của AppDomain:

  • bạn có thể dỡ bỏ một số AppDomain; Tôi sử dụng nó cho một hệ thống tự biên dịch (meta-programming) dựa trên dữ liệu từ cơ sở dữ liệu - nó có thể quay lên appdomain để lưu trữ dll mới trong một thời gian, rồi trao đổi nó một cách an toàn khi dữ liệu mới có sẵn (và được xây dựng)
  • số điện thoại giữa AppDomain s tương đối rẻ. IMO đây là lần duy nhất tôi vui lòng sử dụng tính năng remoting (mặc dù bạn vẫn cần phải thực sự cẩn thận về các đối tượng trên ranh giới để tránh tham chiếu chảy máu giữa chúng), làm cho "phản ứng tổng hợp" tải thêm dll vào chính AppDomain , gây ra rò rỉ) - cũng rất dễ dàng - chỉ cần CreateInstanceAndUnwrap (hoặc là CreateInstanceFromAndUnwrap?).
  • và sinh ra một quy trình bổ sung - bạn có thể đi theo một trong hai cách; nhưng bạn không cần phải exe khác cho AppDomain làm việc, và nó là dễ dàng hơn để thiết lập bất kỳ vệ tinh viễn thông mà bạn cần
6

Tôi rất khuyên bạn nên CLR Via C# bởi Jeffrey Richter. Trong chương 21 cụ thể đi vào chi tiết tốt liên quan đến mục đích và sử dụng của AppDomains.

Trong câu trả lời cho điểm của bạn/câu hỏi:

  • AppDomains sẽ không bảo vệ ứng dụng của bạn từ mã không được quản lý giả mạo. Nếu đây là một vấn đề bạn rất có thể sẽ cần phải sử dụng cách ly quá trình đầy đủ được cung cấp bởi hệ điều hành.

  • Giao tiếp giữa AppDomains được thực hiện bằng cách sử dụng .NET remoting để thực thi cách ly. Điều này có thể được thông qua nguyên soái bằng cách tham chiếu hoặc soái theo ngữ nghĩa giá trị, với sự giao thương giữa hiệu suất và tính linh hoạt.

  • AppDomains là một cách nhẹ để đạt được quy trình như cách ly trong mã được quản lý. AppDomains được coi là nhẹ vì bạn có thể tạo nhiều AppDomain trong một quy trình duy nhất và do đó, chúng tránh được quá trình thực thi tài nguyên và hiệu suất trên nhiều hệ điều hành. Ngoài ra, một chủ đề duy nhất có thể thực thi mã trong một AppDomain và sau đó trong AppDomain khác như Windows không biết gì về AppDomains (xem điều này bằng cách sử dụng sử dụng System.AppDomain.CurrentDomain)

0
chiến lược phân

App miền cho chạy mã hoàn toàn độc lập các mô-đun, để giải quyết các vấn đề về chia sẻ bộ nhớ và ổn định, có nhiều ảo giác hơn là thực tế.

+1

bạn biết, microsoft đã loại bỏ AppDomains trong lõi ASP.NET ... – docesam

+0

Không, tôi đã không làm, nhưng bây giờ tôi làm – LastTribunal

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