Heim >Backend-Entwicklung >C++ >Wie lade ich Assembly-Referenzen rekursiv in eine separate AppDomain?
Laden Sie die Assembly und ihre Referenzen rekursiv in eine eigenständige AppDomain
Stellen Sie beim Laden einer Assembly in eine neue AppDomain sicher, dass alle ihre Referenzen rekursiv geladen werden, um FileNotFoundException
Fehler zu vermeiden. In diesem Artikel werden die Schritte zur Bewältigung dieser komplexen Aufgabe erläutert.
Erstellen Sie zunächst eine eigenständige AppDomain mit einem benutzerdefinierten ApplicationBase
. Verwenden Sie dann AssemblyName.GetAssemblyName
, um die Root-Assembly zu laden. Dies allein reicht jedoch nicht aus; Sie müssen die Referenz der Baugruppe manuell laden.
Verwenden Sie dazu ReflectionOnlyLoadFrom
, um eine Liste der referenzierten Assemblys abzurufen, ohne diese tatsächlich zu laden. Verwenden Sie für jede Referenz domain.Load(refAsmName)
, um sie in die AppDomain zu laden.
Hier gibt es jedoch eine Einschränkung. Um ein Proxy-Objekt in einer externen Anwendungsdomäne auszuführen, müssen Sie CreateInstanceAndUnwrap
aufrufen. Diese Methode stellt sicher, dass das Objekt in der Ziel-AppDomain ausgeführt wird.
Codebeispiel zur Veranschaulichung dieses Prozesses:
<code class="language-csharp">class Program { static void Main(string[] args) { AppDomainSetup domaininfo = new AppDomainSetup(); domaininfo.ApplicationBase = System.Environment.CurrentDirectory; Evidence adevidence = AppDomain.CurrentDomain.Evidence; AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, domaininfo); Type type = typeof(Proxy); var value = (Proxy)domain.CreateInstanceAndUnwrap( type.Assembly.FullName, type.FullName); var assembly = value.GetAssembly(args[0]); // AppDomain.Unload(domain); } } public class Proxy : MarshalByRefObject { public Assembly GetAssembly(string assemblyPath) { try { return Assembly.LoadFile(assemblyPath); } catch (Exception) { return null; // throw new InvalidOperationException(ex); } } }</code>
Denken Sie daran, dass Sie bei Verwendung von LoadFile
anstelle von LoadFrom
alle Abhängigkeiten selbst laden müssen, um FileNotFound
-Ausnahmen zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie lade ich Assembly-Referenzen rekursiv in eine separate AppDomain?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!