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
Libérer: 2025-01-15 11:51:45
original
823 Les gens l'ont consulté

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>
Copier après la connexion

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!

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