AnwendungsdomänenApplication domains

Betriebssysteme und Laufzeitumgebungen sorgen i. d. R. für eine gewisse Isolierung der Anwendungen voneinander.Operating systems and runtime environments typically provide some form of isolation between applications. Windows verwendet beispielsweise Prozesse, um Anwendungen zu isolieren.For example, Windows uses processes to isolate applications. Diese Isolierung ist erforderlich, um sicherzustellen, dass der in einer Anwendung ausgeführte Code andere, unabhängig davon ausgeführte Anwendungen nicht beeinträchtigt.This isolation is necessary to ensure that code running in one application cannot adversely affect other, unrelated applications.

Anwendungsdomänen stellen eine Isolationsbegrenzung aus Gründen der Sicherheit, Zuverlässigkeit und Versionszuweisung sowie zum Entladen von Assemblys bereit.Application domains provide an isolation boundary for security, reliability, and versioning, and for unloading assemblies. Anwendungsdomänen werden meist von Laufzeithosts erstellt, die vor dem Ausführen einer Anwendung als Bootstrapper für die Common Language Runtime fungieren.Application domains are typically created by runtime hosts, which are responsible for bootstrapping the common language runtime before an application is run.

Vorteile der Isolation von AnwendungenThe benefits of isolating applications

Traditionell werden auf dem gleichen Computer ausgeführte Anwendungen durch Prozessgrenzen isoliert.Historically, process boundaries have been used to isolate applications running on the same computer. Jede Anwendung wird in einen eigenen Prozess geladen, wodurch die Anwendung von anderen auf dem gleichen Computer ausgeführten Anwendungen isoliert wird.Each application is loaded into a separate process, which isolates the application from other applications running on the same computer.

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.The applications are isolated because memory addresses are process-relative; a memory pointer passed from one process to another cannot be used in any meaningful way in the target process. Außerdem können Sie keine direkten Aufrufe zwischen zwei Prozessen durchführen.In addition, you cannot make direct calls between two processes. Stattdessen müssen Sie Proxys verwenden, die eine Dereferenzierungsebene bieten.Instead, you must use proxies, which provide a level of indirection.

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).Managed code must be passed through a verification process before it can be run (unless the administrator has granted permission to skip the verification). 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.The verification process determines whether the code can attempt to access invalid memory addresses or perform some other action that could cause the process in which it is running to fail to operate properly. Code, der die Überprüfung bestanden hat, gilt als typsicher.Code that passes the verification test is said to be type-safe. 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.The ability to verify code as type-safe enables the common language runtime to provide as great a level of isolation as the process boundary, at a much lower performance cost.

Anwendungsdomänen bieten eine sicherere und flexiblere Verarbeitungseinheit, mit der die Common Language Runtime Anwendungen isolieren kann.Application domains provide a more secure and versatile unit of processing that the common language runtime can use to provide isolation between applications. 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.You can run several application domains in a single process with the same level of isolation that would exist in separate processes, but without incurring the additional overhead of making cross-process calls or switching between processes. Durch das Ausführen mehrerer Anwendungen in einem einzelnen Prozess wird die Skalierbarkeit des Servers erheblich erhöht.The ability to run multiple applications within a single process dramatically increases server scalability.

Das Isolieren von Anwendungen ist auch für die Anwendungssicherheit wichtig.Isolating applications is also important for application security. 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.For example, you can run controls from several Web applications in a single browser process in such a way that the controls cannot access each other's data and resources.

