Wykonywanie równoczesne w programie .NET Framework

Wykonywanie równoczesne stwarza możliwość uruchamiania wielu wersji aplikacji lub składnika na jednym komputerze. Można mieć wiele wersji środowiska uruchomieniowego języka wspólnego i wiele wersji aplikacji oraz składników, które używają wersji środowiska uruchomieniowego na jednym komputerze w tym samym czasie.

Na poniższej ilustracji pokazano kilka aplikacji używających dwóch różnych wersji środowiska uruchomieniowego na jednym komputerze. Aplikacje A, B i C używają środowiska uruchomieniowego w wersji 1.0, podczas gdy aplikacja D używa środowiska uruchomieniowego w wersji 1.1.

Side-by-side execution of different runtime versions,

Program .NET Framework składa się ze środowiska uruchomieniowego języka wspólnego i kolekcji zestawów zawierających typy interfejsu API. Wersje środowiska uruchomieniowego i zestawów programu .NET Framework są określane oddzielnie. Na przykład wersja 4.0 środowiska uruchomieniowego jest w rzeczywistości wersją 4.0.319, natomiast wersja 1.0 zestawów programu .NET Framework jest w rzeczywistości wersją 1.0.3300.0.

Na poniższej ilustracji pokazano kilka aplikacji używających dwóch różnych wersji składnika na jednym komputerze. Aplikacje A i B używają wersji 1.0 składnika, podczas gdy aplikacja C używa wersji 2.0 tego samego składnika.

Diagram that shows side-by-side execution of a component.

Wykonywanie równoczesne daje większą kontrolę nad tym, z którymi wersjami składnika jest powiązana aplikacja, a także większą kontrolę nad tym, których wersji środowiska uruchomieniowego używa aplikacja.

Korzyści z wykonywania równoczesnego

Przed wprowadzeniem systemu Windows XP i programu .NET Framework występowały konflikty bibliotek DLL, ponieważ aplikacje nie mogły rozróżnić niezgodnych wersji tego samego kodu. Informacje o typach zawarte w bibliotece DLL były powiązane tylko z nazwą pliku. Aplikacja nie miała żadnej możliwość określenia, czy typy zawarte w bibliotece DLL były tymi samymi typami, z użyciem których aplikacja została skompilowana. W rezultacie nowa wersja składnika mogła zastąpić starszą wersję i spowodować przerwanie działania aplikacji.

Wykonywanie równoczesne i program .NET Framework dostarczają następujące funkcje służące do eliminowania konfliktów bibliotek DLL:

  • Zestawy o silnych nazwach.

    Funkcja wykonywania równoczesnego używa zestawów o silnych nazwach w celu powiązania informacji o typie z określoną wersją zestawu. Zapobiega to powiązaniu aplikacji lub składnika z nieprawidłową wersją zestawu. Zestawy o silnych nazwach umożliwiają również istnienie wielu wersji pliku na jednym komputerze i używanie ich przez aplikacje. Aby uzyskać więcej informacji, zobacz Zestawy o silnych nazwach.

  • Magazyn kodu rozpoznający wersje.

    Program .NET Framework dostarcza magazyn kodu rozpoznający wersje w globalnej pamięci podręcznej zestawów. Globalna pamięć podręczna zestawów to pamięć podręczna kodu dla całego komputera, która znajduje się na każdym komputerze z zainstalowanym programem .NET Framework. Zestawy są przechowywane na podstawie wersji, kultury i informacjach o wydawcy, a ponadto jest obsługiwanych wiele wersji składników i aplikacji. Aby uzyskać więcej informacji, zobacz Global Assembly Cache (Global Assembly Cache).

  • Izolacja.

    Używając programu .NET Framework, można tworzyć aplikacje i składniki, które są wykonywane w izolacji. Izolacja jest istotnym składnikiem funkcji wykonywania równoczesnego. Działanie izolacji obejmuje rozpoznawanie używanych zasobów oraz współużytkowanie zasobów przez wiele wersji aplikacji lub składnika. Izolacja obejmuje również przechowywanie plików w sposób specyficzny dla wersji. Aby uzyskać więcej informacji na temat izolacji, zobacz Wytyczne dotyczące tworzenia składników na potrzeby wykonywania równoległego.

Zgodność wersji

Wersje 1.0 i 1.1 programu .NET Framework są zaprojektowane tak, aby zachować zgodność ze sobą. Aplikacja skompilowana przy użyciu programu .NET Framework w wersji 1.0 powinna działać w wersji 1.1, a aplikacja skompilowana przy użyciu programu .NET Framework w wersji 1.1 powinna działać w wersji 1.0. Należy jednak zauważyć, że funkcje interfejsu API dodane w wersji 1.1 programu .NET Framework nie będą działać w wersji 1.0 programu .NET Framework. Aplikacje utworzone przy użyciu wersji 2.0 będzie można uruchomić tylko w wersji 2.0. Aplikacje utworzone w wersji 2.0 nie będą działać w wersji 1.1 lub wcześniejszej.

