Використання AppDomain в C #


74

Яке найважливіше використання AppDomains у C #?


Будь ласка, прочитайте мій блог для стандартного застосування завантаження DLL під час виконання та перехресного зв'язку за допомогою AppDomain. blog.vcillusion.co.in/…
vCillusion

Відповіді:


79

Найбільш важливим використання є те , що ваш код повинен мати один - тобто все , що ви пишете в # Виконує С AppDomain. Це досить важливо ;-с

Якщо ви маєте на увазі додаткові домени додатків:

При використанні плагінів та іншого ненадійного коду це дозволяє вам ізолювати і можливість їх вивантажувати (ви не можете вивантажувати збірки - лише цілі домени додатків).

В даний час я використовую його для завантаження динамічно генерованих DLL, щоб я міг їх вивантажити.

Вони також дозволяють встановлювати різні конфігураційні файли, рівні довіри тощо - але мають пов'язані з цим витрати на складність та віддаленість.

MSDN є розділ додатків доменів, тут .


30

Я не можу сказати вам, яке найважливіше використання, оскільки це залежить від ситуації.

AppDomains корисні для пісочниці частин вашої програми. Ви можете завантажити розширення в AppDomain і вивантажити їх знову - те, що ви не можете зробити інакше. Ви можете призначити конкретні права AppDomains. За умовчанням об’єкти в різних AppDomains не можуть отримати доступ один до одного.

AppDomains можна розглядати як легкі процеси, оскільки вони надають вам багато однакових функцій. Однак, на відміну від Process, нові AppDomains не мають власного потоку за замовчуванням. Ви повинні керувати AppDomains і потоками самостійно.

Крім того, усі AppDomains мають однакову керовану купу. Зазвичай це не проблема, але це може мати дивовижні ефекти, оскільки деякі екземпляри, такі як рядки, спільно використовуються між AppDomains. Для регулярного використання це не проблема, але якщо ви використовуєте рядки для блокування, потоки в різних AppDomain можуть впливати один на одного.


2
Приємна примітка про рядки.
AgentFire

2
"Усі AppDomains мають однакову керовану купу". це означає, що вони також мають спільні статичні класи або статичні методи?
Математика,

22

Взагалі, використання AppDomains не така щоденна практика кодування, це можна розглядати як дещо просунуту концепцію .. але, починаючи з цієї простої речі, важливо краще розуміти поняття, що стоять за словом "AppDomain".

З точки зору архітектури та, якщо взяти її максимально просто, AppDomain є ізоляційним контейнером навіть з точки зору адресації пам'яті, всередині нього завантажуються та виконуються всі збірки, необхідні додатку, навіть якщо ця концепція є більш складною для детального пояснення (Я сподіваюся, що мова не про ваше питання, щоб піти настільки глибше).

Починаючи з цього класу AppDomain, перш за все, використовується для отримання доступу до програми, що виконує домен програми, це можна зробити за допомогою реалізації властивості Singleton AppDomain.CurrentDomain. Таким чином можна:

  1. отримати доступ до завантажених збірок;
  2. отримати доступ до спільних слотів даних appdomain;
  3. маршалювання intems, з точки зору розгортання створених примірників із завантажених збірок у створених доменах.

Потім клас AppDomain використовується для:

  1. створити більше "доменів" за той самий процес;
  2. виконання зборів у процесі;
  3. керувати процесом завантаження / розвантаження додатка домену.

Було б корисно переглянути код нового фреймворку Microsoft (ще не випущений) MEF (Managed Extesibility Framework), який справді базується на таких концепціях, як створення AppDomains і розвантаження, динамічно завантажувані збірки.

Як простий приклад речей та прикладів того, що ви можете робити з AppDomains, я можу поділитися цим посиланням .

Сподіваюся, я відповів на ваше запитання.


9

AC # AppDomain - це логічно ізольований контейнер, усередині якого працює код .NET. Коли ви запускаєте будь-який .NET-код, він завжди працює у домені додатка за замовчуванням.

Перегляньте це 30-хвилинне відео на YouTube Що таке C # AppDomain? що пояснює AppDomain більш докладно.

C # Appdomain

Але дозвольте все-таки спробувати пояснити більш докладно. Скажімо, ви отримали сторонню DLL і хочете використовувати її у своєму додатку. Але ви також підозрюєте, що стороння сторона може мати якийсь шкідливий код, тому ви хотіли б запустити сторонню DLL у обмеженому середовищі. Як ви не хочете, щоб третя сторона отримувала доступ до вашого c: диска або видаляла файли тощо.

Таким чином, ви можете створити два AppDomains, один для третьої сторони та один для власних класів C #. Для стороннього домену додатків ви застосуєте обмеження безпеки, через яке він не може отримати доступ до диска c:, а для ваших бібліотек DLL C # у вас буде необмежений домен програми.


2

Будь ласка, прочитайте мій блог для стандартного застосування завантаження DLL під час виконання та перехресного зв'язку за допомогою AppDomain. https://blog.vcillusion.co.in/sending-events-through-application-domain-boundary/

  1. Завантаження та вивантаження DLL під час виконання: Я працював над проектом, де DLL завантажуються під час виконання користувачем, і під час виконання програми методи виконуються за допомогою Reflection та вивантажуються під час запуску програми.
  2. Захист моєї основної програми виконання : ми динамічно завантажуємо DLL, тому будь-яке виключення, яке сталося в цій динамічно завантаженій DLL, не впливало на мій основний AppDomain. У випадку корупційних сценаріїв ми маємо можливість ефективно розвантажити та знову завантажити DLL.
  3. Взаємозв'язок між AppDomain : Ми можемо динамічно завантажувати будь-які дві бібліотеки DLL під час виконання в різні AppDomain і змушувати їх спілкуватися між собою.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.