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
Antwort
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.
Vielen Dank, das ist großartig! – abatishchev
+1 für die gründliche Erklärung – Laguna
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.
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 ... –
@liortal Hat die akzeptierte Antwort auf diese Frage, was Sie tun müssen? – Andy
Wir möchten eine Reihe von DLLs in eine andere AppDomain laden, die in diesen DLLs definierten Typen sind uns jedoch nicht bekannt. –
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.
@Will: MEF-Ziele .Net 4.0: http://www.codeplex.com/MEF – IAbstract
@ 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
oh, cool ... Ich ging nie über die ursprüngliche Codeplex-Seite cuz sie speziell gesagt .Net 4.0 ... gut zu wissen ... thx – IAbstract
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.
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.
- 1. Laden benutzerdefinierter DLLs anstelle von ursprünglichen DLLs
- 2. Kann ich separate DLLs erhalten, um ihre importierten DLLs getrennt aufzulösen?
- 3. Was ist eine .NET-Anwendungsdomäne?
- 4. Wie lange dauert eine Anwendungsdomäne in WCF?
- 5. Wie wird eine Assembly für eine .NET-Anwendungsdomäne erneut geladen?
- 6. Laden von nicht verwalteten DLLs in WPF-Anwendungen
- 7. Laden von Assemblys in separate AppDomain, Abrufen von InvalidCastException
- 8. CPU und Speicherkapazität für eine Anwendungsdomäne
- 9. Laden einer Liste in separate Eingabe Widgets
- 10. kann Android dlls von SDCard im einheitlichen Modus laden
- 11. C# Dynamisches Laden/Entladen von DLLs Redux (mit AppDomain, natürlich)
- 12. Visual Studio kann nicht laden ein Buch von dlls
- 13. Wie GetOpenFileName das Laden von DLLs zu stoppen
- 14. Welche Vorteile bietet das dynamische Laden von DLLs?
- 15. Kann ich die Standard-Anwendungsdomäne Schattenkopien bestimmter Assemblys verwenden?
- 16. Authentifizieren von DLLs in C#
- 17. Verwenden von C++ - DLLs in Python
- 18. Swift: UIPageViewController - Laden Sie separate Ansichten
- 19. Aktualisieren von GAC dlls
- 20. Abrufen von DLLs in WinForms-Anwendung
- 21. DLLs von falschen AppplicationBase geladen, wenn sie versuchen gemischten C# und C++/CLI-DLLs in einem neuen AppDomain zu laden
- 22. Eine separate PHP-Klasseninitialisierungsdatei
- 23. Verschmelzen mehrere native DLLs in eine DLL
- 24. Warum funktioniert App_Offline nicht, sobald Sie dlls laden?
- 25. Kann eine Anwendungsdomäne auf ein Verzeichnis beschränkt werden?
- 26. Microsoft.SqlServer.Types.SqlGeography DLLs in GAC
- 27. C# - Laden .NET Assembly in separate AppDomain So You Can Unload Es
- 28. Wie kann ich den Fortschritt beim Laden von Assemblys in die aktuelle Anwendungsdomäne in .Net auf einem Startbildschirm melden?
- 29. Wie laden Sie manuell MFC eigene Sprache DLLs
- 30. Verwenden von VirtualPathProvider zum Laden von ASP.NET MVC Ansichten von DLLs
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
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. –