ClickOnce での COM コンポーネントの配置

従来、レガシ COM コンポーネントの配置は困難な作業でした。 コンポーネントをグローバルに登録する必要があるため、重複するアプリケーション間で望ましくない副作用が発生する可能性があります。 .NET Framework アプリケーションでは、コンポーネントがアプリケーションに完全に分離されているか、side-by-side 互換性があるため、通常、この状況は問題にはなりません。 Visual Studio を使用すると、分離された COM コンポーネントを Windows オペレーティング システムに配置できます。

ClickOnce は、.NET アプリケーションを配置するための簡単かつ安全なメカニズムを提供します。 ただし、アプリケーションでレガシ COM コンポーネントを使用する場合は、それらを配置するために追加の手順を実行する必要があります。 このトピックでは、分離された COM コンポーネントを配置し、(たとえば Visual Basic 6.0 や Visual C++ の) ネイティブ コンポーネントを参照する方法について説明します。

分離された COM コンポーネントの配置の詳細については、「ClickOnce と登録不要の COM によるアプリ配置の簡素化」を参照してください。

登録を必要としない COM

登録不要の COM は、分離された COM コンポーネントを配置およびアクティブ化するための新しいテクノロジです。 これは、通常はシステム レジストリにインストールされるコンポーネントのタイプ ライブラリと登録情報をすべて、アプリケーションと同じフォルダーに保存されるマニフェストと呼ばれる XML ファイルに含めることによって機能します。

COM コンポーネントを分離するには、それを開発者のマシンに登録する必要がありますが、エンド ユーザーのコンピューターに登録する必要はありません。 COM コンポーネントを分離するには、その参照の Isolated プロパティを True に設定するだけでかまいません。 既定では、このプロパティは False に設定されています。これは、登録済みの COM 参照として扱う必要があることを示します。 このプロパティが True の場合、ビルド時にこのコンポーネントのマニフェストが生成されます。 また、インストール中に、対応するファイルがアプリケーション フォルダーにコピーされます。

マニフェスト ジェネレーターは、分離された COM 参照を検出すると、コンポーネントのタイプ ライブラリ内のすべての CoClass エントリを列挙し、各エントリを対応する登録データと照合して、タイプ ライブラリ ファイル内のすべての COM クラスのマニフェスト定義を生成します。

ClickOnce を使用した登録不要の COM コンポーネントの配置

ClickOnce と登録不要の COM はいずれも、配置されるためには、コンポーネントにマニフェストがあることを必要とするため、ClickOnce 配置テクノロジは、分離された COM コンポーネントの配置に適しています。

通常は、コンポーネントの作成者がマニフェストを提供する必要があります。 ただし、提供されていない場合は、Visual Studio で COM コンポーネントのマニフェストを自動的に生成できます。 マニフェストの生成は、ClickOnce の発行プロセス中に実行されます。詳細については、「ClickOnce アプリケーションの発行」に関する記事をご覧ください。 この機能を使用すると、Visual Basic 6.0 などの以前の開発環境で作成したレガシ コンポーネントを利用することもできます。

ClickOnce で COM コンポーネントを配置する方法は 2 つあります:

  • ブートストラップを使用して COM コンポーネントを配置します。これは、サポートされているすべてのプラットフォームで機能します。

  • ネイティブ コンポーネントの分離 (登録不要の COM とも呼ばれます) 配置を使用します。

単純な COM コンポーネントの分離と配置の例

登録不要の COM コンポーネントの配置を示すために、この例では、Visual Basic 6.0 を使って作成された、分離されたネイティブ COM コンポーネントを参照する Windows ベースのアプリケーションを Visual Basic で作成し、ClickOnce を使って配置します。

まず、ネイティブ COM コンポーネントを作成する必要があります。

ネイティブ COM コンポーネントを作成するには
  1. Visual Basic 6.0 を使用して、[ファイル] メニューの [新規作成][プロジェクト] の順にクリックします。

  2. [新しいプロジェクト] ダイアログ ボックスで、[Visual Basic] ノードを選択し、[ActiveX DLL] プロジェクトを選択します。 [名前] ボックスに「VB6Hello」と入力します。

    Note

    登録不要の COM でサポートされているのは、ActiveX DLL および ActiveX コントロール プロジェクト タイプだけです。ActiveX EXE および ActiveX ドキュメント プロジェクト タイプはサポートされていません。

  3. ソリューション エクスプローラーで、Class1.vb をダブルクリックしてテキスト エディターを開きます。

  4. Class1.vb で、New メソッドの生成されたコードの後に次のコードを追加します。

    Public Sub SayHello()
       MsgBox "Message from the VB6Hello COM component"
    End Sub
    
  5. コンポーネントをビルドします。 [ビルド] メニューの [ソリューションのビルド] をクリックします。

Note

登録不要の COM でサポートされているのは、DLL および COM コントロール プロジェクト タイプだけです。 登録不要の COM で EXE を使用することはできません。

これで、Windows ベースのアプリケーションを作成し、COM コンポーネントへの参照を追加できるようになりました。

COM コンポーネントを使用して Windows ベースのアプリケーションを作成するには
  1. Visual Basic を使用して、[ファイル] メニューの [新規作成][プロジェクト] の順にクリックします。

  2. [新しいプロジェクト] ダイアログ ボックスで、[Visual Basic] ノードを選択し、[Windows アプリケーション] を選択します。 [名前] ボックスに「RegFreeComDemo」と入力します。

  3. ソリューション エクスプローラーで、[すべてのファイルを表示] ボタンをクリックしてプロジェクト参照を表示します。

  4. [参照] ノードを右クリックし、コンテキスト メニューの [参照の追加] を選択します。

  5. [参照の追加] ダイアログ ボックスで、[参照] タブをクリックし、VB6Hello.dll に移動して選択します。

    参照の一覧に VB6Hello 参照が表示されます。

  6. [ツールボックス] をポイントし、[Button] コントロールを選択して、Form1 フォームにドラッグします。

  7. [プロパティ] ウィンドウで、ボタンの [テキスト] プロパティを Hello に設定します。

  8. ボタンをダブルクリックしてハンドラー コードを追加し、コード ファイルに、ハンドラーが読み取る次のようなコードを追加します。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim VbObj As New VB6Hello.Class1
        VbObj.SayHello()
    End Sub
    
  9. アプリケーションを実行します。 [デバッグ] メニューの [デバッグの開始] をクリックします。

    次に、コントロールを分離する必要があります。 アプリケーションで使用する各 COM コンポーネントは、自分のプロジェクト内で COM 参照として表されます。 これらの参照は、ソリューション エクスプローラー ウィンドウの [参照] ノードの下に表示されます (参照は、[プロジェクト] メニューの [参照の追加] コマンドを使用して直接追加することも、ActiveX コントロールをフォーム上にドラッグして間接的に追加することもできます)。

    次の手順では、COM コンポーネントを分離し、分離されたコントロールを含む更新済みアプリケーションを発行する方法を示します。

COM コンポーネントを分離するには
  1. ソリューション エクスプローラー[参照] ノードで、VB6Hello 参照を選択します。

  2. [プロパティ] ウィンドウで、Isolated プロパティの値を False から True に変更します。

  3. [ビルド] メニューの [ソリューションのビルド] をクリックします。

    ここで、F5 キーを押すと、アプリケーションは想定どおりに動作しますが、現在は登録不要の COM で実行されています。 これを実証するために、VB6Hello.dll コンポーネントを登録解除し、Visual Studio IDE の外部で RegFreeComDemo1.exe を実行してみます。 今回も、ボタンをクリックすると引き続き動作します。 アプリケーション マニフェストの名前を一時的に変更すると、今度は失敗します。

Note

COM コンポーネントを一時的に登録解除することで、それがない状態をシミュレートできます。 コマンド プロンプトを開き、「cd /d %windir%\system32」と入力してシステム フォルダーに移動し、「regsvr32 /u VB6Hello.dll」と入力してコンポーネントを登録解除します。 「regsvr32 VB6Hello.dll」と入力すると、再度登録できます。

最後の手順では、ClickOnce を使ってアプリケーションを発行します:

分離された COM コンポーネントを含むアプリケーション更新を発行するには
  1. [ビルド] メニューの [RegFreeComDemo の発行] をクリックします。

    発行ウィザードが表示されます。

  2. 発行ウィザードで、発行されたファイルにアクセスして調べることができる、ローカル コンピューターのディスク上の場所を指定します。

  3. [完了] をクリックして、アプリケーションを発行します。

    発行されたファイルを調べると、sysmon.ocx ファイルが含まれていることがわかります。 このコントロールは、このアプリケーションに完全に分離されています。つまり、エンド ユーザーのマシンに、このコントロールの別のバージョンを使用する別のアプリケーションがあっても、それがこのアプリケーションに干渉することはありません。

ネイティブ アセンブリの参照

