.NET Framework での side-by-side 実行Side-by-Side Execution in the .NET Framework

side-by-side 実行は、アプリケーションまたはコンポーネントの複数のバージョンを同じコンピューターで実行する機能です。Side-by-side execution is the ability to run multiple versions of an application or component on the same computer. 共通言語ランタイムの複数のバージョン、および 1 つの共通言語ランタイムを使用するアプリケーションとコンポーネントの複数のバージョンを同じコンピューターで同時に実行できます。You can have multiple versions of the common language runtime, and multiple versions of applications and components that use a version of the runtime, on the same computer at the same time.

共通言語ランタイムの 2 つの異なるバージョンを同じコンピューターで使用する複数のアプリケーションを次の図に示します。The following illustration shows several applications using two different versions of the runtime on the same computer. アプリケーション A、B、および C はランタイム バージョン 1.0 を使用し、アプリケーション D はランタイム バージョン 1.1 を使用します。Applications A, B, and C use runtime version 1.0, while application D uses runtime version 1.1.

異なるランタイム バージョンの side-by-side 実行

.NET Framework は、共通言語ランタイムと API 型を含むアセンブリのコレクションで構成されています。The .NET Framework consists of the common language runtime and a collection of assemblies that contain the API types. ランタイムと .NET Framework アセンブリは、個別にバージョン管理されます。The runtime and the .NET Framework assemblies are versioned separately. たとえば、ランタイムのバージョン 4.0 は実際にはバージョン 4.0.319 で、.NET Framework アセンブリのバージョン 1.0 はバージョン 1.0.3300.0 です。For example, version 4.0 of the runtime is actually version 4.0.319, while version 1.0 of the .NET Framework assemblies is version 1.0.3300.0.

コンポーネントの 2 つの異なるバージョンを同じコンピューターで使用する複数のアプリケーションを次の図に示します。The following illustration shows several applications using two different versions of a component on the same computer. アプリケーション A とアプリケーション B はコンポーネントのバージョン 1.0 を使用し、アプリケーション C は同じコンポーネントのバージョン 2.0 を使用します。Application A and B use version 1.0 of the component while Application C uses version 2.0 of the same component.

コンポーネントの side-by-side 実行を示す図。

side-by-side 実行により、アプリケーションがバインドするコンポーネントのバージョンやアプリケーションが使用するランタイムのバージョンをより詳細に制御できます。Side-by-side execution gives you more control over which versions of a component an application binds to, and more control over which version of the runtime an application uses.

side-by-side 実行の利点Benefits of Side-by-Side Execution

Windows XP および .NET Framework 以前では、アプリケーションは同じコードの非互換バージョンを識別できないため、DLL の競合が発生することがありました。Prior to Windows XP and the .NET Framework, DLL conflicts occurred because applications were unable to distinguish between incompatible versions of the same code. DLL に含まれる型情報は、ファイル名だけに関連付けられていました。Type information contained in a DLL was bound only to a file name. アプリケーションは、DLL に含まれている型とアプリケーションの作成に使用された型が同じであるかどうかを判断できませんでした。An application had no way of knowing if the types contained in a DLL were the same types that the application was built with. この結果、新しいバージョンのコンポーネントが古いバージョンを書き変え、アプリケーションが壊れてしまうことがありました。As a result, a new version of a component could overwrite an older version and break applications.

