Ausführen von Code in einer anderen Anwendungsdomäne (C#-Programmierhandbuch)

Aktualisiert: November 2007

Sobald eine Assembly in eine Anwendungsdomäne geladen worden ist, kann der darin enthaltene Code ausgeführt werden. Der einfachste Weg ist die Verwendung von AssemblyLoad, wodurch die Assembly in die aktuelle Anwendungsdomäne geladen wird und der Code ab dem Standardeinstiegspunkt der Assembly ausgeführt wird.

Wenn Sie die Assembly in eine andere Anwendungsdomäne laden möchten, verwenden Sie ExecuteAssembly oder ExecuteAssemblyByName oder eine der anderen überladenen Versionen dieser Methoden.

Wenn Sie möchten, dass die Assembly an einem anderen Punkt als am Standardeinstiegspunkt mit dem Ausführen des Codes beginnt, definieren Sie in der Remoteassembly einen neuen, von MarshalByRefObject abgeleiteten Typ. Erstellen Sie anschließend mit CreateInstance eine Instanz dieses Typs in der Anwendung.

Betrachten Sie die folgende Datei, die eine Assembly erstellt, die aus einem einzelnen Namespace und zwei Klassen besteht. Angenommen, diese Assembly wurde erstellt und auf Laufwerk C unter dem Namen HelloWorldRemote.exe gespeichert.

// 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)");
        }
    }
}

Um von einer anderen Anwendung auf den Code zuzugreifen, können Sie entweder die Assembly in die aktuelle Anwendungsdomäne laden oder eine neue Anwendungsdomäne erstellen und die Assembly darin laden. Wenn Sie die Assembly mit Assembly.LoadFrom in die aktuelle Anwendungsdomäne laden, können Sie mit Assembly.CreateInstance eine Instanz der RemoteObject-Klasse instanziieren, wodurch der Objektkonstruktor ausgeführt wird.

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");
}

Um die Assembly in eine andere Anwendungsdomäne zu laden, verwenden Sie AppDomain.ExecuteAssembly, um auf den Standardeinstiegspunkt zuzugreifen oder AppDomain.CreateInstance, um eine Instanz der RemoteObject-Klasse zu erstellen. Durch das Erstellen der Instanz wird der Konstruktor ausgeführt.

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");
}

Falls Sie die Assembly nicht programmgesteuert laden möchten, verwenden Sie im Projektmappen-Explorer den Befehl Verweis hinzufügen, um die Assembly HelloWorldRemote.exe anzugeben. Fügen Sie anschließend in den using-Block der Anwendung eine using HelloWorldRemote;-Direktive ein, und deklarieren Sie über den RemoteObject-Typ des Programms eine Instanz des RemoteObject-Objekts, und zwar folgendermaßen:

static void Main()
{
    // This code creates an instance of RemoteObject, assuming HelloWorldRemote has been added as a reference:
    HelloWorldRemote.RemoteObject o = new HelloWorldRemote.RemoteObject();
}

Siehe auch

Konzepte

C#-Programmierhandbuch

Übersicht über Anwendungsdomänen

Anwendungsdomänen und Assemblys

Programmieren mit Anwendungsdomänen

Referenz

Anwendungsdomänen (C#-Programmierhandbuch)

Weitere Ressourcen

Anwendungsdomänen

Programmieren mit Anwendungsdomänen und Assemblys