Visual Studio では、Visual Basic 6.0 または C++ ネイティブ アセンブリへの参照がサポートされています。このような参照は、ネイティブ参照と呼ばれます。 参照がネイティブかどうかを確認するには、[ファイルの種類] プロパティが [ネイティブ] または [ActiveX] に設定されていることを確認します。

ネイティブ参照を追加するには、[参照の追加] コマンドを使用し、マニフェストを参照します。 マニフェストが DLL 内に配置されているコンポーネントもあります。 この場合、DLL 自体を選択するだけでかまいません。Visual Studio は、コンポーネントに埋め込みマニフェストが含まれていることを検出すると、それをネイティブ参照として追加します。 また、マニフェストに記載されている依存ファイルまたはアセンブリが、参照されているコンポーネントと同じフォルダーにある場合は、これらも自動的に追加されます。

COM コントロールの分離により、マニフェストがまだない COM コンポーネントを簡単に配置できるようになります。 ただし、コンポーネントがマニフェストと共に提供されている場合は、マニフェストを直接参照できます。 実際には、Isolated プロパティを使用するのではなく、可能な限り、コンポーネントの作成者から提供されたマニフェストを常に使用する必要があります。

登録不要の COM コンポーネントの配置の制限事項

登録不要の COM には、従来の配置手法と比べて明確な利点があります。

すべてのコンポーネントが、登録不要の COM に適した候補であるとは限りません。 次のいずれかに該当するコンポーネントは適していません。

  • コンポーネントがアウトプロセス サーバーの場合。 EXE サーバーはサポートされていません。DLL のみがサポートされています。

  • コンポーネントは、オペレーティング システムの一部であるか、システム コンポーネント (XML、ブラウザー コンポーネント、Microsoft Data Access Components (MDAC) など) の場合。 コンポーネント作成者の再配布ポリシーに従う必要があります。ベンダーに確認してください。

  • コンポーネントが Microsoft Office などのアプリケーションの一部である場合。 たとえば、Microsoft Excel オブジェクト モデルを分離しないようにしてください。 これは Office の一部であり、Office 製品全体がインストールされているコンピューターでのみ使用できます。

  • コンポーネントがアドインまたはスナップイン (Office アドインや、Web ブラウザーのコントロールなど) として使用することを目的としている場合。 通常、このようなコンポーネントでは、マニフェスト自体のスコープを超えた、ホスティング環境で定義されているなんらかの登録スキームが必要となります。

  • コンポーネントがシステムの物理または仮想デバイスを管理している場合 (印刷スプーラー用のデバイス ドライバーなど)。

  • コンポーネントがデータ アクセス再頒布可能コンポーネントの場合。 通常、データ アプリケーションを実行するには、別のデータ アクセス再頒布可能コンポーネントがインストールされている必要があります。 Microsoft ADO Data Control、Microsoft OLE DB、Microsoft Data Access Components (MDAC) などのコンポーネントを分離しないようにしてください。 代わりに、アプリケーションで MDAC または SQL Server Express を使用する場合は、それらを必須コンポーネントとして設定する必要があります。「方法: ClickOnce アプリケーションと共に必須コンポーネントをインストールする」を参照してください。

    コンポーネントの開発者が登録不要の COM 用にコンポーネントを再設計できる場合もあります。 これが不可能な場合でも、ブートストラップを使用した標準の登録スキームによって、それらに依存するアプリケーションをビルドして発行できます。 詳細については、「ブートストラップ パッケージの作成」を参照してください。

    COM コンポーネントは、アプリケーションごとに 1 回だけ分離できます。 たとえば、同じアプリケーションの一部である 2 つの異なるクラス ライブラリ プロジェクトから同じ COM コンポーネントを分離することはできません。 これを行うと、ビルドの警告が発生し、実行時にアプリケーションの読み込みに失敗します。 この問題を回避するために、COM コンポーネントを 1 つのクラス ライブラリにカプセル化することをお勧めします。

    アプリケーションの配置で登録が不要な場合でも、開発者のマシンで COM 登録が必要になるシナリオがいくつかあります。 Isolated プロパティでは、ビルド中にマニフェストを自動生成するために、COM コンポーネントが開発者のマシンに登録されている必要があります。 ビルド中に自己登録を呼び出す登録キャプチャ機能はありません。 また、タイプ ライブラリで明示的に定義されていないクラスはマニフェストに反映されません。 ネイティブ参照など、マニフェストが既に存在する COM コンポーネントを使用するときは、開発時にコンポーネントを登録する必要がない場合があります。 ただし、コンポーネントが ActiveX コントロールであり、ツールボックスと Windows フォーム デザイナーに含める場合は登録が必要です。