Heim >Backend-Entwicklung >C++ >Wie lade ich Assemblys und ihre Abhängigkeiten rekursiv in eine separate AppDomain?

Wie lade ich Assemblys und ihre Abhängigkeiten rekursiv in eine separate AppDomain?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2025-01-15 12:03:46260Durchsuche

How to Recursively Load Assemblies and Their Dependencies into a Separate AppDomain?

Assemblys und Abhängigkeiten in eine separate AppDomain laden: Ein rekursiver Ansatz

Das Laden von Assemblys mit komplexen Abhängigkeiten in eine neue AppDomain kann eine Herausforderung darstellen. Fehler wie „Datei oder Assembly … oder eine ihrer Abhängigkeiten konnte nicht geladen werden“ treten häufig auf, weil referenzierte Assemblys nicht automatisch geladen werden. Dies erfordert einen manuellen, rekursiven Ladevorgang.

Die Lösung umfasst diese wichtigen Schritte:

  1. AppDomain-Erstellung: Erstellen Sie zunächst eine neue AppDomain:

    <code class="language-csharp"> AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
     setup.ApplicationBase = dir;
     AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup);</code>
  2. Laden der Hauptbaugruppe: Laden Sie die Primärbaugruppe mit ihrem AssemblyName:

    <code class="language-csharp"> domain.Load(AssemblyName.GetAssemblyName(path));</code>
  3. Rekursive Referenzauflösung: Durchlaufen Sie die Referenzen der geladenen Assembly innerhalb der neuen AppDomain:

    <code class="language-csharp"> foreach (AssemblyName refAsmName in Assembly.ReflectionOnlyLoadFrom(path).GetReferencedAssemblies())
     {
      // Utilize a proxy object for cross-AppDomain access
      Type type = typeof(Proxy);
      var value = (Proxy)domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
    
      // Load the referenced assembly in the target AppDomain
      value.GetAssembly(refAsmName.FullName);
     }</code>
  4. Proxy-Klasse für domänenübergreifende Interaktion: Die Proxy-Klasse erleichtert die Kommunikation zwischen AppDomains:

    <code class="language-csharp"> class Proxy : MarshalByRefObject
     {
      public Assembly GetAssembly(string assemblyPath)
      {
          try
          {
              return Assembly.LoadFile(assemblyPath);
          }
          catch (Exception)
          {
              return null;
          }
      }
     }</code>

Diese Methode stellt sicher, dass alle erforderlichen Abhängigkeiten rekursiv in die Ziel-AppDomain geladen werden, wodurch Laufzeitfehler verhindert und eine erfolgreiche Assembly-Ausführung ermöglicht wird.

Das obige ist der detaillierte Inhalt vonWie lade ich Assemblys und ihre Abhängigkeiten rekursiv in eine separate AppDomain?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn