Exécution de code dans un autre domaine d'application (Guide de programmation C#)
Mise à jour : novembre 2007
Une fois qu'un assembly a été chargé dans un domaine d'application, le code qu'il contient peut être exécuté. La façon la plus simple de faire consiste à utiliser AssemblyLoad qui chargera 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 dans l'assembly distant, dérivant de MarshalByRefObject. Utilisez ensuite CreateInstance pour créer une instance de ce type dans votre application.
Observez le fichier suivant, qui crée un assembly composé d'un espace de noms seul et de deux classes. Supposez que cet assembly a été construit et est stocké sur le lecteur C avec le nom HelloWorldRemote.exe.
// 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. Si vous chargez l'assembly dans le domaine d'application actuel avec Assembly.LoadFrom, vous pouvez utiliser Assembly.CreateInstance pour instancier une instance de la classe RemoteObject, ce qui entraîne l'exécution du constructeur de l'objet.
static void Main()
{
// 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.
static void Main()
{
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 programme, utilisez Ajouter une référence de l'Explorateur de solutions pour spécifier l'assembly HelloWorldRemote.exe. Ajoutez ensuite une directive using HelloWorldRemote; au bloc using de votre application et utilisez le type RemoteObject dans votre programme pour déclarer une instance de l'objet RemoteObject, comme suit :
static void Main()
{
// This code creates an instance of RemoteObject, assuming HelloWorldRemote has been added as a reference:
HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject();
}
Voir aussi
Concepts
Vue d'ensemble des domaines d'application
Domaines d'application et assemblys
Programmation avec des domaines d'application
Référence
Domaines d'application (Guide de programmation C#)
Autres ressources
Programmation à l'aide de domaines d'application et d'assemblys