Exécution de code dans un autre domaine d'application (C# et Visual Basic)

Une fois qu'un assembly a été chargé dans un domaine d'application, le code que l'assembly contient peut être exécuté. La façon la plus simple de charger un assembly consiste à utiliser AssemblyLoad qui charge l'assembly dans le domaine d'application actuel et commencera à exécuter le code au point d'entrée par défaut de l'assembly.

Si vous souhaitez charger l'assembly dans un autre domaine d'application, utilisez ExecuteAssembly ou ExecuteAssemblyByName, ou l'une des autres versions surchargées de ces méthodes.

Si vous souhaitez exécuter l'autre assembly en démarrant ailleurs qu'au point d'entrée par défaut, définissez un nouveau type dérivant de MarshalByRefObject dans l'assembly à distance. Utilisez ensuite CreateInstance pour créer une instance de ce type dans votre application.

Le code suivant crée un assembly qui se compose d'un seul espace de noms et de deux classes. Collez le code dans une application de console Visual Studio nommée HelloWorldRemote, générez ou exécutez la solution et fermez-la. Recherchez le fichier dans HelloWorldRemote.exe obj dans le dossier obj/Debug du projet, puis copiez le fichier sur votre lecteur C:.

' This module contains code to be called.
Module HelloWorldRemote
    Class RemoteObject
        Inherits System.MarshalByRefObject
        Sub RemoteObject()
            System.Console.WriteLine("Hello, World! (RemoteObject Constructor)")
        End Sub
    End Class
    Sub Main()
        System.Console.WriteLine("Hello, World! (Main method)")
    End Sub
End Module
// This namespace contains code to be called.
namespace HelloWorldRemote
{
    public class RemoteObject : System.MarshalByRefObject
    {
        public RemoteObject()
        {
            System.Console.WriteLine("Hello, World! (RemoteObject Constructor)");
        }
    }
    class Program
    {
        static void Main()
        {
            System.Console.WriteLine("Hello, World! (Main method)");
        }
    }
}

Pour accéder à du code à partir d'une autre application, vous pouvez soit charger l'assembly dans le domaine d'application actuel, soit créer un nouveau domaine d'application et y charger l'assembly.

Pour charger l'assembly dans le domaine d'application actuel à l'aide de Assembly.LoadFrom, vous pouvez utiliser Assembly.CreateInstance pour instancier une instance de la classe RemoteObject. L'instanciation provoque le constructeur d'objet à être exécuté.

' Load the assembly into the current appdomain:
Dim newAssembly As System.Reflection.Assembly = System.Reflection.Assembly.LoadFrom("c:\HelloWorldRemote.exe")

' Instantiate RemoteObject:
newAssembly.CreateInstance("HelloWorldRemote.RemoteObject")
// Load the assembly into the current appdomain:
System.Reflection.Assembly newAssembly = System.Reflection.Assembly.LoadFrom(@"c:\HelloWorldRemote.exe");

// Instantiate RemoteObject:
newAssembly.CreateInstance("HelloWorldRemote.RemoteObject");

Lors du chargement de l'assembly dans un domaine d'application distinct, utilisez AppDomain.ExecuteAssembly pour accéder au point d'entrée par défaut ou AppDomain.CreateInstance pour créer une instance de la classe RemoteObject. La création de l'instance entraîne l'exécution du constructeur.

Notes

Pour plus d'informations sur les inconvénients liés à l'utilisation d'Assembly.LoadFrom, consultez la section Notes de la page Assembly.LoadFrom(String).

Dim NewAppDomain As System.AppDomain = System.AppDomain.CreateDomain("NewApplicationDomain")

' Load the assembly and call the default entry point:
NewAppDomain.ExecuteAssembly("c:\HelloWorldRemote.exe")

' Create an instance of RemoteObject:
NewAppDomain.CreateInstanceFrom("c:\HelloWorldRemote.exe", "HelloWorldRemote.RemoteObject")
System.AppDomain NewAppDomain = System.AppDomain.CreateDomain("NewApplicationDomain");

// Load the assembly and call the default entry point:
NewAppDomain.ExecuteAssembly(@"c:\HelloWorldRemote.exe");

// Create an instance of RemoteObject:
NewAppDomain.CreateInstanceFrom(@"c:\HelloWorldRemote.exe", "HelloWorldRemote.RemoteObject");

Si vous ne souhaitez pas charger l'assembly par programmation, utilisez la fonctionnalité Ajouter une référence de l'Explorateur de solutions pour spécifier l'assembly HelloWorldRemote.exe. En C#, ajoutez une directive using HelloWorldRemote; ; en Visual Basic, ajoutez une instruction Imports HelloWorldRemote Utilisez ensuite le type RemoteObject dans votre programme pour déclarer une instance de l'objet RemoteObject, comme illustré dans l'exemple suivant.

' This code creates an instance of RemoteObject, 
' assuming HelloWorldRemote has been added as a reference:
Dim o As HelloWorldRemote.RemoteObject = New HelloWorldRemote.RemoteObject()
// This code creates an instance of RemoteObject, 
// assuming HelloWorldRemote has been added as a reference:
HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject();

Voir aussi

Référence

Domaines d'application (C# et Visual Basic)

Concepts

Guide de programmation C#

Domaines d'application et assemblys

Programmation avec des domaines d'application

Autres ressources

Guide de programmation Visual Basic

Domaines d'application

Programmation à l'aide de domaines d'application et d'assemblys