Wersje programu .NET Framework są traktowane jako pojedyncze jednostki składające się ze środowiska uruchomieniowego i skojarzonych zestawów programu .NET Framework (koncepcja określana jako ujednolicenie zestawów). Można przekierować powiązanie zestawu, tak aby dołączyć inne wersje zestawów .NET Framework, ale zastępowanie domyślnego powiązania zestawu może być ryzykowne, przez co należy je starannie przetestować przed wdrożeniem.

Lokalizowanie informacji o wersji środowiska uruchomieniowego

Informacje o wersji środowiska uruchomieniowego skompilowanej aplikacji lub składnika oraz o wersjach środowiska uruchomieniowego wymaganego do uruchomienia aplikacji są przechowywane w dwóch lokalizacjach. Gdy aplikacja lub składnik jest kompilowany, informacje o wersji środowiska uruchomieniowego używanej do kompilowania są przechowywane w zarządzanym pliku wykonywalnym. Informacje o wersjach środowiska uruchomieniowego wymagane przez aplikację lub składnik są przechowywane w pliku konfiguracji aplikacji.

Informacje o wersji środowiska uruchomieniowego w zarządzanym pliku wykonywalnego

Nagłówek pliku przenośnego pliku wykonywalnego (PE) każdej aplikacji zarządzanej i składnika zawiera informacje o wersji środowiska uruchomieniowego, z którym został skompilowany. Środowisko uruchomieniowe języka wspólnego używa tych informacji do określenia najbardziej prawdopodobnej wersji środowiska uruchomieniowego, która musi zostać uruchomiona przez aplikację.

Informacje o wersji środowiska uruchomieniowego w pliku konfiguracji aplikacji

Oprócz informacji w nagłówku pliku PE można wdrożyć aplikację z plikiem konfiguracji aplikacji, który udostępnia informacje o wersji środowiska uruchomieniowego. Plik konfiguracji aplikacji jest plikiem opartym na formacie XML utworzonym przez dewelopera aplikacji i dostarczanym z aplikacją. <RequiredRuntime>, element< sekcji uruchamiania>, jeśli jest obecny w tym pliku, określa, które wersje środowiska uruchomieniowego i które wersje składnika obsługuje aplikacja. Możesz również użyć tego pliku podczas testowania, aby przetestować zgodność aplikacji z różnymi wersjami środowiska uruchomieniowego.

Niezarządzany kod, w tym aplikacje COM i COM+, może zawierać pliki konfiguracji aplikacji używane przez środowisko uruchomieniowe do interakcji z kodem zarządzanym. Plik konfiguracji aplikacji ma wpływ na dowolny kod zarządzany aktywowany za pośrednictwem modelu COM. Plik może określać obsługiwane wersje środowiska uruchomieniowego, a także przekierowania zestawów. Domyślnie aplikacje międzyoperacyjną MODELU COM wywołujące kod zarządzany używają najnowszej wersji środowiska uruchomieniowego zainstalowanego na komputerze.

Aby uzyskać więcej informacji na temat plików konfiguracji aplikacji, zobacz Konfigurowanie aplikacji.

Określanie wersji środowiska uruchomieniowego do załadowania

Środowisko uruchomieniowe języka wspólnego używa następujących informacji, aby określić, która wersja środowiska uruchomieniowego ma być ładowana dla aplikacji:

  • Dostępne wersje środowiska uruchomieniowego.

  • Wersje środowiska uruchomieniowego obsługiwane przez aplikację.

Obsługiwane wersje środowiska uruchomieniowego

Środowisko uruchomieniowe używa pliku konfiguracji aplikacji i przenośnego nagłówka pliku wykonywalnego (PE), aby określić, która wersja środowiska uruchomieniowego jest obsługiwana przez aplikację. Jeśli nie ma pliku konfiguracji aplikacji, środowisko uruchomieniowe ładuje wersję środowiska uruchomieniowego określoną w nagłówku pliku PE aplikacji, jeśli ta wersja jest dostępna.

