Ładowanie bibliotek DLL do osobnej domeny AppDomain

Chcę załadować jedną lub więcej bibliotek DLL dynamicznie, aby działały z innym zabezpieczeniem lub ścieżką bazową niż moja główna aplikacja. Jak załadować te biblioteki DLL do oddzielnej AppDomain i utworzyć z nich instancje obiektów?

Author: Jon Turner, 2008-09-18

5 answers

A dokładniej

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);

Jeśli wszystko pójdzie poprawnie (bez wyjątków) masz teraz instancję TypeIWantToLoad załadowaną do nowej domeny. Instancja, którą posiadasz, jest w rzeczywistości proxy (ponieważ rzeczywisty obiekt znajduje się w nowej domenie), ale możesz go używać tak jak normalnego obiektu.

Uwaga: Z tego co wiem TypeIWantToLoad musi dziedziczyć z MarshalByRefObject.

 34
Author: Jon Turner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 14:29:27

Jeśli celujesz w 3.5, możesz skorzystać z nowego managed extensibility framework , aby obsłużyć wszystkie ciężkie operacje.

 4
Author: Will,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 23:50:12

Możesz użyć AppDomain.CreateInstance Metoda, aby to zrobić. Musisz wywołać metodę Unwrap zwracanego obiektu, aby uzyskać rzeczywisty obiekt.

 2
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 23:46:48

Utwórz nową Appdomain za pomocą AppDomain.Create( ... ). Po utworzeniu AppDomain załaduj biblioteki DLL do tej AppDomain.

Spójrz na wszystkie metody, które Appdomain ma z Create*. Są pewne rzeczy, takie jak CreateInstanceAndUnwrap itp.

 0
Author: Min,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 23:50:47

Jak wcześniej wspomniano, użyj AppDomain.CreateDomain, aby utworzyć nową domenę aplikacji. Następnie można załadować do niego zespół za pomocą metody Load, a nawet wykonać montaż za pomocą metody ExecuteAssembly. Możesz użyć GetAssemblies, aby sprawdzić, czy zespół został już załadowany. Należy również pamiętać, że nie można rozładować zespołu po załadowaniu. Musisz rozładować domenę.

 0
Author: Ty.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-18 00:27:05