Die Isolierung durch Anwendungsdomänen bietet folgende Vorteile:The isolation provided by application domains has the following benefits:

  • Fehler in einer Anwendung haben keine Auswirkungen auf andere Anwendungen.Faults in one application cannot affect other applications. 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.Because type-safe code cannot cause memory faults, using application domains ensures that code running in one domain cannot affect other applications in the process.

  • Einzelne Anwendungen können beendet werden, ohne den gesamten Prozess zu beenden.Individual applications can be stopped without stopping the entire process. Mit Anwendungsdomänen können Sie den in einer Anwendung ausgeführten Code entladen.Using application domains enables you to unload the code running in a single application.

    Hinweis

    Einzelne Assemblys oder Typen können nicht entladen werden.You cannot unload individual assemblies or types. Es können nur vollständige Domänen entladen werden.Only a complete domain can be unloaded.

  • Der in einer Anwendung ausgeführte Code kann nicht direkt auf Code oder Ressourcen anderer Anwendungen zugreifen.Code running in one application cannot directly access code or resources from another application. Die Common Language Runtime stellt diese Isolierung sicher, indem direkte Aufrufe zwischen Objekten unterschiedlicher Anwendungsdomänen verhindert werden.The common language runtime enforces this isolation by preventing direct calls between objects in different application domains. Zwischen Domänen übergebene Objekte werden kopiert, oder der Zugriff erfolgt über einen Proxy.Objects that pass between domains are either copied or accessed by proxy. Wenn das Objekt kopiert wird, erfolgen die Aufrufe des Objekts lokal.If the object is copied, the call to the object is local. Das heißt, dass der Aufrufer und das Objekt, auf das verwiesen wird, zur gleichen Anwendungsdomäne gehören.That is, both the caller and the object being referenced are in the same application domain. Wenn auf das Objekt über einen Proxy zugegriffen wird, erfolgt der Aufruf des Objekts remote.If the object is accessed through a proxy, the call to the object is remote. In diesem Fall befinden sich der Aufrufer und das Objekt, auf das verwiesen wird, in unterschiedlichen Anwendungsdomänen.In this case, the caller and the object being referenced are in different application domains. Bei domänenübergreifenden Aufrufen wird die gleiche Infrastruktur für Remoteaufrufe verwendet wie bei Aufrufen zwischen Prozessen oder Computern.Cross-domain calls use the same remote call infrastructure as calls between two processes or between two machines. 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.As such, the metadata for the object being referenced must be available to both application domains to allow the method call to be JIT-compiled properly. Wenn die aufrufende Domäne nicht über Zugriff auf die Metadaten des aufgerufenen Objekts verfügt, kann die Kompilierung mit einer Ausnahme vom Typ FileNotFoundException fehlschlagen.If the calling domain does not have access to the metadata for the object being called, the compilation might fail with an exception of type FileNotFoundException. Weitere Informationen finden Sie unter Remote Objects.For more information, see Remote Objects. Der Mechanismus, mit dem ermittelt wird, wie domänenübergreifend auf Objekte zugegriffen werden kann, wird durch das Objekt bestimmt.The mechanism for determining how objects can be accessed across domains is determined by the object. Weitere Informationen finden Sie unter System.MarshalByRefObject.For more information, see System.MarshalByRefObject.

  • Das Verhalten von Code wird durch die Anwendung beschränkt, in der er ausgeführt wird.The behavior of code is scoped by the application in which it runs. 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.In other words, the application domain provides configuration settings such as application version policies, the location of any remote assemblies it accesses, and information about where to locate assemblies that are loaded into the domain.

  • Berechtigungen für Code können durch die Anwendungsdomäne gesteuert werden, in der dieser ausgeführt wird.Permissions granted to code can be controlled by the application domain in which the code is running.

Anwendungsdomänen und AssemblysApplication domains and assemblies

In diesem Abschnitt wird die Beziehung zwischen Anwendungsdomänen und Assemblys beschrieben.This section describes the relationship between application domains and assemblies. Sie müssen eine Assembly in eine Anwendungsdomäne laden, bevor Sie den darin enthaltenen Code ausführen können.You must load an assembly into an application domain before you can execute the code it contains. Durch das Ausführen einer typischen Anwendung werden mehrere Assemblys in eine Anwendungsdomäne geladen.Running a typical application causes several assemblies to be loaded into an application domain.

