2008-09-17 4 views
30

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

+0

Возможный дубликат [Простейший способ сделать перекрестный апдомен?] (Http://stackoverflow.com/questions/6242573/simplest-way-to-make-cross-appdomain-call) – user626528 2017-02-14 18:23:25

+0

Контекст ссылочной возможный дубликат отличается. В указанном вопросе цель состоит в том, чтобы вызвать код в AppDomain, который не создан или не контролируется разработчиком. Этот вопрос, в частности, касается загрузки кода в AppDomain, который разработчик контролирует, чтобы они могли изменять характеристики AppDomain. Также упомянутый вопрос также не дает полного кода примера того, как динамически загружать DLL во время выполнения, что является ключевым компонентом этого вопроса. – 2017-02-15 16:41:11

ответ

33

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

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

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

+0

Что делать, если объект, экземпляр которого я хотел бы создать, определяется в сборке, которую я пытаюсь загрузить? Я не знаю, как называется этот объект, не загружая сначала первую сборку ... – 2011-06-06 08:33:58

+0

@liortal Принимает ли принятый ответ на этот вопрос то, что вам нужно сделать? – Andy 2011-06-06 12:58:02

4

Если вы ориентируетесь на 3,5, вы можете воспользоваться новым managed extensibility framework, чтобы справиться со всем тяжелым грузом для вас.

0

Создайте новый Appdomain с AppDomain.Create (...). После создания AppDomain загрузите DLL в этот AppDomain.

Просмотрите все методы, которые Appdomain имеет с помощью Create *. Есть определенные вещи, такие как CreateInstanceAndUnwrap и т. Д.

0

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