side-by-side 実行と .NET Framework によって、DLL の競合を防ぐ次の機能が得られます。Side-by-side execution and the .NET Framework provide the following features to eliminate DLL conflicts:

  • 厳密な名前付きアセンブリStrong-named assemblies.

    side-by-side 実行機能は、厳密な名前付きアセンブリを使用して、型情報をアセンブリの特定のバージョンにバインドします。Side-by-side execution uses strong-named assemblies to bind type information to a specific version of an assembly. これによって、アプリケーションまたはコンポーネントが、アセンブリの無効なバージョンをバインドするのを防げます。This prevents an application or component from binding to an invalid version of an assembly. また、厳密な名前付きアセンブリによって、1 つのファイルの複数のバージョンが同じコンピューター上に存在することが可能で、アプリケーションはこれらを使用できます。Strong-named assemblies also allow multiple versions of a file to exist on the same computer and to be used by applications. 詳細については、「厳密な名前付きアセンブリ」を参照してください。For more information, see Strong-Named Assemblies.

  • バージョンを認識するコード ストレージVersion-aware code storage.

    .NET Framework のグローバル アセンブリ キャッシュには、バージョンを認識するコード ストレージが用意されています。The .NET Framework provides version-aware code storage in the global assembly cache. グローバル アセンブリ キャッシュは、コンピューター全体にわたるコード キャッシュで、.NET Framework がインストールされているすべてのコンピューターに存在します。The global assembly cache is a computer-wide code cache present on all computers with the .NET Framework installed. グローバル アセンブリ キャッシュは、バージョン、カルチャ、発行者の情報に基づいてアセンブリを格納し、コンポーネントおよびアプリケーションの複数バージョンをサポートします。It stores assemblies based on version, culture, and publisher information, and supports multiple versions of components and applications. 詳細については、「グローバル アセンブリ キャッシュ」を参照してください。For more information, see Global Assembly Cache.

  • 分離。Isolation.

    .NET Framework を使用すると、分離して実行できるアプリケーションとコンポーネントを作成できます。Using the .NET Framework, you can create applications and components that execute in isolation. 分離は、side-by-side 実行に欠くことのできない構成要素です。Isolation is an essential component of side-by-side execution. 分離には、使用しているリソースを認識し、アプリケーションまたはコンポーネントの複数のバージョンでこれを確実に共有する処理も含まれます。It involves being aware of the resources you are using and sharing resources with confidence among multiple versions of an application or component. また、分離には、バージョンに固有の方法でファイルを格納する方法も含まれます。Isolation also includes storing files in a version-specific way. 分離の詳細については、「side-by-side 実行用のコンポーネントを作成するためのガイドライン」 を参照してください。For more information about isolation, see Guidelines for Creating Components for Side-by-Side Execution.

バージョンの互換性Version Compatibility

.NET Framework Version 1.0 と 1.1 は互換性を持つようにデザインされています。Versions 1.0 and 1.1 of the .NET Framework are designed to be compatible with one another. .NET Framework Version 1.0 で作成されたアプリケーションはバージョン 1.1 で動作し、.NET Framework Version 1.1 で作成されたアプリケーションはバージョン 1.0 で動作する必要があります。An application built with the .NET Framework version 1.0 should run on version 1.1, and an application built with the .NET Framework version 1.1 should run on version 1.0. ただし、.NET Framework Version 1.1 で追加された API 機能は、.NET Framework Version 1.0 では動作しません。Note, however, that API features added in version 1.1 of the .NET Framework will not work with version 1.0 of the .NET Framework. .NET Framework Version 2.0 で作成されたアプリケーションは .NET Framework Version 2.0 でのみ動作します。Applications created with version 2.0 will run on version 2.0 only. .NET Framework Version 2.0 で作成されたアプリケーションは、Version 1.1 以前では動作しません。Version 2.0 applications will not run on version 1.1 or earlier.

.NET Framework のバージョンは、ランタイムとそれに対応する .NET Framework アセンブリで構成される単一のユニットとして扱われます。この概念をアセンブリの統一と呼んでいます。Versions of the .NET Framework are treated as a single unit consisting of the runtime and its associated .NET Framework assemblies (a concept referred to as assembly unification). 他のバージョンの .NET Framework アセンブリを含むようにアセンブリ バインディングをリダイレクトすることもできますが、既定のアセンブリ バインディングのオーバーライドは危険性が伴うため、配置する前に厳密なテストが必要です。You can redirect assembly binding to include other versions of the .NET Framework assemblies, but overriding the default assembly binding can be risky and must be rigorously tested before deployment.

ランタイム バージョン情報の検索Locating Runtime Version Information

アプリケーションまたはコンポーネントのコンパイルに使用したランタイム バージョンおよびアプリケーションの実行時に必要なランタイム バージョンは、2 つの場所に格納されています。Information on which runtime version an application or component was compiled with and which versions of the runtime the application requires to run are stored in two locations. アプリケーションまたはコンポーネントをコンパイルするとき、コンパイルに使用したランタイム バージョンの情報がマネージド実行可能ファイルに格納されます。When an application or component is compiled, information on the runtime version used to compile it is stored in the managed executable. アプリケーションまたはコンポーネントが要求するランタイム バージョンの情報は、アプリケーション構成ファイルに格納されています。Information on the runtime versions the application or component requires is stored in the application configuration file.

マネージド実行可能ファイルのランタイム バージョン情報Runtime Version Information in the Managed Executable

各マネージド アプリケーションおよびマネージド コンポーネントのポータブル実行可能 (PE) ファイル ヘッダーには、その作成に使用されたランタイム バージョンに関する情報が含まれています。The portable executable (PE) file header of each managed application and component contains information about the runtime version it was built with. 共通言語ランタイムは、この情報に基づいて、アプリケーションの実行に必要なランタイムの最も適したバージョンを決定します。The common language runtime uses this information to determine the most likely version of the runtime the application needs to run.

アプリケーション構成ファイルのランタイム バージョン情報Runtime Version Information in the Application Configuration File

PE ファイル ヘッダーの情報に加え、アプリケーションは、ランタイム バージョン情報が含まれるアプリケーション構成ファイルと共に配置できます。In addition to the information in the PE file header, an application can be deployed with an application configuration file that provides runtime version information. アプリケーション構成ファイルは XML ベースのファイルで、アプリケーションの開発者によって作成され、アプリケーションと共に出荷されます。The application configuration file is an XML-based file that is created by the application developer and that ships with an application. このファイルに <startup> セクション<requiredRuntime> 要素が存在する場合、この要素にアプリケーションでサポートするランタイムのバージョンとコンポーネントのバージョンを指定します。The <requiredRuntime> Element of the <startup> section, if it is present in this file, specifies which versions of the runtime and which versions of a component the application supports. また、このファイルを使用して、ランタイムの別のバージョンとアプリケーションの互換性をテストすることができます。You can also use this file in testing to test an application's compatibility with different versions of the runtime.

COM アプリケーションおよび COM+ アプリケーションを含むアンマネージド コードは、ランタイムがマネージド コードとやり取りするときに使用するアプリケーション構成ファイルを持つことができます。Unmanaged code, including COM and COM+ applications, can have application configuration files that the runtime uses for interacting with managed code. アプリケーション構成ファイルは、COM 経由で起動するどのマネージド コードにも適用されます。The application configuration file affects any managed code that you activate through COM. このファイルは、サポートするランタイム バージョンやアセンブリのリダイレクトを指定できます。The file can specify which runtime versions it supports, as well as assembly redirects. 既定では、マネージド コードを呼び出す COM 相互運用アプリケーションは、コンピューターにインストールされている最新のバージョンを使用します。By default, COM interop applications calling to managed code use the latest version of the runtime installed on the computer.

アプリケーション構成ファイルの詳細については、アプリケーションの構成に関するページを参照してください。For more information about the application configuration files, see Configuring Apps.

読み込むランタイム バージョンの決定Determining Which Version of the Runtime to Load

共通言語ランタイムは、次の情報を使用して、アプリケーションのために読み込むランタイム バージョンを決定します。The common language runtime uses the following information to determine which version of the runtime to load for an application:

  • 利用できるランタイム バージョンThe runtime versions that are available.

  • アプリケーションがサポートするランタイム バージョンThe runtime versions that an application supports.

サポートされているランタイム バージョンSupported Runtime Versions

ランタイムは、アプリケーション構成ファイルとポータブル実行可能 (PE) ファイル ヘッダーを使用して、アプリケーションがサポートするランタイムのバージョンを決定します。The runtime uses the application configuration file and the portable executable (PE) file header to determine which version of the runtime an application supports. アプリケーション構成ファイルが存在しない場合、ランタイムはアプリケーションの PE ファイル ヘッダーで指定されているランタイム バージョンを読み込みます。ただし、このバージョンが利用できる場合です。If no application configuration file is present, the runtime loads the runtime version specified in the application's PE file header, if that version is available.

アプリケーション構成ファイルが存在する場合は、次のプロセスの結果に基づいて、ランタイムは読み込むランタイムの適切なバージョンを決定します。If an application configuration file is present, the runtime determines the appropriate runtime version to load based on the results of the following process:

  1. ランタイムは、アプリケーション構成ファイルの <supportedRuntime> 要素を調べます。The runtime examines the <supportedRuntime> Element element in the application configuration file. <supportedRuntime> 要素で指定されたサポートされるランタイム バージョンが 1 つ以上が見つかった場合、ランタイムは最初の <supportedRuntime> 要素で指定されているランタイム バージョンを読み込みます。If one or more of the supported runtime versions specified in the <supportedRuntime> element are present, the runtime loads the runtime version specified by the first <supportedRuntime> element. このバージョンが利用できない場合、ランタイムは <supportedRuntime> の次の要素を調べ、指定されているランタイム バージョンを読み込むようにしようとします。If this version is not available, the runtime examines the next <supportedRuntime> element and attempts to load the runtime version specified. このランタイム バージョンが利用できない場合は、 <supportedRuntime> の後続の要素を調べます。If this runtime version is not available, subsequent <supportedRuntime> elements are examined. サポートされるランタイム バージョンがどれも利用できない場合、ランタイムはランタイム バージョンの読み込みに失敗し、ユーザーに対してメッセージが表示されます (手順 3. 参照)。If none of the supported runtime versions are available, the runtime fails to load a runtime version and displays a message to the user (see step 3).

  2. ランタイムはアプリケーションの実行可能ファイルの PE ファイル ヘッダーを読み込みます。The runtime reads the PE file header of the application's executable file. PE ファイル ヘッダーで指定されたランタイム バージョンが利用できる場合、ランタイムはこのバージョンを読み込みます。If the runtime version specified by the PE file header is available, the runtime loads that version. 指定されたランタイム バージョンが利用できない場合は、PE ヘッダーのランタイム バージョンと互換性があると Microsoft によって決められたランタイム バージョンがランタイムによって検索されます。If the runtime version specified is not available, the runtime searches for a runtime version determined by Microsoft to be compatible with the runtime version in the PE header. このバージョンが見つからない場合、プロセスは手順 3. に進みます。If that version is not found, the process continues to step 3.

  3. ランタイムは、アプリケーションがサポートしているランタイム バージョンが利用できないことを示すメッセージを表示します。The runtime displays a message stating that the runtime version supported by the application is unavailable. ランタイムは読み込まれません。The runtime is not loaded.

    注意

    このメッセージが表示されないようにするには、レジストリ キー HKLM\Software\Microsoft\.NETFramework の値 NoGuiFromShim を使用するか、環境変数 COMPLUS_NoGuiFromShim を使用します。You can suppress the display of this message by using the NoGuiFromShim value under the registry key HKLM\Software\Microsoft\.NETFramework or using the environment variable COMPLUS_NoGuiFromShim. たとえば、無人インストールや Windows サービスなど、一般にはユーザーとの対話が不要なアプリケーションの場合、このメッセージを抑制できます。For example, you can suppress the message for applications that do not typically interact with the user, such as unattended installations or Windows services. このメッセージを抑制すると、ランタイムによって、イベント ログにメッセージが書き込まれます。When this message display is suppressed, the runtime writes a message to the event log. レジストリ値 NoGuiFromShim を 1 に設定すると、コンピューター上のすべてのアプリケーションで、このメッセージが抑制されます。Set the registry value NoGuiFromShim to 1 to suppress this message for all applications on a computer. 別の方法として、COMPLUS_NoGuiFromShim 環境変数を 1 に設定すると、特定のユーザー コンテキストで実行されるアプリケーションについてメッセージを抑制できます。Alternately, set the COMPLUS_NoGuiFromShim environment variable to 1 to suppress the message for applications running in a particular user context.

注意