Die Art und Weise, wie eine Assembly geladen wird, legt fest, ob der zugehörige JIT-kompilierte (Just-In-Time) Code von mehreren Anwendungsdomänen im Prozess gemeinsam genutzt und ob die Assembly aus dem Prozess entladen werden kann.The way an assembly is loaded determines whether its just-in-time (JIT) compiled code can be shared by multiple application domains in the process, and whether the assembly can be unloaded from the process.

  • Wird eine Assembly domänenneutral geladen, können alle Anwendungsdomänen, die dieselbe Sicherheitsberechtigung gemeinsam nutzen, auch denselben JIT-kompilierten Code verwenden. Dadurch wird der von der Anwendung benötigte Speicher reduziert.If an assembly is loaded domain-neutral, all application domains that share the same security grant set can share the same JIT-compiled code, which reduces the memory required by the application. Die Assembly kann jedoch nie aus dem Prozess entladen werden.However, the assembly can never be unloaded from the process.

  • Wird eine Assembly nicht domänenneutral geladen, muss sie in jeder Anwendungsdomäne, in die sie geladen wird, JIT-kompiliert werden.If an assembly is not loaded domain-neutral, it must be JIT-compiled in every application domain in which it is loaded. Die Assembly kann jedoch aus dem Prozess entladen werden, indem alle Anwendungsdomänen entladen werden, in denen die Assembly geladen ist.However, the assembly can be unloaded from the process by unloading all the application domains in which it is loaded.

Der Laufzeithost legt beim Laden der Common Language Runtime in einen Prozess fest, ob Assemblys als domänenneutral geladen werden.The runtime host determines whether to load assemblies as domain-neutral when it loads the runtime into a process. Wenden Sie für verwaltete Anwendungen das LoaderOptimizationAttribute-Attribut auf die Einstiegspunktmethode für den Prozess an, und geben Sie einen Wert aus der dazugehörigen LoaderOptimization-Enumeration an.For managed applications, apply the LoaderOptimizationAttribute attribute to the entry-point method for the process, and specify a value from the associated LoaderOptimization enumeration. Geben Sie für nicht verwaltete Anwendungen, in denen sich die Common Language Runtime befindet, beim Aufrufen der CorBindToRuntimeEx-Methode das entsprechende Flag an.For unmanaged applications that host the common language runtime, specify the appropriate flag when you call the CorBindToRuntimeEx Function method.

Es gibt drei Möglichkeiten für das Laden domänenneutraler Assemblys:There are three options for loading domain-neutral assemblies:

  • LoaderOptimization.SingleDomain – Es werden keine Assemblys als domänenneutral geladen, mit Ausnahme von Mscorlib, die immer domänenneutral geladen wird.LoaderOptimization.SingleDomain loads no assemblies as domain-neutral, except Mscorlib, which is always loaded domain-neutral. Diese Einstellung wird als Einzeldomäne bezeichnet, da sie häufig verwendet wird, wenn der Host nur eine Anwendung im Prozess ausführt.This setting is called single domain because it is commonly used when the host is running only a single application in the process.

  • LoaderOptimization.MultiDomain – Alle Assemblys werden als domänenneutral geladen.LoaderOptimization.MultiDomain loads all assemblies as domain-neutral. Verwenden Sie diese Einstellung, wenn es mehrere Anwendungsdomänen im Prozess gibt, die alle den gleichen Code ausführen.Use this setting when there are multiple application domains in the process, all of which run the same code.

  • LoaderOptimization.MultiDomainHost – Assemblys mit starkem Namen werden als domänenneutral geladen, wenn sie und alle zugehörigen Abhängigkeiten im globalen Assemblycache installiert worden sind.LoaderOptimization.MultiDomainHost loads strong-named assemblies as domain-neutral, if they and all their dependencies have been installed in the global assembly cache. Andere Assemblys werden geladen und für jede Anwendungsdomäne, in der sie geladen sind, separat JIT-kompiliert und können daher aus dem Prozess entladen werden.Other assemblies are loaded and JIT-compiled separately for each application domain in which they are loaded, and thus can be unloaded from the process. Verwenden Sie diese Einstellung, wenn mehrere Anwendungen in demselben Prozess ausgeführt werden oder wenn es eine Mischung aus Assemblys gibt, die von vielen Anwendungsdomänen und Assemblys gemeinsam genutzt werden, die aus dem Prozess entladen werden müssen.Use this setting when running more than one application in the same process, or if you have a mixture of assemblies that are shared by many application domains and assemblies that need to be unloaded from the process.

