Charger récursivement l'assembly et ses références dans un AppDomain autonome
Lors du chargement d'un assembly dans un nouvel AppDomain, assurez-vous de charger toutes ses références de manière récursive pour éviter FileNotFoundException
erreurs. Cet article explore les étapes à suivre pour accomplir cette tâche complexe.
Tout d’abord, créez un AppDomain autonome avec un ApplicationBase
personnalisé. Ensuite, utilisez AssemblyName.GetAssemblyName
pour charger l'assembly racine. Cependant, cela ne suffit pas ; vous devez charger manuellement la référence de l’assembly.
Pour ce faire, utilisez ReflectionOnlyLoadFrom
pour obtenir une liste des assemblys référencés sans les charger réellement. Pour chaque référence, utilisez domain.Load(refAsmName)
pour la charger dans l'AppDomain.
Cependant, il y a une mise en garde ici. Pour exécuter un objet proxy dans un domaine d'application externe, vous devez appeler CreateInstanceAndUnwrap
. Cette méthode garantit que l'objet s'exécute dans l'AppDomain cible.
Exemple de code illustrant ce processus :
<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>
N'oubliez pas que lorsque vous utilisez LoadFile
au lieu de LoadFrom
, vous devez charger vous-même toutes les dépendances pour éviter les exceptions FileNotFound
.
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!