Загрузка DLL в отдельный домен приложений - PullRequest
32 голосов
/ 18 сентября 2008

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

Ответы [ 5 ]

34 голосов
/ 18 сентября 2008

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

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.

4 голосов
/ 18 сентября 2008

Если вы нацелены на 3,5, вы можете воспользоваться новой управляемой платформой расширяемости , чтобы справиться со всеми тяжелыми задачами.

2 голосов
/ 18 сентября 2008

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

0 голосов
/ 18 сентября 2008

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

0 голосов
/ 18 сентября 2008

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

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

...