Esecuzione di codice in un altro dominio dell'applicazione (C# e Visual Basic)
Dopo il caricamento di un assembly in un dominio applicazione, sarà possibile eseguire il codice in esso contenuto. Il modo più semplice per caricare un assembly consiste nell'utilizzare AssemblyLoad che carica l'assembly nel dominio applicazione corrente e inizia 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'assembly a 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.
Il codice riportato di seguito crea un assembly costituito da un singolo spazio dei nomi e due classi. Incollare il codice in un'applicazione console Visual Studio denominata HelloWorldRemote, compilare o eseguire la soluzione e chiuderlo. Individuare il file di HelloWorldRemote.exe nella cartella obj/Debug del progetto, copiare il file nell'unità 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)");
}
}
}
Per accedere al codice da un'altra applicazione, è possibile caricare l'assembly nel dominio applicazione corrente oppure è possibile creare un nuovo dominio applicazione e caricarvi l'assembly.
Per caricare l'assembly nel dominio dell'applicazione tramite Assembly.LoadFrom, è possibile utilizzare Assembly.CreateInstance per creare un'istanza della classe RemoteObject. La creazione di istanze causa l'esecuzione del costruttore dell'oggetto.
' 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");
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.
Nota
Per informazioni sugli svantaggi derivanti dall'utilizzo di Assembly.LoadFrom, vedere la sezione Note di 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");
Se non si desidera caricare l'assembly a livello di codice, utilizzare Aggiungi riferimento in Esplora soluzioni per specificare l'assembly HelloWorldRemote.exe. In C# aggiungere una direttiva using HelloWorldRemote;. In Visual Basic aggiungere un'istruzione Imports HelloWorldRemote. Utilizzare quindi il tipo RemoteObject nel programma per dichiarare un'istanza dell'oggetto RemoteObject, come illustrato nell'esempio seguente:
' 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();
Vedere anche
Riferimenti
Domini delle applicazioni (C# e Visual Basic)
Concetti
Domini applicazione e assembly
Programmazione con i domini applicazione