インプロセスの side-by-side 実行In-Process Side-by-Side Execution

.NET Framework 4 以降では、インプロセスの side-by-side ホスティングを使用して、1 つのプロセスで複数のバージョンの共通言語ランタイム (CLR) を実行できます。Starting with the .NET Framework 4, you can use in-process side-by-side hosting to run multiple versions of the common language runtime (CLR) in a single process. 既定では、マネージド COM コンポーネントは、プロセスに読み込まれている .NET Framework のバージョンに関係なく、コンポーネントがビルドされた .NET Framework のバージョンで実行されます。By default, managed COM components run with the .NET Framework version they were built with, regardless of the .NET Framework version that is loaded for the process.

背景Background

.NET Framework ではマネージド コード アプリケーションに対して常に side-by-side ホスティングが提供されてきましたが、.NET Framework 4 より前は、マネージド COM コンポーネントに対してこの機能は提供されていませんでした。The .NET Framework has always provided side-by-side hosting for managed code applications, but before the .NET Framework 4, it did not provide that functionality for managed COM components. 以前は、プロセスに読み込まれたマネージド COM コンポーネントは、既に読み込まれているランタイムのバージョン、またはインストールされている .NET Framework の最新バージョンで実行されました。In the past, managed COM components that were loaded into a process ran either with the version of the runtime that was already loaded or with the latest installed version of the .NET Framework. このバージョンが COM コンポーネントと互換性がない場合、コンポーネントは実行できませんでした。If this version was not compatible with the COM component, the component would fail.

.NET Framework 4 が備える side-by-side ホスティングの新しいアプローチでは、次のことが保証されます。The .NET Framework 4 provides a new approach to side-by-side hosting that ensures the following:

  • .NET Framework の新しいバージョンをインストールしても、既存のアプリケーションに影響はありません。Installing a new version of the .NET Framework has no effect on existing applications.

  • アプリケーションは、それがビルドされたバージョンの .NET Framework に対して実行されます。Applications run against the version of the .NET Framework that they were built with. 明示的に指示しない限り、新しいバージョンの .NET Framework は使われません。They do not use the new version of the .NET Framework unless expressly directed to do so. ただし、新しいバージョンの .NET Framework を使うようにアプリケーションを移行する方が簡単です。However, it is easier for applications to transition to using a new version of the .NET Framework.

ユーザーと開発者への影響Effects on Users and Developers

  • エンドユーザーとシステム管理者End users and system administrators. これらのユーザーについては、単独で、またはアプリケーションと共に、ランタイムの新しいバージョンをインストールしても、コンピューターに影響がないことが、これまで以上に確実になっています。These users can now have greater confidence that when they install a new version of the runtime, either independently or with an application, it will have no impact on their computers. 既存のアプリケーションは引き続きこれまでと同じように動作します。Existing applications will continue to run as they did before.

  • アプリケーション開発者Application developers. Side-by-side ホスティングは、アプリケーション開発者に対する影響はほとんどありません。Side-by-side hosting has almost no effect on application developers. 既定では、アプリケーションはそれがビルドされた .NET Framework のバージョンで常に実行されます。これは変更されていません。By default, applications always run against the version of the .NET Framework they were built on; this has not changed. ただし、開発者はこの動作をオーバーライドし、新しいバージョンの .NET Framework で実行するようアプリケーションに指示できます (シナリオ 2 をご覧ください)。However, developers can override this behavior and direct the application to run under a newer version of the .NET Framework (see scenario 2).

  • ライブラリ開発者とコンシューマーLibrary developers and consumers. ライブラリ開発者が直面する互換性の問題は、side-by-side ホスティングでは解決されません。Side-by-side hosting does not solve the compatibility problems that library developers face. アプリケーションによって (直接参照または Assembly.Load の呼び出しにより) 直接読み込まれるライブラリは、それが読み込まれる AppDomain のランタイムを引き続き使います。A library that is directly loaded by an application -- either through a direct reference or through an Assembly.Load call -- continues to use the runtime of the AppDomain it is loaded into. サポートする .NET Framework のすべてのバージョンについて、ライブラリをテストする必要があります。You should test your libraries against all versions of the .NET Framework that you want to support. アプリケーションが .NET Framework 4 ランタイムを使ってコンパイルされているものの、それより前のランタイムを使ってビルドされたライブラリが含まれる場合は、そのライブラリも .NET Framework 4 ランタイムを使います。If an application is compiled using the .NET Framework 4 runtime but includes a library that was built using an earlier runtime, that library will use the .NET Framework 4 runtime as well. 一方、以前のランタイムを使ってビルドされたアプリケーションと、.NET Framework 4 を使ってビルドされたライブラリがある場合は、アプリケーションも .NET Framework 4 を使うように強制する必要があります (「シナリオ 3」を参照してください)。However, if you have an application that was built using an earlier runtime and a library that was built using the .NET Framework 4, you must force your application to also use the .NET Framework 4 (see scenario 3).

  • マネージド COM コンポーネントの開発者Managed COM component developers. 以前は、マネージド COM コンポーネントはコンピューターにインストールされている最新バージョンのランタイムを使って自動的に実行しました。In the past, managed COM components automatically ran using the latest version of the runtime installed on the computer. 現在は、ビルドされたバージョンのランタイムに対して COM コンポーネントを実行できるようになりました。You can now execute COM components against the version of the runtime they were built with.

    次の表で示すように、.NET Framework バージョン 1.1 でビルドされたコンポーネントは、バージョン 4 のコンポーネントとであれば side-by-side で実行できますが、バージョン 2.0、3.0、3.5 のコンポーネントとは、これらのバージョンでは side-by-side ホスティングを使用できないために side-by-side では実行できません。As shown by the following table, components that were built with the .NET Framework version 1.1 can run side by side with version 4 components, but they cannot run with version 2.0, 3.0, or 3.5 components, because side-by-side hosting is not available for those versions.

    .NET Framework のバージョン.NET Framework version 1.11.1 2.0 - 3.52.0 - 3.5 44
    1.11.1 利用不可Not applicable ×No はいYes
    2.0 - 3.52.0 - 3.5 ×No 利用不可Not applicable はいYes
    44 [はい]Yes はいYes 利用不可Not applicable

注意

.NET Framework バージョン 3.0 および 3.5 はバージョン 2.0 に対して増分的にビルドされているため、side-by-side で実行する必要はありません。.NET Framework versions 3.0 and 3.5 are built incrementally on version 2.0, and do not need to run side by side. これらは、本質的に同じバージョンです。These are inherently the same version.

side-by-side ホスティングの一般的なシナリオCommon Side-by-Side Hosting Scenarios

  • シナリオ 1 : 以前のバージョンの .NET Framework でビルドされた COM コンポーネントを使うネイティブ アプリケーション。Scenario 1: Native application that uses COM components built with earlier versions of the .NET Framework.

    インストールされている .NET Framework のバージョン: .NET Framework 4、および COM コンポーネントによって使用される他のすべての .NET Framework のバージョン。.NET Framework versions installed: The .NET Framework 4 and all other versions of the .NET Framework used by the COM components.

    対処方法: このシナリオの場合は、何も行いません。What to do: In this scenario, do nothing. COM コンポーネントは、登録された .NET Framework のバージョンで実行されます。The COM components will run with the version of the .NET Framework they were registered with.

  • シナリオ 2: .NET Framework 2.0 で実行することが好ましいが、バージョン 2.0 が存在しない場合は .NET Framework 4 で実行する、.NET Framework 2.0 SP1 でビルドされたマネージド アプリケーション。Scenario 2: Managed application built with the .NET Framework 2.0 SP1 that you would prefer to run with the .NET Framework 2.0, but are willing to run on the .NET Framework 4 if version 2.0 is not present.

    インストールされている .NET Framework のバージョン: 以前のバージョンの .NET Framework および .NET Framework 4。.NET Framework versions installed: An earlier version of the .NET Framework and the .NET Framework 4.

    対処方法: アプリケーション ディレクトリ内のアプリケーション構成ファイルで、次のように設定された <startup> 要素<supportedRuntime> 要素を使用します。What to do: In the application configuration file in the application directory, use the <startup> element and the <supportedRuntime> element set as follows:

    <configuration>  
      <startup >  
        <supportedRuntime version="v2.0.50727" />  
        <supportedRuntime version="v4.0" />  
      </startup>  
    </configuration>  
    
  • シナリオ 3: 以前のバージョンの .NET Framework でビルドされた COM コンポーネントを使う、.NET Framework 4 で実行したいネイティブ アプリケーション。Scenario 3: Native application that uses COM components built with earlier versions of the .NET Framework that you want to run with the .NET Framework 4.

    インストールされている .NET Framework のバージョン: .NET Framework 4。.NET Framework versions installed: The .NET Framework 4.

    対処方法: アプリケーション ディレクトリのアプリケーション構成ファイルで、useLegacyV2RuntimeActivationPolicy 属性と true に設定した <startup> 要素と、次のように設定された <supportedRuntime> 要素を使います。What to do: In the application configuration file in the application directory, use the <startup> element with the useLegacyV2RuntimeActivationPolicy attribute set to true and the <supportedRuntime> element set as follows:

    <configuration>  
      <startup useLegacyV2RuntimeActivationPolicy="true">  
        <supportedRuntime version="v4.0" />  
      </startup>  
    </configuration>  
    

Example

次の例では、コンポーネントがコンパイルされた .NET Framework のバージョンを使うことでマネージド COM コンポーネントを実行しているアンマネージド COM ホストを示します。The following example demonstrates an unmanaged COM host that is running a managed COM component by using the version of the .NET Framework that the component was compiled to use.

次の例を実行するには、.NET Framework 3.5 を使って次のマネージド COM コンポーネントをコンパイルして登録します。To run the following example, compile and register the following managed COM component using the .NET Framework 3.5. コンポーネントを登録するには、 [プロジェクト] メニューの [プロパティ] をクリックし、 [ビルド] タブをクリックして、 [COM の相互運用機能に登録] チェック ボックスをオンにします。To register the component, on the Project menu, click Properties, click the Build tab, and then select the Register for COM interop check box.

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Runtime.InteropServices;  
  
namespace BasicComObject  
{  
    [ComVisible(true), Guid("9C99C4B5-CA54-4c58-8988-49B6811BA53B")]  
    public class MyObject : SimpleObjectModel.IPrintInfo  
    {  
        public MyObject()  
        {  
        }  
        public void PrintInfo()  
        {  
            Console.WriteLine("MyObject was activated in {0} runtime in:\n\tAppDomain {1}:{2}", System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion(), AppDomain.CurrentDomain.Id, AppDomain.CurrentDomain.FriendlyName);  
        }  
    }  
}  

次のアンマネージ C++ アプリケーションをコンパイルすると、前の例で作成した COM オブジェクトがアクティブ化すされます。Compile the following unmanaged C++ application, which activates the COM object that is created by the previous example.

#include "stdafx.h"  
#include <string>  
#include <iostream>  
#include <objbase.h>  
#include <string.h>  
#include <process.h>  
  
using namespace std;  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    char input;  
    CoInitialize(NULL) ;  
    CLSID clsid;  
    HRESULT hr;  
    HRESULT clsidhr = CLSIDFromString(L"{9C99C4B5-CA54-4c58-8988-49B6811BA53B}",&clsid);  
    hr = -1;  
    if (FAILED(clsidhr))  
    {  
        printf("Failed to construct CLSID from String\n");  
    }  
    UUID id = __uuidof(IUnknown);  
    IUnknown * pUnk = NULL;  
    hr = ::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,id,(void **) &pUnk);  
    if (FAILED(hr))  
    {  
        printf("Failed CoCreateInstance\n");  
    }else  
    {  
        pUnk->AddRef();  
        printf("Succeeded\n");  
    }  
  
    DISPID dispid;  
    IDispatch* pPrintInfo;  
    pUnk->QueryInterface(IID_IDispatch, (void**)&pPrintInfo);  
    OLECHAR FAR* szMethod[1];  
    szMethod[0]=OLESTR("PrintInfo");   
    hr = pPrintInfo->GetIDsOfNames(IID_NULL,szMethod, 1, LOCALE_SYSTEM_DEFAULT, &dispid);  
    DISPPARAMS dispparams;  
    dispparams.cNamedArgs = 0;  
    dispparams.cArgs = 0;  
    VARIANTARG* pvarg = NULL;  
    EXCEPINFO * pexcepinfo = NULL;  
    WORD wFlags = DISPATCH_METHOD ;  
;  
    LPVARIANT pvRet = NULL;  
    UINT * pnArgErr = NULL;  
    hr = pPrintInfo->Invoke(dispid,IID_NULL, LOCALE_USER_DEFAULT, wFlags,  
        &dispparams, pvRet, pexcepinfo, pnArgErr);  
    printf("Press Enter to exit");  
    scanf_s("%c",&input);  
    CoUninitialize();  
    return 0;  
}  

関連項目See also