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