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

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

Ответ 1

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

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.

Ответ 3

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

Ответ 4

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

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

Ответ 5

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