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