2008-09-17 11 views
30

Ich möchte eine oder mehrere DLLs dynamisch laden, so dass sie mit einer anderen Sicherheit oder einem anderen Basispfad als meine Hauptanwendung ausgeführt werden. Wie lade ich diese DLLs in eine separate Anwendungsdomäne und instanziiere Objekte von ihnen?Laden von DLLs in eine separate Anwendungsdomäne

+0

Mögliche Duplikate von [Einfachste Möglichkeit, Cross-Appdomain-Aufruf zu machen?] (Http://stackoverflow.com/questions/6242573/simplet-way-to-make-cross-appdomain-call) – user626528

+0

Der Kontext der referenzierten Mögliches Duplikat ist anders. In der referenzierten Frage besteht das Ziel darin, Code in einer AppDomain aufzurufen, die nicht von oder unter Kontrolle des Entwicklers erstellt wurde. Diese Frage bezieht sich speziell auf das Laden von Code in einer AppDomain, die der Entwickler steuert, damit sie die Eigenschaften der AppDomain ändern können. Die referenzierte Frage gibt auch kein vollständiges Codebeispiel für das dynamische Laden einer DLL zur Laufzeit, was eine Schlüsselkomponente dieser Frage darstellt. –

Antwort

33

Insbesondere

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

Wenn alles, was jetzt richtig (keine Ausnahmen geworfen) geht Sie haben eine Instanz von TypeIWantToLoad in die neue Domäne geladen. Die Instanz, die Sie haben, ist eigentlich ein Proxy (da das tatsächliche Objekt in der neuen Domäne ist), aber Sie können es genau wie Ihr normales Objekt verwenden.

Hinweis: Soweit ich weiß, muss TypeIWantToLoad von MarshalByRefObject erben.

+0

Vielen Dank, das ist großartig! – abatishchev

+0

+1 für die gründliche Erklärung – Laguna

2

Sie können dazu die Methode AppDomain.CreateInstance verwenden. Sie müssen die Unwrap-Methode des ObjectHandle aufrufen, die zurückgegeben wird, um das tatsächliche Objekt abzurufen.

+0

Was passiert, wenn das Objekt, dessen Instanz ich erstellen möchte, in der Assembly definiert ist, die ich zu laden versuche? Ich kann nicht wissen, was der Name dieses Objekts ist, ohne die Baugruppe zuerst wirklich zu laden ... –

+0

@liortal Hat die akzeptierte Antwort auf diese Frage, was Sie tun müssen? – Andy

+0

Wir möchten eine Reihe von DLLs in eine andere AppDomain laden, die in diesen DLLs definierten Typen sind uns jedoch nicht bekannt. –

4

Wenn Sie auf 3,5 eingestellt sind, können Sie die Vorteile des neuen managed extensibility framework nutzen, um alle schweren Lasten für Sie zu bewältigen.

+0

@Will: MEF-Ziele .Net 4.0: http://www.codeplex.com/MEF – IAbstract

+0

@ Dboar Nun, es wird Teil des Frameworks in 4.0, aber AFAIK können Sie die Vorschau in 3.5 verwenden (die Download-Seite sagt, sie haben ".net 3.5 und Silverlight Binaries"). – Will

+0

oh, cool ... Ich ging nie über die ursprüngliche Codeplex-Seite cuz sie speziell gesagt .Net 4.0 ... gut zu wissen ... thx – IAbstract

0

Erstellen Sie eine neue Appdomain mit AppDomain.Create (...). Nach dem Erstellen der AppDomain laden Sie die DLLs in diese AppDomain.

Sehen Sie sich alle Methoden an, die Appdomain mit Create * hat. Es gibt bestimmte Dinge wie CreateInstanceAndUnwrap, etc.

0

Wie bereits erwähnt, verwenden Sie AppDomain.CreateDomain, um eine neue App-Domäne zu erstellen. Sie können dann eine Assembly mithilfe der Load-Methode in die Assembly laden oder mithilfe der ExecuteAssembly-Methode eine Assembly ausführen. Sie können GetAssemblies verwenden, um festzustellen, ob eine Assembly bereits geladen wurde. Beachten Sie auch, dass Sie eine Baugruppe nach dem Laden nicht entladen können. Sie müssen die Domain entfernen.

Verwandte Themen