Jeśli plik konfiguracji aplikacji jest obecny, środowisko uruchomieniowe określa odpowiednią wersję środowiska uruchomieniowego do załadowania na podstawie wyników następującego procesu:

  1. Środowisko uruchomieniowe sprawdza <obsługiwany elementRuntime> w pliku konfiguracji aplikacji. Jeśli istnieje co najmniej jedna obsługiwana wersja środowiska uruchomieniowego określona w obsługiwanym elemecieRuntime>, środowisko uruchomieniowe ładuje wersję środowiska uruchomieniowego określoną przez pierwszy <obsługiwany elementRuntime>.< Jeśli ta wersja jest niedostępna, środowisko uruchomieniowe sprawdza następny <obsługiwany elementRuntime> i próbuje załadować określoną wersję środowiska uruchomieniowego. Jeśli ta wersja środowiska uruchomieniowego jest niedostępna, zostaną zbadane kolejne obsługiwane elementyRuntime>.< Jeśli żadna z obsługiwanych wersji środowiska uruchomieniowego nie jest dostępna, środowisko uruchomieniowe nie może załadować wersji środowiska uruchomieniowego i wyświetli użytkownikowi komunikat (zobacz krok 3).

  2. Środowisko uruchomieniowe odczytuje nagłówek pliku wykonywalnego aplikacji PE. Jeśli dostępna jest wersja środowiska uruchomieniowego określona przez nagłówek pliku PE, środowisko uruchomieniowe ładuje wersję. Jeśli określona wersja środowiska uruchomieniowego jest niedostępna, środowisko uruchomieniowe wyszukuje wersję środowiska uruchomieniowego określonego przez firmę Microsoft, aby było zgodne z wersją środowiska uruchomieniowego w nagłówku PE. Jeśli ta wersja nie zostanie znaleziona, proces będzie kontynuowany w kroku 3.

  3. W środowisku uruchomieniowym zostanie wyświetlony komunikat z informacją, że wersja środowiska uruchomieniowego obsługiwana przez aplikację jest niedostępna. Środowisko uruchomieniowe nie jest ładowane.

    Uwaga

    Możesz pominąć wyświetlanie tego komunikatu przy użyciu wartości NoGuiFromShim w kluczu rejestru HKLM\Software\Microsoft\. NETFramework lub używając zmiennej środowiskowej COMPLUS_NoGuiFromShim. Można na przykład pominąć komunikat dla aplikacji, które zwykle nie wchodzą w interakcje z użytkownikiem, takie jak instalacje nienadzorowane lub usługi systemu Windows. Gdy ten komunikat zostanie pominięty, środowisko uruchomieniowe zapisuje komunikat w dzienniku zdarzeń. Ustaw wartość rejestru NoGuiFromShim na 1, aby pominąć ten komunikat dla wszystkich aplikacji na komputerze. Alternatywnie ustaw zmienną środowiskową COMPLUS_NoGuiFromShim na 1, aby pominąć komunikat dla aplikacji uruchomionych w określonym kontekście użytkownika.

Uwaga

Po załadowaniu wersji środowiska uruchomieniowego przekierowania powiązań zestawów mogą określać, że zostanie załadowana inna wersja pojedynczego zestawu .NET Framework. Te przekierowania powiązań mają wpływ tylko na określony zestaw, który jest przekierowywany.

Częściowo kwalifikowane nazwy zestawów a wykonywanie równoczesne

Ponieważ są one potencjalnym źródłem problemów równoległych, częściowo kwalifikowane odwołania do zestawów mogą służyć tylko do powiązania z zestawami w katalogu aplikacji. Unikaj częściowo kwalifikowanych odwołań do zestawów w kodzie.

Aby ograniczyć częściowo kwalifikowane odwołania do zestawów w kodzie, możesz użyć <elementu qualifyAssembly> w pliku konfiguracji aplikacji, aby w pełni kwalifikować częściowo kwalifikowane odwołania do zestawu, które występują w kodzie. <Użyj elementu qualifyAssembly>, aby określić tylko pola, które nie zostały ustawione w odwołaniu częściowym. Tożsamość zestawu wymieniona w atrybucie fullName musi zawierać wszystkie informacje potrzebne do pełnej kwalifikacji nazwy zestawu: nazwa zestawu, klucz publiczny, kultura i wersja.

W poniższym przykładzie pokazano wpis pliku konfiguracji aplikacji, aby w pełni zakwalifikować zestaw o nazwie myAssembly.

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="myAssembly"
fullName="myAssembly,  
      version=1.0.0.0,
publicKeyToken=...,
      culture=neutral"/>
</assemblyBinding>

Za każdym razem, gdy instrukcja ładowania zestawu odwołuje się myAssemblydo , te ustawienia pliku konfiguracji powodują, że środowisko uruchomieniowe automatycznie przetłumaczy częściowo kwalifikowane odwołanie do w pełni kwalifikowanego myAssembly odwołania. Na przykład assembly.Load("myAssembly") staje się Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral").

Uwaga

Za pomocą metody LoadWithPartialName można pominąć ograniczenie środowiska uruchomieniowego języka wspólnego, które uniemożliwia częściowe przywoływanie zestawów z globalnej pamięci podręcznej zestawów. Ta metoda powinna być używana tylko w scenariuszach komunikacji bezpośredniej, ponieważ może łatwo powodować problemy podczas wykonywania równoległego.

Nazwa opis
Instrukcje: włączanie i wyłączanie automatycznego przekierowania powiązań Opis sposobu tworzenia powiązania aplikacji z określoną wersją zestawu.
Konfigurowanie przekierowywania powiązań zestawów Opis sposobu przekierowywania odwołań do powiązań zestawów do określonej wersji zestawów programu .NET Framework.
Wykonywanie równoczesne i wewnątrzprocesowe Omówienie sposobu używania aktywacji hosta środowiska uruchomieniowego wewnątrzprocesowego wykonywania równoczesnego w celu uruchamiania wielu wersji środowiska CLR w pojedynczym procesie.
Zestawy w środowisku .NET Omówienie koncepcyjne zestawów.
Domeny aplikacji Omówienie koncepcyjne domen aplikacji.

Odwołanie

<supportedRuntime> , element