Übersicht über Anwendungsdomänen
Aktualisiert: November 2007
Traditionell werden auf dem gleichen Computer ausgeführte Anwendungen durch Prozessgrenzen isoliert. Jede Anwendung wird in einen eigenen Prozess geladen, wodurch die Anwendung von anderen auf dem gleichen Computer ausgeführten Anwendungen isoliert wird.
Die Anwendungen sind isoliert, da Speicheradressen prozessabhängig sind. Ein von einem Prozess an einen anderen Prozess übergebener Speicherzeiger kann im Zielprozess nicht sinnvoll verwendet werden. Außerdem können Sie keine direkten Aufrufe zwischen zwei Prozessen durchführen. Stattdessen müssen Sie Proxys verwenden, die eine Dereferenzierungsebene bieten.
Verwalteter Code muss einen Überprüfungsvorgang durchlaufen, bevor er ausgeführt werden kann (sofern der Administrator nicht eine Berechtigung zum Überspringen der Überprüfung erteilt hat). Während des Überprüfungsvorgang wird ermittelt, ob Code Zugriffsversuche auf ungültige Speicheradressen oder andere Aktionen ausführen kann, durch die der Prozess, in dem er ausgeführt wird, nicht richtig ausgeführt werden könnte. Code, der die Überprüfung bestanden hat, gilt als typsicher. Durch die Möglichkeit, Code auf Typsicherheit zu prüfen, bietet die Common Language Runtime den gleichen Grad der Isolierung wie Prozessgrenzen bei geringeren Leistungseinbußen.
Anwendungsdomänen bieten eine sicherere und flexiblere Verarbeitungseinheit, mit der die Common Language Runtime Anwendungen isolieren kann. Sie können mehrere Anwendungsdomänen in einem Prozess ausführen und dabei ohne den Mehraufwand durch prozessübergreifende Aufrufe oder das Umschalten zwischen Prozessen die gleiche Isolierung gewährleisten wie beim Ausführen in getrennten Prozessen. Durch das Ausführen mehrerer Anwendungen in einem einzelnen Prozess wird die Skalierbarkeit des Servers erheblich erhöht.
Das Isolieren von Anwendungen ist auch für die Anwendungssicherheit wichtig. Sie können z. B. Steuerelemente aus unterschiedlichen Webanwendungen in einem einzelnen Browserprozess ausführen, wobei die Steuerelemente nicht auf die Daten und Ressourcen der jeweils anderen Steuerelemente zugreifen können.
Die Isolierung durch Anwendungsdomänen bietet folgende Vorteile:
Fehler in einer Anwendung haben keine Auswirkungen auf andere Anwendungen. Da typsicherer Code keine Speicherfehler verursacht, ist bei der Verwendung von Anwendungsdomänen sichergestellt, dass der in einer Domäne ausgeführte Code keine anderen Anwendungen in dem Prozess beeinflussen kann.
Einzelne Anwendungen können beendet werden, ohne den gesamten Prozess zu beenden. Mit Anwendungsdomänen können Sie den in einer Anwendung ausgeführten Code entladen.
Hinweis: Einzelne Assemblys oder Typen können nicht entladen werden. Es können nur vollständige Domänen entladen werden.
Der in einer Anwendung ausgeführte Code kann nicht direkt auf Code oder Ressourcen anderer Anwendungen zugreifen. Die Common Language Runtime stellt diese Isolierung sicher, indem direkte Aufrufe zwischen Objekten unterschiedlicher Anwendungsdomänen verhindert werden. Zwischen Domänen übergebene Objekte werden kopiert, oder der Zugriff erfolgt über einen Proxy. Wenn das Objekt kopiert wird, erfolgen die Aufrufe des Objekts lokal. Das heißt, dass der Aufrufer und das Objekt, auf das verwiesen wird, zur gleichen Anwendungsdomäne gehören. Wenn auf das Objekt über einen Proxy zugegriffen wird, erfolgt der Aufruf des Objekts remote. In diesem Fall befinden sich der Aufrufer und das Objekt, auf das verwiesen wird, in unterschiedlichen Anwendungsdomänen. Bei domänenübergreifenden Aufrufen wird die gleiche Infrastruktur für Remoteaufrufe verwendet wie bei Aufrufen zwischen Prozessen oder Computern. Daher müssen die Metadaten zu dem Objekt, auf das verwiesen wird, für beide Anwendungsdomänen verfügbar sein, damit die JIT-Kompilierung des Methodenaufrufs ordnungsgemäß durchgeführt werden kann. Wenn die aufrufende Domäne nicht über Zugriff auf die Metadaten des aufgerufenen Objekts verfügt, kann die Kompilierung mit einer Ausnahme vom Typ System.IO.FileNotFound fehlschlagen. Ausführliche Informationen finden Sie unter .NET-Remoting. Der Mechanismus, mit dem ermittelt wird, wie domänenübergreifend auf Objekte zugegriffen werden kann, wird durch das Objekt bestimmt. Weitere Informationen finden Sie unter der MarshalByRefObject-Klasse.
Das Verhalten von Code wird durch die Anwendung beschränkt, in der er ausgeführt wird. Die Anwendungsdomäne stellt Konfigurationseinstellungen bereit, z. B. Richtlinien der Anwendungsversion, den Speicherort von Remoteassemblys, auf die zugegriffen wird, sowie Informationen zum Suchen von Assemblys, die in die Domäne geladen werden.
Berechtigungen für Code können durch die Anwendungsdomäne gesteuert werden, in der dieser ausgeführt wird.