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

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


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


Ответы (5)


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

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.

person Jon Turner    schedule 18.09.2008

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

person Community    schedule 17.09.2008
comment
@dboar Что ж, это будет частью фреймворка в 4.0, но, AFAIK, вы можете использовать предварительный просмотр в 3.5 (на странице загрузки говорится, что они объединили двоичные файлы .net 3.5 и silverlight). - person ; 10.02.2010
comment
о, круто ... Я никогда не проходил мимо начальной страницы codeplex, потому что они специально сказали .Net 4.0 ... хорошо знать ... спасибо - person IAbstract; 10.02.2010

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

person Andy    schedule 17.09.2008
comment
Что, если объект, экземпляр которого я хочу создать, определен в сборке, которую я пытаюсь загрузить? Я не могу узнать, как называется этот объект, не загрузив сначала сборку ... - person lysergic-acid; 06.06.2011
comment
@liortal Дает ли принятый ответ на этот вопрос то, что вам нужно сделать? - person Andy; 06.06.2011
comment
Мы хотели бы загрузить набор DLL в другой домен приложения, однако типы, определенные в этих DLL, нам неизвестны. - person lysergic-acid; 06.06.2011
comment
@liortal У вас должна быть возможность использовать AppDomain.Load () для загрузки DLL в этот AppDomain. Это возвращает экземпляр Assembly, который можно использовать для запроса любых типов в этой сборке. - person Andy; 07.06.2011
comment
Напомним, что предложение Энди использовать AppDomain.Load () может сработать, но оно также загрузит запрошенную сборку в текущем домене, что, по-видимому, противоречит цели использования другого домена. См. msdn.microsoft.com/en-us/ библиотека / 36az8x58 (v = против 110) .aspx - person dhochee; 20.11.2014

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

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

person Min    schedule 17.09.2008

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

person Ty.    schedule 18.09.2008