Подтвердить что ты не робот

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

Какое самое важное использование AppDomains в С#?

4b9b3361

Ответ 1

один самый важный - то, что ваш код должен иметь один - то есть все, что вы пишете на С#, выполняется в AppDomain. Это очень важно; -p

Если вы имеете в виду дополнительные приложения-домены:

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

  • получить доступ к загруженным сборкам;
  • получить доступ к слотам данных, совместно используемым в приложении,
  • intems marshalling с точки зрения разворачивания созданных экземпляров из загруженных сборок в созданных доменах.

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

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

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

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

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

Ответ 4

Домен приложения С# - это логически изолированный контейнер, внутри которого выполняется код .NET. Когда вы запускаете любой код .NET, он всегда выполняется в домене приложения по умолчанию.

Посмотрите это 30-минутное видео на YouTube Что такое С# AppDomain?, в котором более подробно объясняется AppDomain.

C# Appdomain

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

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

Ответ 5

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

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