インプロセスの side-by-side 実行

更新 : 2010 年 8 月

.NET Framework Version 4 以降では、インプロセスの side-by-side ホスティングを使用して、1 つのプロセスで複数のバージョンの共通言語ランタイム (CLR: Common Language Runtime) を実行できます。 既定では、マネージ COM コンポーネントは、プロセスに読み込まれている .NET Framework のバージョンに関係なく、そのコンポーネントのビルドに使用された .NET Framework のバージョンで実行されます。

背景

.NET Framework では、マネージ コード アプリケーションに対しては side-by-side ホスティングを常に提供してきましたが、.NET Framework 4 まで、マネージ COM コンポーネントに対しては同様の機能がありませんでした。 これまで、プロセスに読み込まれたマネージ COM コンポーネントは、既に読み込まれているバージョンのランタイムか、インストールされている最新バージョンの .NET Framework で実行されていました。 このバージョンが COM コンポーネントと互換性がない場合、そのコンポーネントは失敗しました。

.NET Framework 4 には、以下を実現する side-by-side ホスティングの新しい方法が用意されています。

  • 新しいバージョンの .NET Framework をインストールした場合に、既存のアプリケーションに影響を与えません。

  • アプリケーションは、ビルドに使用されたバージョンの .NET Framework で実行されます。 新しいバージョンの .NET Framework を使用するには、そのように明示的に指示する必要があります。 ただし、新しいバージョンの .NET Framework を使用するようにアプリケーションを移行する方が簡単です。

ユーザーおよび開発者への影響

  • エンド ユーザーおよびシステム管理者。 新しいバージョンのランタイムを個別にまたはアプリケーションと共にインストールしても、使用しているコンピューターに影響を与えないので、安心して作業できます。 既存のアプリケーションはこれまでどおり実行されます。

  • アプリケーション開発者。 アプリケーション開発者にとって、side-by-side ホスティングによる影響はほとんどありません。 既定では、アプリケーションは、ビルドに使用されたバージョンの .NET Framework で常に実行されます。この点に変わりはありません。 ただし、開発者は、この動作をオーバーライドし、新しいバージョンの .NET Framework でアプリケーションを実行するように指示できます (シナリオ 2 を参照してください)。

  • ライブラリの開発者および使用者。 side-by-side ホスティングでは、ライブラリ開発者が直面する互換性の問題は解決されません。 直接参照または Assembly.Load の呼び出しによってアプリケーションで直接読み込まれるライブラリでは、読み込み先の AppDomain のランタイムを引き続き使用します。 サポートする必要があるすべてのバージョンの .NET Framework に対してライブラリをテストする必要があります。 .NET Framework 4 ランタイムを使用してアプリケーションをコンパイルするが、アプリケーションに以前のランタイムを使用してビルドされたライブラリが含まれている場合は、そのライブラリでも .NET Framework 4 ランタイムが使用されます。 ただし、以前のランタイムを使用してビルドされたアプリケーションと、.NET Framework 4 を使用してビルドされたライブラリの場合は、強制的にアプリケーションで .NET Framework 4 を使用する必要があります (シナリオ 3 を参照してください)。

  • マネージ COM コンポーネントの開発者。 これまで、マネージ COM コンポーネントは、コンピューターにインストールされている最新バージョンのランタイムを使用して自動的に実行されていました。 現在では、COM コンポーネントは、ビルドに使用されたバージョンのランタイムで実行できます。

    次の表に示すように、.NET Framework Version 1.1 でビルドされたコンポーネントは、Version 4 のコンポーネントと並行して実行できますが、Version 2.0、3.0、または 3.5 では side-by-side ホスティングを使用できないので、これらのバージョンのコンポーネントと並行して実行することはできません。

    .NET Framework のバージョン

    1.1

    2.0 - 3.5

    4

    1.1

    該当なし

    ×

    2.0 - 3.5

    該当なし

    4

    該当なし

メモメモ

.NET Framework Version 3.0 および 3.5 は、Version 2.0 を基盤としてインクリメント方式で構築されており、並行して実行する必要はありません。これらのバージョンは、本質的に同じバージョンです。

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

  • シナリオ 1: 以前のバージョンの .NET Framework でビルドされた COM コンポーネントを使用するネイティブ アプリケーション。

    インストールされている .NET Framework のバージョン: .NET Framework 4、および COM コンポーネントで使用されるその他のすべてのバージョンの .NET Framework。

    操作内容: このシナリオでは何もしません。 COM コンポーネントは、そのコンポーネントが登録されているバージョンの .NET Framework で実行されます。

  • シナリオ 2: .NET Framework 2.0 SP1 でビルドされたマネージ アプリケーション。.NET Framework Version 2.0 で優先的に実行しますが、Version 2.0 がない場合は .NET Framework 4 で実行します。

    インストールされている .NET Framework のバージョン: 以前のバージョンの .NET Framework および .NET Framework 4。

    操作内容: アプリケーション ディレクトリのアプリケーション構成ファイルで、次のように設定した <startup> 要素<supportedRuntime> 要素を使用します。

    <configuration>
      <startup >
        <supportedRuntime version="v2.0.50727" />
        <supportedRuntime version="v4.0" />
      </startup>
    </configuration>
    
  • シナリオ 3: 以前のバージョンの .NET Framework でビルドされた COM コンポーネントを使用するネイティブ アプリケーション。.NET Framework 4 で実行します。

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

    操作内容: アプリケーション ディレクトリのアプリケーション構成ファイルで、useLegacyV2RuntimeActivationPolicy 属性を true に設定した <startup> 要素と次のように設定した <supportedRuntime> 要素を使用します。

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

マネージ COM コンポーネントを実行するアンマネージ COM ホストの例を次に示します。マネージ COM コンポーネントの実行には、そのコンパイルで対象としたバージョンの .NET Framework を使用します。

次の例を実行するには、.NET Framework Version 3.5 を使用して、次のマネージ COM コンポーネントをコンパイルおよび登録します。コンポーネントを登録するには、[プロジェクト] メニューの [プロパティ] をクリックし、[ビルド] タブをクリックして、[COM の相互運用機能に登録] チェック ボックスをオンにします。

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 オブジェクトがアクティブになります。

#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;
}

参照

参照

<startup> 要素

<supportedRuntime> 要素

履歴の変更

日付

履歴

理由

2010 年 8 月

アプリケーション構成ファイルの .NET Framework 2.0 のバージョン番号を修正しました。

カスタマー フィードバック