Esecuzione di codice in un altro dominio applicazione (Guida per programmatori C#)
Aggiornamento: novembre 2007
Dopo il caricamento di un assembly in un dominio applicazione, sarà possibile eseguire il codice in esso contenuto. Il modo più semplice per eseguire questa operazione consiste nell'utilizzare AssemblyLoad per caricare l'assembly nel dominio applicazione e iniziare a eseguire il codice in corrispondenza del punto di ingresso predefinito dell'assembly.
Se si desidera caricare l'assembly in un altro dominio applicazione, utilizzare ExecuteAssembly o ExecuteAssemblyByName oppure una delle altre versioni di overload di questi metodi.
Se si desidera eseguire l'altro assembly a partire da un punto di ingresso diverso da quello predefinito, definire un nuovo tipo nell'assembly remoto derivandolo da MarshalByRefObject. Utilizzare quindi CreateInstance per creare un'istanza di quel tipo nell'applicazione.
Si consideri il seguente file che crea un assembly costituito da un singolo spazio dei nomi e due classi. Si supponga che questo assembly sia stato compilato e sia archiviato nell'unità C con il nome 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)");
}
}
}
Per accedere al codice da un'altra applicazione, è possibile caricare l'assembly nel dominio applicazione corrente oppure creare un nuovo dominio applicazione e caricarvi l'assembly. Se si carica l'assembly nel dominio applicazione corrente utilizzando Assembly.LoadFrom, è possibile utilizzare Assembly.CreateInstance per creare un'istanza della classe RemoteObject, la quale determina l'esecuzione del costruttore dell'oggetto.
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");
}
Se si carica l'assembly in un dominio applicazione diverso, utilizzare AppDomain.ExecuteAssembly per accedere al punto di ingresso predefinito oppure AppDomain.CreateInstance per creare un'istanza della classe RemoteObject. La creazione dell'istanza determina l'esecuzione del costruttore.
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");
}
Se si desidera caricare l'assembly a livello di codice, scegliere Aggiungi riferimento in Esplora soluzioni per specificare l'assembly HelloWorldRemote.exe. Aggiungere quindi una direttiva using HelloWorldRemote; al blocco using dell'applicazione e utilizzare il tipo RemoteObject nel programma per dichiarare un'istanza dell'oggetto RemoteObject, come illustrato di seguito:
static void Main()
{
// This code creates an instance of RemoteObject, assuming HelloWorldRemote has been added as a reference:
HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject();
}
Vedere anche
Concetti
Cenni preliminari sui domini applicazione
Domini applicazione e assembly
Programmazione con i domini applicazione
Riferimenti
Domini applicazione (Guida per programmatori C#)