Использование AppDomain в C # - PullRequest
71 голосов
/ 20 марта 2009

Что является наиболее важным использованием доменов приложений в C #?

Ответы [ 5 ]

75 голосов
/ 20 марта 2009

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

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

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

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

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

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

30 голосов
/ 20 марта 2009

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

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

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

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

21 голосов
/ 20 марта 2009

Как правило, использование доменов приложений не является повседневной практикой кодирования, это может считаться чем-то вроде продвинутой концепции ... но, исходя из этой простой вещи, важно лучше понять концепции, стоящие за словом "домен приложений".

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

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

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

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

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

Может быть полезно взглянуть на код новой платформы Microsoft (еще не выпущенной) сборок.

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

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

8 голосов
/ 31 декабря 2016

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

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

C# Appdomain

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

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

0 голосов
/ 03 июня 2018

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

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