ランタイム バージョンが読み込まれた後、アセンブリ バインディングのリダイレクトによって、.NET Framework アセンブリの異なるバージョンを読み込むように指定されることがあります。After a runtime version is loaded, assembly binding redirects can specify that a different version of an individual .NET Framework assembly be loaded. これらのバインディングのリダイレクトは、リダイレクトされた特定のアセンブリだけに影響します。These binding redirects affect only the specific assembly that is redirected.

部分修飾アセンブリ名と side-by-side 実行Partially Qualified Assembly Names and Side-by-Side Execution

部分限定アセンブリ参照は、side-by-side 実行の潜在的な問題の原因となり得るので、アプリケーション ディレクトリ内のアセンブリへのバインドだけで使用します。Because they are a potential source of side-by-side problems, partially qualified assembly references can be used only to bind to assemblies within an application directory. 開発するコード内では、部分限定アセンブリ参照は使用しないでください。Avoid partially qualified assembly references in your code.

コードの部分修飾アセンブリ参照を軽減するには、アプリケーション構成ファイルで完全にコード内で発生する部分修飾アセンブリ参照を修飾するために <qualifyAssembly> 要素を使用できます。To mitigate partially qualified assembly references in code, you can use the <qualifyAssembly> element in an application configuration file to fully qualify partially qualified assembly references that occur in code. 部分参照に設定されていないフィールドだけを指定するために <qualifyAssembly> 要素を使用します。Use the <qualifyAssembly> element to specify only fields that were not set in the partial reference. fullName 属性で指定されているアセンブリ ID には、アセンブリ名を完全に修飾するのに必要なすべての情報 (つまり、アセンブリ名、公開キー、カルチャ、およびバージョン) が含まれている必要があります。The assembly identity listed in the fullName attribute must contain all the information needed to fully qualify the assembly name: assembly name, public key, culture, and version.

myAssembly というアセンブリを完全に修飾する、アプリケーション構成ファイルのエントリの例を次に示します。The following example shows the application configuration file entry to fully qualify an assembly called myAssembly.

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

アセンブリの読み込みステートメントが myAssembly を参照するたびに、構成ファイルのこれらの設定により、ランタイムは部分修飾された myAssembly 参照を完全限定参照に自動的に変換します。Whenever an assembly load statement references myAssembly, these configuration file settings cause the runtime to automatically translate the partially qualified myAssembly reference to a fully qualified reference. たとえば、Assembly.Load("myAssembly") は Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral") に変換されます。For example, Assembly.Load("myAssembly") becomes Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral").

注意

LoadWithPartialName メソッドを使用すると、グローバル アセンブリ キャッシュから部分参照アセンブリを読み込むのを禁止する共通言語ランタイムの制限をバイパスできます。You can use the LoadWithPartialName method to bypass the common language runtime restriction that prohibits partially referenced assemblies from being loaded from the global assembly cache. このメソッドは、side-by-side 実行で問題になりやすいので、リモート処理のシナリオだけで使用してください。This method should be used only in remoting scenarios as it can easily cause problems in side-by-side execution.

TitleTitle 説明Description
方法: 自動バインディング リダイレクトを有効/無効にするHow to: Enable and Disable Automatic Binding Redirection アプリケーションをアセンブリの特定のバージョンにバインドする方法について説明します。Describes how to bind an application to a specific version of an assembly.
アセンブリ バインディングのリダイレクトの構成Configuring Assembly Binding Redirection .NET Framework アセンブリの特定のバージョンへのアセンブリ バインドの参照をリダイレクトする方法について説明します。Explains how to redirect assembly binding references to a specific version of the .NET Framework assemblies.
インプロセスの side-by-side 実行In-Process Side-by-Side Execution インプロセスのランタイム ホストの並行アクティブ化を使用して、1 つのプロセスで複数のバージョンの CLR を実行する方法について説明します。Discusses how you can use in-process side-by-side runtime host activation to run multiple versions of the CLR in a single process.
.NET のアセンブリAssemblies in .NET アセンブリの概念的な概要を説明します。Provides a conceptual overview of assemblies.
アプリケーション ドメインApplication Domains アプリケーション ドメインの概念的な概要を説明します。Provides a conceptual overview of application domains.

関連項目Reference

<supportedRuntime> 要素<supportedRuntime> Element