Яке найважливіше використання AppDomains у C #?
Відповіді:
Найбільш важливим використання є те , що ваш код повинен мати один - тобто все , що ви пишете в # Виконує С AppDomain
. Це досить важливо ;-с
Якщо ви маєте на увазі додаткові домени додатків:
При використанні плагінів та іншого ненадійного коду це дозволяє вам ізолювати і можливість їх вивантажувати (ви не можете вивантажувати збірки - лише цілі домени додатків).
В даний час я використовую його для завантаження динамічно генерованих DLL, щоб я міг їх вивантажити.
Вони також дозволяють встановлювати різні конфігураційні файли, рівні довіри тощо - але мають пов'язані з цим витрати на складність та віддаленість.
MSDN є розділ додатків доменів, тут .
Я не можу сказати вам, яке найважливіше використання, оскільки це залежить від ситуації.
AppDomains корисні для пісочниці частин вашої програми. Ви можете завантажити розширення в AppDomain і вивантажити їх знову - те, що ви не можете зробити інакше. Ви можете призначити конкретні права AppDomains. За умовчанням об’єкти в різних AppDomains не можуть отримати доступ один до одного.
AppDomains можна розглядати як легкі процеси, оскільки вони надають вам багато однакових функцій. Однак, на відміну від Process, нові AppDomains не мають власного потоку за замовчуванням. Ви повинні керувати AppDomains і потоками самостійно.
Крім того, усі AppDomains мають однакову керовану купу. Зазвичай це не проблема, але це може мати дивовижні ефекти, оскільки деякі екземпляри, такі як рядки, спільно використовуються між AppDomains. Для регулярного використання це не проблема, але якщо ви використовуєте рядки для блокування, потоки в різних AppDomain можуть впливати один на одного.
Взагалі, використання AppDomains не така щоденна практика кодування, це можна розглядати як дещо просунуту концепцію .. але, починаючи з цієї простої речі, важливо краще розуміти поняття, що стоять за словом "AppDomain".
З точки зору архітектури та, якщо взяти її максимально просто, AppDomain є ізоляційним контейнером навіть з точки зору адресації пам'яті, всередині нього завантажуються та виконуються всі збірки, необхідні додатку, навіть якщо ця концепція є більш складною для детального пояснення (Я сподіваюся, що мова не про ваше питання, щоб піти настільки глибше).
Починаючи з цього класу AppDomain, перш за все, використовується для отримання доступу до програми, що виконує домен програми, це можна зробити за допомогою реалізації властивості Singleton AppDomain.CurrentDomain
. Таким чином можна:
Потім клас AppDomain використовується для:
Було б корисно переглянути код нового фреймворку Microsoft (ще не випущений) MEF (Managed Extesibility Framework), який справді базується на таких концепціях, як створення AppDomains і розвантаження, динамічно завантажувані збірки.
Як простий приклад речей та прикладів того, що ви можете робити з AppDomains, я можу поділитися цим посиланням .
Сподіваюся, я відповів на ваше запитання.
AC # AppDomain - це логічно ізольований контейнер, усередині якого працює код .NET. Коли ви запускаєте будь-який .NET-код, він завжди працює у домені додатка за замовчуванням.
Перегляньте це 30-хвилинне відео на YouTube Що таке C # AppDomain? що пояснює AppDomain більш докладно.
Але дозвольте все-таки спробувати пояснити більш докладно. Скажімо, ви отримали сторонню DLL і хочете використовувати її у своєму додатку. Але ви також підозрюєте, що стороння сторона може мати якийсь шкідливий код, тому ви хотіли б запустити сторонню DLL у обмеженому середовищі. Як ви не хочете, щоб третя сторона отримувала доступ до вашого c: диска або видаляла файли тощо.
Таким чином, ви можете створити два AppDomains, один для третьої сторони та один для власних класів C #. Для стороннього домену додатків ви застосуєте обмеження безпеки, через яке він не може отримати доступ до диска c:, а для ваших бібліотек DLL C # у вас буде необмежений домен програми.
Будь ласка, прочитайте мій блог для стандартного застосування завантаження DLL під час виконання та перехресного зв'язку за допомогою AppDomain. https://blog.vcillusion.co.in/sending-events-through-application-domain-boundary/