Maison >développement back-end >C++ >Comment charger de manière récursive des références d'assembly dans un domaine d'application distinct ?

Comment charger de manière récursive des références d'assembly dans un domaine d'application distinct ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-15 11:51:45856parcourir

How to Recursively Load Assembly References into a Separate AppDomain?

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!

Déclaration:
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