Ausführen von Code in einer anderen Anwendungsdomäne (C# und Visual Basic)

Sobald eine Assembly in eine Anwendungsdomäne geladen worden ist, kann der in der Assembly enthaltene Code ausgeführt werden. Der einfachste Weg zum Laden einer Assembly 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.

Der folgende Code erstellt eine Assembly, die aus einem einzelnen Namespace und zwei Klassen besteht. Fügen Sie den Code in eine Visual Studio-Konsolenanwendung mit dem Namen HelloWorldRemote ein, erstellen Sie die Lösung oder führen Sie diese aus, und schließen Sie sie dann. Suchen Sie die Datei HelloWorldRemote.exe im obj/Debug-Ordner des Projekts, und kopieren Sie die Datei auf Laufwerk 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)");
        }
    }
}

Um von einer anderen Anwendung auf den Code zuzugreifen, können Sie entweder die Assembly in die aktuelle Anwendungsdomäne laden, oder Sie können eine neue Anwendungsdomäne erstellen und die Assembly darin laden.

Um die Assembly in die aktuelle Anwendungsdomäne zu laden, indem Sie Assembly.LoadFrom verwenden, können Sie Assembly.CreateInstance verwenden, um eine Instanz der RemoteObject-Klasse zu instanziieren. Die Instanziierung bewirkt, dass der Objektkonstruktor ausgeführt wird.

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

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.

Hinweis

Weitere Informationen zu den Nachteilen der Verwendung von Assembly.LoadFrom finden Sie im Hinweisabschnitt von 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");

Wenn Sie die Assembly nicht programmgesteuert laden möchten, geben Sie die Assembly HelloWorldRemote.exe im Projektmappen-Explorer mit Verweis hinzufügen an. Fügen Sie in C# eine using HelloWorldRemote;-Direktive, in Visual Basic eine Imports HelloWorldRemote-Anweisung hinzu. Verwenden Sie dann den RemoteObject-Typ in Ihrem Programm, um eine Instanz des RemoteObject-Objekts wie im folgenden Beispiel zu deklarieren.

' 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();

Siehe auch

Referenz

Anwendungsdomänen (C# und Visual Basic)

Konzepte

C#-Programmierhandbuch

Anwendungsdomänen und Assemblys

Programmieren mit Anwendungsdomänen

Weitere Ressourcen

Visual Basic-Programmierhandbuch

Anwendungsdomänen

Programmieren mit Anwendungsdomänen und Assemblys