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

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

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

分離 COM コンポーネントの配置の詳細については、https://www.microsoft.com/japan/msdn/msdnmag/issues/05/04/regfreecom/default.aspx の「ClickOnce と Reg-Free COM によるアプリケーションの配置の簡略化」を参照してください。

登録を必要としない COM

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

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

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

登録を必要としない COM コンポーネントを ClickOnce で配置する

ClickOnce 配置テクノロジは分離 COM コンポーネントを配置するのに非常に適しています。なぜなら、ClickOnce と登録を必要としない COM はどちらも配置用のマニフェストを持つコンポーネントを必要とするからです。

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

ClickOnce は、次の 2 つの方法によって COM コンポーネントを配置します。

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

  • ネイティブ コンポーネントの分離 ("登録を必要としない COM" とも呼ばれます) による配置を使用する。 ただし、この方法は Windows XP 以上のオペレーティング システムにしか使用できません。

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

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

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

ネイティブ COM コンポーネントを作成するには

  1. Visual Basic 6.0 で、[ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。

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

    注意

    登録を必要としない 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. コンポーネントをビルドします。 [ビルド] メニューの [ソリューションのビルド] をクリックします。

注意

登録を必要としない 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. [プロパティ] ウィンドウで、ボタンの [Text] プロパティの値を 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. [プロパティ] ウィンドウで、[分離] プロパティの値を False から True に変更します。

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

ここで F5 キーを押すと、予想どおりにアプリケーションが動作しますが、このアプリケーションは登録を必要としない COM の下で動作しています。 これを証明するために、VB6Hello.dll コンポーネントの登録を解除し、Visual Studio IDE の外部で RegFreeComDemo1.exe を実行してみてください。 この状態でボタンをクリックしても、やはり動作します。 アプリケーション マニフェストの名前を一時的に変更した場合は、動作が失敗します。

注意

COM コンポーネントを一時的に登録解除すると、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 は、コンポーネントが埋め込みマニフェストを持っていることを検出すると、そのコンポーネントをネイティブ参照として追加します。 さらに Visual Studio は、マニフェスト内の一覧に示されている依存ファイルまたはアセンブリが参照先コンポーネントと同じフォルダーに入っている場合には、それらをすべて自動的に含めます。

COM コントロールを分離すると、マニフェストを持たない COM コンポーネントの配置が容易になります。 しかし、コンポーネントがマニフェストを持っている場合は、そのマニフェストを直接参照できます。 マニフェストが使用できる場合には、Isolated プロパティを使用する代わりに、コンポーネントの作成者から提供されたマニフェストを使用してください。

登録を必要としない COM コンポーネントの配置の制限

登録を必要としない COM は、従来の配置テクニックよりも明らかに優れています。 しかし、留意する必要のある制限事項と注意点もいくつかあります。 最大の制限事項は、Windows XP 以上でしか機能しないという点です。 登録を必要としない COM を実装するには、コンポーネントをコア オペレーティング システムに読み込む方法を変更する必要がありました。 残念ながら、登録を必要としない COM についてのダウン レベルのサポート レイヤーはありません。

すべてのコンポーネントが、登録を必要としない COM に適しているわけではありません。 次のいずれかの条件に当てはまる場合、コンポーネントは登録を必要としない COM に適していません。

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

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

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

  • アドインまたはスナップインとして使用されるコンポーネントの場合 (たとえば、Office アドインや Web ブラウザーのコントロールなど)。 このようなコンポーネントは通常、マニフェスト自体の範囲を超える、ホスト側の環境によって定義された何らかの登録スキーマを必要とします。

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

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

場合によっては、コンポーネントの開発者がそのコンポーネントをデザインし直して、登録を必要としない COM にすることも可能です。 これが不可能な場合でも、ブートストラップを使用する標準の登録スキーマを通じて、そのコンポーネントに基づくアプリケーションをビルドして発行できます。 詳細については、「ブートストラップ パッケージの作成」を参照してください。

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

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

参照

概念

ClickOnce のセキュリティと配置