Laden und Ausführen von Benutzercode
Ein Host wird erstellt, um eine Anwendungsumgebung einzurichten, in der verwalteter Benutzercode ausgeführt werden soll. In diesem Kontext ist Benutzercode jeglicher verwalteter Code, der nicht ausdrücklich zum Host gehört. So besteht z. B. für den Internet Explorer-Host Benutzercode in den verwalteten Steuerelementen und Skripts, die die HTML-Seiten umfassen. Für einen Anwendungsserverhost ist Benutzercode der Code, der die vom Anwendungsserver verwalteten und ausgeführten Geschäftsregeln enthält.
Verwalteter Code ist immer Teil einer Assembly-Klasse. Daher basieren alle Methoden zum Laden und Ausführen von verwaltetem Code auf Assemblys. Beispielweise enthalten die System.AppDomain-Klasse und die System.Reflection.Assembly-Klasse Methoden, mit denen ein Host eine Assembly laden kann. Load-Methoden gibt es in verschiedenen Formen: einige tragen einen Assemblynamen, andere verfügen über einen vollständigen Dateisystempfad zu der Datei, die das Assemblymanifest enthält, usw. Diese Methoden dienen zum Laden von Assemblys, die zuvor erstellt und auf dem Datenträger gespeichert wurden.
Angenommen, der oben erwähnte Anwendungsserverhost gestattet Benutzern, Geschäftsregeln auf der Basis von verwaltetem Code zu schreiben, die in den Anwendungsserverprozess geladen und ausgeführt werden sollen. Wenn eine Anforderung zur Ausführung einer Methode zum Anwendungsserver gelangt, legt der Laufzeithostingcode des Servers fest, in welcher Domäne der Code ausgeführt werden soll und ob eine neue Domäne erstellt werden muss. Im Laufzeithostingcode wird anschließend eine der Load-Methoden verwendet, um die Assembly zu laden, die die Geschäftsregeln enthält. Darüber hinaus wird Reflektion zum Ausführen einer Methode für diese Geschäftsregel verwendet. Weitere Informationen finden Sie in der Dokumentation zum System.Reflection-Namespace.
Der System.Reflection.Emit-Namespace stellt auch Typen zum dynamischen Erstellen von Assemblys bereit. Es ist hilfreich, Assemblys auf diese Weise zu laden, wenn die Anwendung Skriptcode verarbeitet.
Ein Beispiel: Textverarbeitungsprogramme können eine Makrosprache unterstützen, mit der Benutzer das Verhalten der Anwendung anpassen können. Nachdem Common Language Runtime geladen und eine Anwendungsdomäne erstellt wurde, kompiliert das Textverarbeitungsprogramm die Makroskripts in verwaltetem Code und erstellt mithilfe von System.Reflection.Emit eine Assembly. Die erstellte Assembly kann anschließend in die Anwendungsdomäne geladen und ausgeführt werden. Je nach Szenario besteht die Assembly möglicherweise nur für die Dauer der Anwendung, d. h. sie wird nicht auf dem Datenträger gespeichert.