JIT-kompilierter Code kann nicht gemeinsam von Assemblys genutzt werden, die mit der LoadFrom-Methode der Assembly-Klasse in den LoadFrom-Kontext geladen werden oder die aus Abbildern mithilfe von Überladungen der Load-Methode geladen werden, die Bytearrays angeben.JIT-compiled code cannot be shared for assemblies loaded into the load-from context, using the LoadFrom method of the Assembly class, or loaded from images using overloads of the Load method that specify byte arrays.

Assemblys, die mit dem Native Image Generator (Ngen.exe) in nativen Code kompiliert wurden, können gemeinsam von Anwendungsdomänen genutzt werden, wenn sie beim erstmaligen Laden in einen Prozess als domänenneutral geladen werden.Assemblies that have been compiled to native code by using the Ngen.exe (Native Image Generator) can be shared between application domains, if they are loaded domain-neutral the first time they are loaded into a process.

JIT-kompilierter Code für die Assembly, die den Anwendungseinstiegspunkt enthält, kann nur gemeinsam genutzt werden, wenn alle zugehörigen Abhängigkeiten gemeinsam genutzt werden können.JIT-compiled code for the assembly that contains the application entry point is shared only if all its dependencies can be shared.

Eine domänenneutrale Assembly kann mehr als einmal JIT-kompiliert werden.A domain-neutral assembly can be JIT-compiled more than once. Wenn sich z. B. die Sicherheitsberechtigungen von zwei Anwendungsdomänen unterscheiden, können sie nicht denselben JIT-kompilierten Code gemeinsam nutzen.For example, when the security grant sets of two application domains are different, they cannot share the same JIT-compiled code. Jede Kopie einer JIT-kompilierten Assembly kann jedoch mit anderen Anwendungsdomänen gemeinsam genutzt werden, die über dieselben Berechtigungen verfügen.However, each copy of the JIT-compiled assembly can be shared with other application domains that have the same grant set.

Bei der Entscheidung, Assemblys als domänenneutral zu laden, müssen Sie einen Kompromiss zwischen einem geringeren Speicherbedarf und anderen Leistungsfaktoren finden.When you decide whether to load assemblies as domain-neutral, you must make a tradeoff between reducing memory use and other performance factors.

  • Der Zugriff auf statische Daten und Methoden erfolgt bei domänenneutralen Assemblys langsamer, weil eine Isolierung der Assemblys erforderlich ist.Access to static data and methods is slower for domain-neutral assemblies because of the need to isolate assemblies. Jede Anwendungsdomäne, die auf die Assembly zugreift, muss über eine eigene Kopie der statischen Daten verfügen, um domänenübergreifende Verweise auf Objekte in statischen Feldern zu verhindern.Each application domain that accesses the assembly must have a separate copy of the static data, to prevent references to objects in static fields from crossing domain boundaries. Daher enthält die Laufzeit zusätzliche Logik, mit der Aufrufer an die richtige Kopie der statischen Daten oder Methoden verwiesen werden.As a result, the runtime contains additional logic to direct a caller to the appropriate copy of the static data or method. Durch diese zusätzliche Logik wird der Aufruf verlangsamt.This extra logic slows down the call.

  • Alle Abhängigkeiten einer Assembly müssen beim domänenneutralen Laden der Assembly gefunden und geladen werden, denn eine Abhängigkeit, die nicht domänenneutral geladen werden kann, verhindert das domänenneutrale Laden der Assembly.All the dependencies of an assembly must be located and loaded when the assembly is loaded domain-neutral, because a dependency that cannot be loaded domain-neutral prevents the assembly from being loaded domain-neutral.

Anwendungsdomänen und ThreadsApplication domains and threads

Eine Anwendungsdomäne bildet eine Isolationsbegrenzung aus Gründen der Sicherheit, Versionszuweisung und Zuverlässigkeit sowie zum Entladen von verwaltetem Code.An application domain forms an isolation boundary for security, versioning, reliability, and unloading of managed code. Ein Thread wird vom Betriebssystem bereitgestellt und von der Common Language Runtime zum Ausführen von Code verwendet.A thread is the operating system construct used by the common language runtime to execute code. Zur Laufzeit wird der gesamte verwaltete Code in eine Anwendungsdomäne geladen und von einem oder mehreren verwalteten Threads ausgeführt.At run time, all managed code is loaded into an application domain and is run by one or more managed threads.

Es gibt keine eindeutige Korrelation zwischen Anwendungsdomänen und Threads.There is not a one-to-one correlation between application domains and threads. Es können jederzeit mehrere Threads in einer Anwendungsdomäne ausgeführt werden, wobei ein bestimmter Thread nicht auf eine einzelne Anwendungsdomäne beschränkt ist.Several threads can execute in a single application domain at any given time, and a particular thread is not confined to a single application domain. Das heißt, dass Threads über die Grenzen von Anwendungsdomänen hinweg verwendet werden können. Es wird nicht für jede Anwendungsdomäne ein neuer Thread erstellt.That is, threads are free to cross application domain boundaries; a new thread is not created for each application domain.

Zu jedem Zeitpunkt werden alle Threads in einer Anwendungsdomäne ausgeführt.At any given time, every thread executes in an application domain. In jeder angegebenen Anwendungsdomäne können 0 (null), ein oder mehrere Threads ausgeführt werden.Zero, one, or multiple threads might be executing in any given application domain. Die Laufzeit verfolgt, welche Threads in welchen Anwendungsdomänen ausgeführt werden.The runtime keeps track of which threads are running in which application domains. Sie können jederzeit bestimmen, in welcher Domäne ein Thread ausgeführt wird, indem Sie die Thread.GetDomain-Methode aufrufen.You can locate the domain in which a thread is executing at any time by calling the Thread.GetDomain method.

Anwendungsdomänen und KulturenApplication domains and cultures

Die Kultur, die durch ein CultureInfo-Objekt dargestellt wird, ist Threads zugeordnet.Culture, which is represented by a CultureInfo object, is associated with threads. Sie können die dem aktuell ausgeführten Thread zugeordnete Kultur abrufen, indem Sie die CultureInfo.CurrentCulture-Eigenschaft verwenden. Mit der Thread.CurrentCulture-Eigenschaft können Sie die dem aktuell ausgeführten Thread zugeordnete Kultur abrufen oder festlegen.You can get the culture that is associated with the currently executing thread by using the CultureInfo.CurrentCulture property, and you can get or set the culture that is associated with the currently executing thread by using the Thread.CurrentCulture property. Wenn die einem Thread zugeordnete Kultur durch Verwendung der Thread.CurrentCulture-Eigenschaft explizit festgelegt wurde, bleibt sie diesem Thread zugeordnet, wenn der Thread Anwendungsdomänengrenzen überschreitet.If the culture that is associated with a thread has been explicitly set by using the Thread.CurrentCulture property, it continues to be associated with that thread when the thread crosses application domain boundaries. Andernfalls wird die Kultur, die dem Thread jeweils zugeordnet ist, durch den Wert der CultureInfo.DefaultThreadCurrentCulture-Eigenschaft in der Anwendungsdomäne bestimmt, in der der Thread ausgeführt wird:Otherwise, the culture that is associated with the thread at any given time is determined by the value of the CultureInfo.DefaultThreadCurrentCulture property in the application domain in which the thread is executing:

  • Wenn der Wert der Eigenschaft nicht null ist, wird die Kultur, die von der Eigenschaft zurückgegeben wird, dem Thread zugeordnet (und daher durch die Thread.CurrentCulture-Eigenschaft und die CultureInfo.CurrentCulture-Eigenschaft zurückgegeben).If the value of the property is not null, the culture that is returned by the property is associated with the thread (and therefore returned by the Thread.CurrentCulture and CultureInfo.CurrentCulture properties).

  • Wenn der Wert der Eigenschaft null ist, wird die aktuelle Systemkultur dem Thread zugeordnet.If the value of the property is null, the current system culture is associated with the thread.

Programmieren mit AnwendungsdomänenProgramming with application domains

Anwendungsdomänen werden normalerweise programmgesteuert durch Laufzeithosts erstellt und geändert.Application domains are usually created and manipulated programmatically by runtime hosts. In einigen Fällen arbeiten aber auch Anwendungsprogramme mit Anwendungsdomänen.However, sometimes an application program might also want to work with application domains. Beispielsweise kann ein Anwendungsprogramm eine Anwendungskomponente in eine Domäne laden, um die Domäne (und die Komponente) entladen zu können, ohne dass die gesamte Anwendung angehalten werden muss.For example, an application program could load an application component into a domain to be able to unload the domain (and the component) without having to stop the entire application.

Die AppDomain ist die programmgesteuerte Schnittstelle zu Anwendungsdomänen.The AppDomain is the programmatic interface to application domains. Diese Klasse enthält Methoden zum Erstellen und Entladen von Domänen, zum Erstellen von Instanzen von Typen in Domänen und zum Registrieren von verschiedenen Benachrichtigungen wie das Entladen von Domänen.This class includes methods to create and unload domains, to create instances of types in domains, and to register for various notifications such as application domain unloading. In der folgenden Tabelle werden häufig verwendete AppDomain-Methoden aufgelistet.The following table lists commonly used AppDomain methods.

AppDomain-MethodeAppDomain Method BeschreibungDescription
CreateDomain Erstellt eine neue Anwendungsdomäne.Creates a new application domain. Es wird empfohlen, dass Sie eine Überladung dieser Methode verwenden, die ein AppDomainSetup-Objekt angibt.It is recommended that you use an overload of this method that specifies an AppDomainSetup object. Dies ist die bevorzugte Methode zum Festlegen der Eigenschaften einer neuen Domäne, z. B. die Anwendungsbasis oder das Stammverzeichnis für die Anwendung, des Speicherorts der Konfigurationsdatei für die Domäne und des Suchpfads, den die Common Language Runtime verwenden soll, um Assemblys in die Domäne zu laden.This is the preferred way to set the properties of a new domain, such as the application base, or root directory for the application; the location of the configuration file for the domain; and the search path that the common language runtime is to use to load assemblies into the domain.
ExecuteAssembly und ExecuteAssemblyByNameExecuteAssembly and ExecuteAssemblyByName Führt eine Assembly in der Anwendungsdomäne aus.Executes an assembly in the application domain. Hierbei handelt es sich um eine Instanzmethode, mit der Code in einer anderen Anwendungsdomäne ausgeführt werden kann, für die ein Verweis vorhanden ist.This is an instance method, so it can be used to execute code in another application domain to which you have a reference.
CreateInstanceAndUnwrap Erstellt eine Instanz eines angegebenen Typs in der Anwendungsdomäne und gibt einen Proxy zurück.Creates an instance of a specified type in the application domain, and returns a proxy. Verwenden Sie diese Methode, um das Laden der Assembly, die den erstellten Typ enthält, in die aufrufende Assembly zu vermeiden.Use this method to avoid loading the assembly containing the created type into the calling assembly.
Unload Fährt die Domäne ordnungsgemäß herunter.Performs a graceful shutdown of the domain. Die Anwendungsdomäne wird erst entladen, wenn alle in der Domäne ausgeführten Threads beendet wurden oder nicht mehr in der Domäne ausgeführt werden.The application domain is not unloaded until all threads running in the domain have either stopped or are no longer in the domain.

Hinweis

Die Common Language Runtime unterstützt keine Serialisierung der globalen Methoden. Daher können Delegaten nicht verwendet werden, um globale Methoden in anderen Anwendungsdomänen auszuführen.The common language runtime does not support serialization of global methods, so delegates cannot be used to execute global methods in other application domains.

Auch die in der Spezifikation zu den Hostingschnittstellen der Common Language Runtime beschriebenen nicht verwalteten Schnittstellen bieten Zugriff auf Anwendungsdomänen.The unmanaged interfaces described in the common language runtime Hosting Interfaces Specification also provide access to application domains. Mit Schnittstellen von nicht verwaltetem Code können Laufzeithosts Anwendungsdomänen in einem Prozess erstellen und Zugriff auf diese erlangen.Runtime hosts can use interfaces from unmanaged code to create and gain access to the application domains within a process.

COMPLUS_LoaderOptimization-UmgebungsvariableThe COMPLUS_LoaderOptimization environment variable

Eine Umgebungsvariable, die die Standardladeprogramm-Optimierungsrichtlinie einer ausführbaren Anwendung festgelegt.An environment variable that sets the default loader optimization policy of an executable application.

SyntaxSyntax

COMPLUS_LoaderOptimization = 1  

AnmerkungenRemarks

Eine typische Anwendung lädt mehrere Assemblys in eine Anwendungsdomäne, bevor der Code, den sie enthalten, ausgeführt werden kann.A typical application loads several assemblies into an application domain before the code they contain can be executed.

Die Methode, mit der die Assembly geladen wird, bestimmt, ob ihr Just-In-Time-(JIT)-kompilierter Code von mehreren Anwendungsdomänen im Prozess gemeinsam genutzt werden kann.The way the assembly is loaded determines whether its just-in-time (JIT) compiled code can be shared by multiple application domains in the process.

  • Wird eine Assembly domänenneutral geladen, können alle Anwendungsdomänen, die dieselbe Sicherheitsberechtigung gemeinsam nutzen, auch denselben JIT-kompilierten Code verwenden.If an assembly is loaded domain-neutral, all application domains that share the same security grant set can share the same JIT-compiled code. Dadurch wird der von der Anwendung benötigte Speicherplatz reduziert.This reduces the memory required by the application.

  • Wird eine Assembly nicht domänenneutral geladen, muss sie in jeder Anwendungsdomäne, in der sie geladen wird, JIT-kompiliert werden, und das Ladeprogramm darf keine internen Ressourcen über Anwendungsdomänen hinweg freigeben.If an assembly is not loaded domain-neutral, it must be JIT-compiled in every application domain in which it is loaded and the loader must not share internal resources across application domains.

Wenn dieser Wert auf 1 gesetzt ist, zwingt das COMPLUS_LoaderOptimizations-Umgebungsflag den Laufzeithost, alle Assemblys auf nicht domänenneutrale Weise zu laden, die als SingleDomain bezeichnet wird.When set to 1, the COMPLUS_LoaderOptimization environment flag forces the runtime host to load all assemblies in non-domain-neutral way known as SingleDomain. SingleDomain lädt keine Assemblys als domänenneutral, mit Ausnahme von Mscorlib, die immer domänenneutral geladen wird.SingleDomain loads no assemblies as domain-neutral, except Mscorlib, which is always loaded domain-neutral. Diese Einstellung wird als Einzeldomäne bezeichnet, da sie häufig verwendet wird, wenn der Host nur eine Anwendung im Prozess ausführt.This setting is called single domain because it is commonly used when the host is running only a single application in the process.

Achtung

Das COMPLUS_LoaderOptimizations-Umgebungsflag wurde für die Verwendung bei Diagnosen und Testszenarien entworfen.The COMPLUS_LoaderOptimization environment flag was designed to be used in diagnostic and test scenarios. Eine Aktivierung des Flags kann zu erheblichem Leistungsabfall führen und die Speicherauslastung erhöhen.Having the flag turned on can cause severe slow-down and increase in memory usage.

CodebeispielCode example

Durch den Anhang von COMPLUS_LoaderOptimization=1 an den Multi-Zeichenfolgen-Wert der Umgebung im HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN-Schlüssel kann erzwungen werden, dass keine Assemblys für den IISADMIN-Dienst als domänenneutral geladen werden.To force all assemblies not to be loaded as domain-neutral for the IISADMIN service can be achieved by appending COMPLUS_LoaderOptimization=1 to the Environment’s Multi-String Value in the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN key.

Key = HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN  
Name = Environment  
Type = REG_MULTI_SZ  
Value (to append) = COMPLUS_LoaderOptimization=1  

Siehe auchSee also