Использование AppDomain в C#

каково наиболее важное использование AppDomains в C#?

5 ответов


на один из самых важных использовать это ваш код должен быть - т. е. все, что вы пишете на C#, выполняется в AppDomain. Это очень важно ; - p

Если вы имеете в виду дополнительные app-Домены:

при использовании плагинов и другого ненадежного кода он позволяет как изолировать, так и выгружать их (вы не можете выгружать сборки - только целые Домены приложений).

Я использую его в настоящее время для загрузки динамически генерируемые DLL, чтобы я мог их выгрузить.

они также позволяют устанавливать различные файлы конфигурации,уровни доверия и т. д., но имеют связанные с этим затраты на сложность и удаленность.

MSDN имеет раздел о доменах приложений,здесь.


Я не могу сказать вам, что самая важная польза, так как это зависит от ситуации.

AppDomains полезны для песочницы части вашего приложения. Вы можете загружать расширения в AppDomain и выгружать их снова - то, что вы не можете сделать иначе. Можно назначить определенные права для AppDomains. По умолчанию объекты в разных AppDomains не могут получить доступ друг к другу.

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

кроме того, все AppDomains используют одну и ту же управляемую кучу. Обычно это не проблема, но это может иметь удивительные эффекты, поскольку некоторые экземпляры, такие как строки, разделяются между AppDomains. Для обычного использования это не проблема, но если вы используете строки для блокировки, потоки в разных AppDomain могут влиять друг на друга.


В общем, это не так ежедневная практика кодирования, чтобы использовать AppDomains, это можно было бы рассматривать как передовую концепцию.. но, начиная с этой простой вещи, важно лучше понять понятия, стоящие за словом "AppDomain".

С точки зрения архитектуры, и принимая это как можно проще, AppDomain является контейнером изоляции даже с точки зрения адресации памяти, внутри него загружаются и выполняются все сборки, необходимые приложению, даже если это концепция сложнее объяснить подробно (я надеюсь, что речь идет не о вашем вопросе, чтобы идти так глубоко).

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

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

затем класс AppDomain используется для:

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

было бы полезно ознакомиться с кодом новой платформы Microsoft framework (пока нет выпущен)Меф (управляемые рамки Extesibility) который действительно основан на таких понятиях, как appdomains creations и unload, динамически загружаемые сборки.

в качестве простого примера вещей и примеров того, что вы можете сделать с AppDomains, я могу поделиться этим ссылке.

надеюсь я ответил на ваш вопрос.


C# AppDomain-это логически изолированный контейнер, внутри которого выполняется .NET-код. При запуске любого кода .NET он всегда выполняется в appdomain по умолчанию.

смотрите это 30 минут youtube видео Что такое C# AppDomain ? что объясняет AppDomain более подробно.

C# Appdomain

но позвольте мне все же попытаться объяснить более подробно. Допустим, вы получаете стороннюю DLL, и вы хотите использовать ее в своем приложении. Но вы также сомневаетесь, что у третьей стороны может быть вредоносный код, поэтому вы хотите запустить стороннюю DLL в ограниченной среде. Например, вы не хотите, чтобы третья сторона получала доступ к вашему диску c: или удаляла файлы и т. д.

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


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

  1. загрузка и выгрузка DLL во время выполнения: Я работал над проектом, где DLL загружаются во время выполнения пользователем, а во время выполнения программы методы выполняются с использованием отражения и выгружаются во время программы бежать.
  2. защита моя главная выполнение программы: мы загружаем DLL динамически, поэтому любое исключение, которое произошло в этой динамически загруженной DLL, не повлияло на мой основной AppDomain. В случае коррупционных сценариев у нас есть возможность эффективной выгрузки и загрузки DLL снова.
  3. Кросс-AppDomain Связи: мы можем динамически загружать любые две библиотеки DLL во время выполнения в разных AppDomain и заставлять их взаимодействовать с каждым другой.