Maison > développement back-end > C++ > Comment charger de manière récursive des assemblys et leurs dépendances dans un domaine d'application distinct ?

Comment charger de manière récursive des assemblys et leurs dépendances dans un domaine d'application distinct ?

Mary-Kate Olsen
Libérer: 2025-01-15 12:03:46
original
300 Les gens l'ont consulté

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

Chargement d'assemblys et de dépendances dans un domaine d'application distinct : une approche récursive

Le chargement d'assemblys avec des dépendances complexes dans un nouveau AppDomain peut présenter des défis. Des erreurs telles que « Impossible de charger le fichier ou l’assembly… ou l’une de ses dépendances » se produisent fréquemment car les assemblys référencés ne sont pas automatiquement chargés. Cela nécessite un processus de chargement manuel et récursif.

La solution implique ces étapes clés :

  1. Création d'AppDomain : Tout d'abord, établissez un nouvel AppDomain :

    <code class="language-csharp"> AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
     setup.ApplicationBase = dir;
     AppDomain domain = AppDomain.CreateDomain("SomeAppDomain", null, setup);</code>
    Copier après la connexion
  2. Chargement de l'assemblage principal : Chargez l'assemblage principal à l'aide de son AssemblyName :

    <code class="language-csharp"> domain.Load(AssemblyName.GetAssemblyName(path));</code>
    Copier après la connexion
  3. Résolution de référence récursive : Parcourez les références de l'assembly chargé dans le nouvel 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>
    Copier après la connexion
  4. Classe proxy pour l'interaction entre domaines : La classe Proxy facilite la communication entre les domaines d'application :

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

Cette méthode garantit que toutes les dépendances nécessaires sont chargées de manière récursive dans l'AppDomain cible, évitant ainsi les erreurs d'exécution et permettant une exécution réussie de l'assembly.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal