Domeny aplikacjiApplication domains

Systemy operacyjne i środowiska uruchomieniowe zwykle zapewniają pewną postać izolacji między aplikacjami.Operating systems and runtime environments typically provide some form of isolation between applications. Na przykład system Windows używa procesów do izolowania aplikacji.For example, Windows uses processes to isolate applications. Ta izolacja jest niezbędna do zapewnienia, że kod uruchomiony w jednej aplikacji nie może mieć negatywnego wpływu na inne niepowiązane aplikacje.This isolation is necessary to ensure that code running in one application cannot adversely affect other, unrelated applications.

Domeny aplikacji zapewniają granicę izolacji w zakresie zabezpieczeń, niezawodności i przechowywania wersji oraz do zwalniania zestawów.Application domains provide an isolation boundary for security, reliability, and versioning, and for unloading assemblies. Domeny aplikacji są zwykle tworzone przez hosty środowiska uruchomieniowego, które są odpowiedzialne za uruchamianie środowiska uruchomieniowego języka wspólnego przed uruchomieniem aplikacji.Application domains are typically created by runtime hosts, which are responsible for bootstrapping the common language runtime before an application is run.

Zalety izolowania aplikacjiThe benefits of isolating applications

W przeszłości, granice procesów zostały użyte do izolowania aplikacji uruchomionych na tym samym komputerze.Historically, process boundaries have been used to isolate applications running on the same computer. Każda aplikacja jest ładowana do oddzielnego procesu, który izoluje aplikację od innych aplikacji uruchomionych na tym samym komputerze.Each application is loaded into a separate process, which isolates the application from other applications running on the same computer.

Aplikacje są izolowane, ponieważ adresy pamięci są względne dla procesu; wskaźnika pamięci przesyłanego z jednego procesu do innego nie można użyć w sposób znaczący w procesie docelowym.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. Ponadto nie można wykonywać bezpośrednich wywołań między dwoma procesami.In addition, you cannot make direct calls between two processes. Zamiast tego należy użyć serwerów proxy, które zapewniają poziom pośredni.Instead, you must use proxies, which provide a level of indirection.

Kod zarządzany musi być przeszedł przez proces weryfikacji, aby można go było uruchomić (chyba że administrator udzielił uprawnień do pominięcia weryfikacji).Managed code must be passed through a verification process before it can be run (unless the administrator has granted permission to skip the verification). Proces weryfikacji określa, czy kod może próbować uzyskać dostęp do nieprawidłowych adresów pamięci lub wykonać inną akcję, która może spowodować, że proces, w którym działa, nie działa prawidłowo.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. Kod, który przekazuje test weryfikacyjny, jest nazywany bezpiecznym typem.Code that passes the verification test is said to be type-safe. Możliwość weryfikowania kodu jako bezpiecznego pozwala zapewnić, że środowisko uruchomieniowe języka wspólnego zapewnia jak doskonały poziom izolacji w ramach granicy procesu, z znacznie niższym kosztem wydajności.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.

Domeny aplikacji zapewniają bardziej bezpieczną i uniwersalną jednostkę przetwarzania, którą środowisko uruchomieniowe języka wspólnego może wykorzystać w celu zapewnienia izolacji między aplikacjami.Application domains provide a more secure and versatile unit of processing that the common language runtime can use to provide isolation between applications. W pojedynczym procesie można uruchomić kilka domen aplikacji z takim samym poziomem izolacji, który będzie istniał w oddzielnych procesach, ale bez ponoszenia dodatkowych kosztów związanych z wykonywaniem wywołań między procesami lub przełączaniem między procesami.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. Możliwość uruchamiania wielu aplikacji w ramach jednego procesu znacznie zwiększa skalowalność serwera.The ability to run multiple applications within a single process dramatically increases server scalability.

Izolowanie aplikacji jest również ważne w przypadku zabezpieczeń aplikacji.Isolating applications is also important for application security. Można na przykład uruchomić kontrolki z kilku aplikacji sieci Web w ramach pojedynczego procesu przeglądarki w taki sposób, że kontrolki nie będą mogły uzyskać dostępu do danych i zasobów.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.

Izolacja zapewniana przez domeny aplikacji ma następujące zalety:The isolation provided by application domains has the following benefits:

  • Błędy w jednej aplikacji nie mogą mieć wpływu na inne aplikacje.Faults in one application cannot affect other applications. Ponieważ kod bezpieczny dla typu nie może spowodować błędów pamięci, korzystanie z domen aplikacji zapewnia, że kod uruchomiony w jednej domenie nie może wpływać na inne aplikacje w procesie.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.

  • Pojedyncze aplikacje można zatrzymać bez zatrzymywania całego procesu.Individual applications can be stopped without stopping the entire process. Używanie domen aplikacji umożliwia zwolnienie kodu działającego w pojedynczej aplikacji.Using application domains enables you to unload the code running in a single application.

    Uwaga

    Nie można zwolnić pojedynczych zestawów lub typów.You cannot unload individual assemblies or types. Można zwolnić tylko pełną domenę.Only a complete domain can be unloaded.

  • Kod uruchomiony w jednej aplikacji nie może bezpośrednio uzyskać dostępu do kodu lub zasobów z innej aplikacji.Code running in one application cannot directly access code or resources from another application. Środowisko uruchomieniowe języka wspólnego wymusza tę izolację, uniemożliwiając bezpośrednie wywołania między obiektami w różnych domenach aplikacji.The common language runtime enforces this isolation by preventing direct calls between objects in different application domains. Obiekty, które przechodzą między domenami, są kopiowane lub dostępne przez serwer proxy.Objects that pass between domains are either copied or accessed by proxy. Jeśli obiekt jest kopiowany, wywołanie do obiektu jest lokalne.If the object is copied, the call to the object is local. Oznacza to, że zarówno obiekt wywołujący, jak i obiekt, do którego występuje odwołanie, znajdują się w tej samej domenie aplikacji.That is, both the caller and the object being referenced are in the same application domain. Jeśli dostęp do obiektu odbywa się za pomocą serwera proxy, wywołanie do obiektu jest zdalne.If the object is accessed through a proxy, the call to the object is remote. W takim przypadku obiekt wywołujący i obiekt, do którego się odwołuje się, znajdują się w różnych domenach aplikacji.In this case, the caller and the object being referenced are in different application domains. Wywołania między domenami używają tej samej infrastruktury wywołania zdalnego, co wywołania między dwoma procesami lub między dwoma maszynami.Cross-domain calls use the same remote call infrastructure as calls between two processes or between two machines. W związku z tym metadane obiektu, do którego odwołuje się odwołanie, muszą być dostępne dla obu domen aplikacji, aby umożliwić wywołanie metody w prawidłowym skompilowaniu JIT.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. Jeśli domena wywołująca nie ma dostępu do metadanych dla wywoływanego obiektu, kompilacja może zakończyć się niepowodzeniem z wyjątkiem typu FileNotFoundException.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. Aby uzyskać więcej informacji, zobacz obiekty zdalne.For more information, see Remote Objects. Mechanizm określania sposobu, w jaki obiekty są dostępne między domenami, jest określany przez obiekt.The mechanism for determining how objects can be accessed across domains is determined by the object. Aby uzyskać więcej informacji, zobacz System.MarshalByRefObject.For more information, see System.MarshalByRefObject.

  • Zachowanie kodu jest ograniczone przez aplikację, w której jest uruchomiona.The behavior of code is scoped by the application in which it runs. Innymi słowy domena aplikacji udostępnia ustawienia konfiguracji, takie jak zasady wersji aplikacji, lokalizacja dowolnych zestawów zdalnych, do których uzyskuje dostęp, oraz informacje o lokalizacji, w których mają znajdować się zestawy, które są ładowane do domeny.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.

  • Uprawnienia przyznane do kodu mogą być kontrolowane przez domenę aplikacji, w której uruchomiono kod.Permissions granted to code can be controlled by the application domain in which the code is running.

Domeny aplikacji i zestawyApplication domains and assemblies

W tej sekcji opisano relację między domenami i zestawami aplikacji.This section describes the relationship between application domains and assemblies. Aby można było wykonać kod zawarty w zestawie, należy go załadować do domeny aplikacji.You must load an assembly into an application domain before you can execute the code it contains. Uruchomienie typowej aplikacji powoduje wczytanie kilku zestawów do domeny aplikacji.Running a typical application causes several assemblies to be loaded into an application domain.

Sposób ładowania zestawu określa, czy jego kod kompilowany dokładnie na czas (JIT) kod może być współużytkowany przez wiele domen aplikacji uczestniczących w procesie oraz czy zestaw można zwolnić z pamięci procesu.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.

  • Jeśli zestaw został załadowany jako neutralny dla domen, wszystkie domeny aplikacji mające ten sam zestaw uprawnień zabezpieczeń mogą współużytkować ten sam kod skompilowany dokładnie na czas, co zmniejsza zapotrzebowanie aplikacji na pamięć.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. Jednak zestawu nigdy nie można zwolnić z pamięci procesu.However, the assembly can never be unloaded from the process.

  • Jeśli zestaw nie jest wczytywany jako neutralny dla domen, musi być kompilowany dokładnie na czas w każdej domenie aplikacji, do której jest ładowany.If an assembly is not loaded domain-neutral, it must be JIT-compiled in every application domain in which it is loaded. Zestaw można jednak zwolnić z pamięci procesu poprzez zwolnienie wszystkich domen aplikacji, w których został załadowany.However, the assembly can be unloaded from the process by unloading all the application domains in which it is loaded.

Host środowiska uruchomieniowego określa, czy podczas ładowania środowiska uruchomieniowego do procesu ma ładować zestawy jako neutralne dla domen.The runtime host determines whether to load assemblies as domain-neutral when it loads the runtime into a process. W przypadku zarządzanych aplikacji należy zastosować atrybut LoaderOptimizationAttribute do metody punktu wejścia procesu oraz określić wartość z powiązanego wyliczenia LoaderOptimization.For managed applications, apply the LoaderOptimizationAttribute attribute to the entry-point method for the process, and specify a value from the associated LoaderOptimization enumeration. W przypadku niezarządzanych aplikacji, które obsługują środowisko uruchomieniowe języka wspólnego, należy określić odpowiednią flagę w przypadku wywołania metody funkcji CorBindToRuntimeEx .For unmanaged applications that host the common language runtime, specify the appropriate flag when you call the CorBindToRuntimeEx Function method.

Istnieją trzy sposoby wczytywania zestawów jako neutralnych dla domen:There are three options for loading domain-neutral assemblies:

  • LoaderOptimization.SingleDomain nie ładuje zestawów jako neutralnych dla domen, z wyjątkiem zestawu Mscorlib, który zawsze jest ładowany jako neutralny dla domen.LoaderOptimization.SingleDomain loads no assemblies as domain-neutral, except Mscorlib, which is always loaded domain-neutral. To ustawienie nosi nazwę pojedynczej domeny, ponieważ jest często używane, gdy host uruchamia tylko jedną aplikację w procesie.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 wczytuje wszystkie zestawy jako neutralne dla domen.LoaderOptimization.MultiDomain loads all assemblies as domain-neutral. Tego ustawienia należy używać, gdy w procesie istnieje wiele domen aplikacji uruchamiających ten sam kod.Use this setting when there are multiple application domains in the process, all of which run the same code.

  • LoaderOptimization.MultiDomainHost ładuje zestawy o silnych nazwach jako neutralne dla domen, jeśli zestawy i ich obiekty zależne zostały zainstalowane w globalnej pamięć podręcznej zestawów.LoaderOptimization.MultiDomainHost loads strong-named assemblies as domain-neutral, if they and all their dependencies have been installed in the global assembly cache. Inne zestawy są wczytywane i kompilowane dokładnie na czas osobno dla każdej domeny aplikacji, do której zostały wczytane, dlatego można je zwolnić z pamięci procesu.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. Ustawienie należy stosować w przypadku, gdy w tym samym procesie działa więcej niż jedna aplikacja w tym samym procesie albo jeśli istnieje zbiór zestawów współużytkowanych przez wiele domen aplikacji oraz zestawów, które muszą być zwalniane z pamięci procesu.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.

Kod kompilowany dokładnie na czas nie może być współużytkowany przez zestawy ładowane w kontekście ich źródła pochodzenia za pomocą metody LoadFrom klasy Assembly ani ładowane z obrazów przy użyciu przeciążeń metody Load, która określa tablice bajtowe.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.

Zestawy, które zostały skompilowane do kodu natywnego przy użyciu programu Ngen. exe (Generator obrazu natywnego) , mogą być współużytkowane między domenami aplikacji, jeśli są załadowane jako niezależne od domeny podczas pierwszego ładowania do procesu.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.

Kod zestawu kompilowany dokładnie na czas, który zawiera punkt wejścia aplikacji, jest udostępniany tylko wtedy, gdy można współużytkować jego wszystkie zależności.JIT-compiled code for the assembly that contains the application entry point is shared only if all its dependencies can be shared.

Zestawy neutralny dla domen można kompilować dokładnie na czas więcej niż jeden raz.A domain-neutral assembly can be JIT-compiled more than once. Na przykład gdy dwie domeny aplikacji mają różne zestawy uprawnień zabezpieczeń, nie mogą używać tego samego kodu kompilowanego dokładnie na czas.For example, when the security grant sets of two application domains are different, they cannot share the same JIT-compiled code. Jednak każdą kopię zestawu kompilowanego dokładnie na czas można udostępnić innym domenom aplikacji, które mają taki sam zestaw uprawnień.However, each copy of the JIT-compiled assembly can be shared with other application domains that have the same grant set.

Decydując, czy zestawy mają być wczytywane jako neutralne dla domen, należy wziąć pod uwagę kompromis między ograniczeniem użycia pamięci a innymi czynnikami wydajnościowymi.When you decide whether to load assemblies as domain-neutral, you must make a tradeoff between reducing memory use and other performance factors.

  • Zestawy neutralne dla domen mają wolniejszy dostęp do statycznych danych i metod, ponieważ zestawy trzeba izolować.Access to static data and methods is slower for domain-neutral assemblies because of the need to isolate assemblies. Każda domena aplikacji uzyskująca dostęp do zestawu musi mieć oddzielną kopię danych statycznych, aby uniemożliwić odwołaniom w statycznych polach przekraczanie granic domeny.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. W rezultacie środowisko uruchomieniowe zawiera dodatkową logikę, która przekierowuje obiekt wywołujący do odpowiedniej kopii statycznych danych lub metody.As a result, the runtime contains additional logic to direct a caller to the appropriate copy of the static data or method. Ta dodatkowa logika spowalnia wywołanie.This extra logic slows down the call.

  • Gdy zestaw jest wczytywany jako niezależny od domen, muszą być odnajdowane i ładowane jego wszystkie zależności, ponieważ zależność, której nie można wczytać jako neutralnej dla domen, uniemożliwia wczytanie w ten sposób całego zestawu.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.

Domeny aplikacji i wątkiApplication domains and threads

Domena aplikacji tworzy granicę izolacji w celu zapewnienia bezpieczeństwa, przechowywania wersji, niezawodności i zwalniania kodu zarządzanego.An application domain forms an isolation boundary for security, versioning, reliability, and unloading of managed code. Wątek to konstrukcja systemu operacyjnego używana przez środowisko uruchomieniowe języka wspólnego do wykonywania kodu.A thread is the operating system construct used by the common language runtime to execute code. W czasie wykonywania cały kod zarządzany jest ładowany do domeny aplikacji i uruchamiany przez co najmniej jeden zarządzany wątek.At run time, all managed code is loaded into an application domain and is run by one or more managed threads.

Między domenami i wątkami aplikacji nie istnieje korelacja typu jeden-do-jednego.There is not a one-to-one correlation between application domains and threads. Kilka wątków można wykonać w jednej domenie aplikacji w dowolnym momencie, a określony wątek nie jest ograniczany do pojedynczej domeny aplikacji.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. Oznacza to, że wątki są bezpłatne, aby przekroczyć granice domeny aplikacji; dla każdej domeny aplikacji nie jest tworzony nowy wątek.That is, threads are free to cross application domain boundaries; a new thread is not created for each application domain.

W danym momencie każdy wątek jest wykonywany w domenie aplikacji.At any given time, every thread executes in an application domain. W każdej domenie aplikacji może być wykonywane zero, jeden lub wiele wątków.Zero, one, or multiple threads might be executing in any given application domain. Środowisko uruchomieniowe śledzi, które wątki działają w ramach których domen aplikacji.The runtime keeps track of which threads are running in which application domains. Można zlokalizować domenę, w której wykonywany jest wątek w dowolnym momencie, wywołując metodę Thread.GetDomain.You can locate the domain in which a thread is executing at any time by calling the Thread.GetDomain method.

Domeny aplikacji i kulturyApplication domains and cultures

Kultura, która jest reprezentowana przez obiekt CultureInfo, jest skojarzona z wątkami.Culture, which is represented by a CultureInfo object, is associated with threads. Można uzyskać kulturę, która jest skojarzona z aktualnie wykonywanym wątkiem za pomocą właściwości CultureInfo.CurrentCulture i można pobrać lub ustawić kulturę skojarzoną z aktualnie wykonywanym wątkiem za pomocą właściwości Thread.CurrentCulture.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. Jeśli kultura, która jest skojarzona z wątkiem, została jawnie ustawiona przy użyciu właściwości Thread.CurrentCulture, będzie nadal skojarzona z tym wątkiem, gdy wątek przekroczy granice domeny aplikacji.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. W przeciwnym razie kultura, która jest skojarzona z wątkiem w danym momencie jest określona przez wartość właściwości CultureInfo.DefaultThreadCurrentCulture w domenie aplikacji, w której jest wykonywany wątek: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:

  • Jeśli wartość właściwości nie jest null, kultura zwracana przez właściwość jest skojarzona z wątkiem (i dlatego jest zwracana przez właściwości Thread.CurrentCulture i CultureInfo.CurrentCulture).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).

  • Jeśli wartość właściwości jest null, bieżąca kultura systemu jest skojarzona z wątkiem.If the value of the property is null, the current system culture is associated with the thread.

Programowanie przy użyciu domen aplikacjiProgramming with application domains

Zazwyczaj domeny aplikacji tworzy się i wykonuje na nich operacje programowo za pomocą hostów środowiska uruchomieniowego.Application domains are usually created and manipulated programmatically by runtime hosts. Czasami jednak z domenami aplikacji chcą pracować programy.However, sometimes an application program might also want to work with application domains. Na przykład program może wczytywać składnik aplikacji do domeny, aby umożliwić zwolnienie domeny (i składnika) z pamięci bez konieczności zatrzymywania całej aplikacji.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.

@No__t-0 to interfejs programistyczny dla domen aplikacji.The AppDomain is the programmatic interface to application domains. Zawiera ona metody tworzenia domen i zwalniania ich z pamięci, tworzenia wystąpień typów w domenach oraz rejestrowania w celu otrzymywania różnych powiadomień, np. o zwalnianiu domen aplikacji z pamięci.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. W poniższej tabeli wymieniono często używane metody AppDomain.The following table lists commonly used AppDomain methods.

Metoda klasy AppDomainAppDomain Method OpisDescription
CreateDomain Tworzenie nowej domeny aplikacji.Creates a new application domain. Zaleca się używanie przeciążenia tej metody, które określa obiekt AppDomainSetup.It is recommended that you use an overload of this method that specifies an AppDomainSetup object. Jest to preferowany sposób konfigurowania właściwości nowej domeny, takich jak baza aplikacji czy główny katalog aplikacji, lokalizacja pliku konfiguracji domeny oraz ścieżka wyszukiwania, z której środowisko uruchomieniowe języka wspólnego ma ładować zestawy do domeny.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 i ExecuteAssemblyByNameExecuteAssembly and ExecuteAssemblyByName Wykonywanie zestawu w domenie aplikacji.Executes an assembly in the application domain. To jest metoda wystąpienia, dlatego może służyć do wykonywania kodu w innej domenie aplikacji, do której prowadzi odwołanie.This is an instance method, so it can be used to execute code in another application domain to which you have a reference.
CreateInstanceAndUnwrap Tworzenie wystąpienie wskazanego typu w domenie aplikacji oraz zwracanie danych serwera proxy.Creates an instance of a specified type in the application domain, and returns a proxy. Ta metoda pozwala uniknąć wczytywania zestawu zawierającego utworzony typ do wywoływanego zestawu.Use this method to avoid loading the assembly containing the created type into the calling assembly.
Unload Uporządkowanie wyłączanie domeny.Performs a graceful shutdown of the domain. Domena aplikacji zostanie zwolniona z pamięci dopiero wtedy, gdy wszystkie wątki uruchomione w domenie zostaną zatrzymane lub przestaną być obecne w domenie.The application domain is not unloaded until all threads running in the domain have either stopped or are no longer in the domain.

Uwaga

Środowisko uruchomieniowe języka wspólnego nie obsługuje serializacji metod globalnych, dlatego delegaci nie mogą wykonywać globalnych metod w innych domenach aplikacji.The common language runtime does not support serialization of global methods, so delegates cannot be used to execute global methods in other application domains.

Dostęp do domen aplikacji zapewniają również niezarządzane interfejsy opisane w specyfikacji interfejsów hostujących środowiska uruchomieniowego języka wspólnego.The unmanaged interfaces described in the common language runtime Hosting Interfaces Specification also provide access to application domains. Hosty środowiska uruchomieniowego mogą za pomocą interfejsów z niezarządzanego kodu tworzyć domeny aplikacji i uzyskiwać do nich dostęp wewnątrz procesu.Runtime hosts can use interfaces from unmanaged code to create and gain access to the application domains within a process.

Zmienna środowiskowa COMPLUS_LoaderOptimizationThe COMPLUS_LoaderOptimization environment variable

Zmienna środowiskowa, która ustawia domyślne zasady optymalizacji modułu ładującego aplikacji wykonywalnej.An environment variable that sets the default loader optimization policy of an executable application.

SkładniaSyntax

COMPLUS_LoaderOptimization = 1  

UwagiRemarks

Typowa aplikacja ładuje kilka zestawów do domeny aplikacji przed wykonaniem zawartego w nim kodu.A typical application loads several assemblies into an application domain before the code they contain can be executed.

Sposób ładowania zestawu określa, czy jego kod skompilowany just-in-Time (JIT) może być współużytkowany przez wiele domen aplikacji w procesie.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.

  • Jeśli zestaw jest ładowany jako neutralny dla domen, wszystkie domeny aplikacji, które mają ten sam zestaw uprawnień zabezpieczeń, mogą współużytkować ten sam kod skompilowany przez JIT.If an assembly is loaded domain-neutral, all application domains that share the same security grant set can share the same JIT-compiled code. Zmniejsza to ilość pamięci wymaganej przez aplikację.This reduces the memory required by the application.

  • Jeśli zestaw nie jest ładowany jako niezależny od domeny, musi być skompilowany w trybie JIT w każdej domenie aplikacji, w której jest załadowany, i moduł ładujący nie może udostępniać zasobów wewnętrznych między domenami aplikacji.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.

W przypadku ustawienia wartości 1 Flaga środowiska COMPLUS_LoaderOptimization wymusza załadowanie przez hosta środowiska uruchomieniowego wszystkich zestawów w sposób nieneutralny dla domeny, znany jako SingleDomain.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 nie ładuje żadnych zestawów jako neutralnych dla domen, z wyjątkiem mscorlib, który jest zawsze ładowany jako neutralny dla domeny.SingleDomain loads no assemblies as domain-neutral, except Mscorlib, which is always loaded domain-neutral. To ustawienie nosi nazwę pojedynczej domeny, ponieważ jest często używane, gdy host uruchamia tylko jedną aplikację w procesie.This setting is called single domain because it is commonly used when the host is running only a single application in the process.

Przestroga

Flaga środowiska COMPLUS_LoaderOptimization została zaprojektowana tak, aby była używana w scenariuszach diagnostycznych i testowych.The COMPLUS_LoaderOptimization environment flag was designed to be used in diagnostic and test scenarios. Włączenie flagi może spowodować poważne spowolnienie i zwiększenie użycia pamięci.Having the flag turned on can cause severe slow-down and increase in memory usage.

Przykład koduCode example

Aby wymusić, że wszystkie zestawy nie mają zostać załadowane jako niezależne od domeny dla usługi IISADMIN można osiągnąć przez dołączenie COMPLUS_LoaderOptimization=1 do wartości wielociągowej środowiska w kluczu HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\IISADMIN.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  

Zobacz takżeSee also