Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Загрузка DLL в отдельный AppDomain

Автор вопроса: Jon TurnerОтветов: 5

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

  • Возможный дубликат Простейший способ сделать вызов между доменами приложений? user626528 14.02.2017
  • Контекст упомянутого возможного дубликата отличается. В указанном вопросе цель состоит в том, чтобы вызвать код в домене приложения, не созданный разработчиком или не находящийся под его контролем. Этот вопрос конкретно касается загрузки кода в домене приложений, которым управляет разработчик, чтобы они могли изменять характеристики домена приложений. Также упомянутый вопрос также не дает полного примера кода того, как динамически загружать DLL во время выполнения, что является ключевым компонентом этого вопроса. Jon Turner 15.02.2017

appdomain

Ответы

Ответ 1 · рейтинг 35 · Jon Turner

Более конкретно

AppDomain domain = AppDomain.CreateDomain("New domain name");
//Do other things to the domain like set the security policy

string pathToDll = @"C:\myDll.dll"; //Full path to dll you want to load
Type t = typeof(TypeIWantToLoad);
TypeIWantToLoad myObject = (TypeIWantToLoad)domain.CreateInstanceFromAndUnwrap(pathToDll, t.FullName);

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

Примечание. Насколько мне известно, TypeIWantToLoad должен наследовать от MarshalByRefObject.

Ответ 2 · рейтинг 4 · Community

Если вы ориентируетесь на 3.5, вы можете воспользоваться новой структурой управляемой расширяемости для обработки всех тяжелая атлетика для вас.

Ответ 3 · рейтинг 2 · Andy

Для этого можно использовать метод AppDomain.CreateInstance. Вам нужно будет вызвать метод Unwrap объекта ObjectHandle, который возвращается, чтобы добраться до фактического объекта.

Ответ 4 · Min

Создайте новый домен приложения с помощью AppDomain.Create (...). После создания AppDomain загрузите библиотеки DLL в этот AppDomain.

Изучите все методы, которые Appdomain имеет с помощью Create *. Есть такие вещи, как CreateInstanceAndUnwrap и т. Д.

Ответ 5 · Ty.

Как указывалось ранее, используйте AppDomain.CreateDomain для создания нового домена приложения. Затем вы можете загрузить в нее сборку с помощью метода Load или даже выполнить сборку с помощью метода ExecuteAssembly. Вы можете использовать GetAssemblies, чтобы узнать, загружена ли уже сборка. Помните также, что вы не можете выгрузить сборку после ее загрузки. Вам нужно будет выгрузить домен.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы