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 ?
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 :
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>
Chargement de l'assemblage principal : Chargez l'assemblage principal à l'aide de son AssemblyName
:
<code class="language-csharp"> domain.Load(AssemblyName.GetAssemblyName(path));</code>
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>
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>
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!