Я хочу загрузить одну или несколько DLL динамически, чтобы они запускались с другой защитой или базовым путем, чем мое основное приложение. Как загрузить эти DLL в отдельный AppDomain и создать объекты из них?
Загрузка 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.
Ответ 2
Если вы настроите таргетинг на 3.5, вы можете воспользоваться новой управляемой расширяемой инфраструктурой, чтобы справиться со всем тяжелым грузом для вас.
Ответ 3
Для этого вы можете использовать метод AppDomain.CreateInstance. Вам нужно будет вызвать метод Unwrap объекта ObjectHandle, который возвращается для получения фактического объекта.
Ответ 4
Создайте новый Appdomain с AppDomain.Create(...). После создания AppDomain загрузите библиотеки DLL в этот AppDomain.
Посмотрите на все методы, которые Appdomain имеет с помощью Create *. Есть такие вещи, как CreateInstanceAndUnwrap и т.д.
Ответ 5
Как уже было сказано, используйте AppDomain.CreateDomain для создания нового домена приложения. Затем вы можете загрузить сборку с помощью метода Load или выполнить сборку с использованием метода ExecuteAssembly. Вы можете использовать GetAssemblies, чтобы узнать, была ли сборка уже загружена. Помните также, что вы не можете выгружать сборку после ее загрузки. Вам нужно будет выгрузить домен.