Registration-Free COM で簡単 COM テスト

Windows XP 以降には「Registration-Free COM」というのがあって、COM コンポーネントを side-by-side アセンブリにすることで、レジストリに登録しなくてもインスタンス化することができる。ちょっと COM のテストがしたくて使ってみたのでメモしとく。

コンポーネントの作成

まず、Visual Studio を使って COM コンポーネントを作る。API を直接叩くのは大変なので ATL にする。適当にクラスを作って、適当にメソッドを追加する。

クラスができたら、プロジェクトのプロパティを開く。[リンカー]-[全般] から [出力の登録] を [いいえ] にする。

[ビルド イベント]-[ビルド後イベント] の設定で、side-by-side アセンブリとして認識させるためのマニフェスト ファイルを作成するコマンドを指定する。

mt -tlb:"$(TargetPath)" -dll:"$(TargetFileName)" -out:"$(OutDir)$(AssemblyName).X.manifest"

ここで、「.X」の部分はなんでもいいけど必ず何か入れる。何も入れないでアセンブリ名と DLL の名前が同じものになると、DLL に埋め込まれているマニフェストが先に読み込まれてしまい正しく動作しなくなる。ちなみに、出力ファイルは全然違う名前でも構わない。

試しにビルドしてみて、うまくいくことを確認する。

クライアントの作成

コンポーネントを使用するテスト プログラムを作る。どんな方法でもいいので、さっき作ったクラスをインスタンス化してメソッドを呼んでみる。

こっちでもプロジェクトのプロパティを開く。[リンカー]-[マニフェスト ファイル] の [追加のマニフェスト依存関係] の設定で、コンポーネントを参照するように設定する。参照先のアセンブリ名やバージョンは作ったコンポーネントに合わせる。

type='win32' name='HogeComponent.X' version='1.0.0.0'

ビルド、デバッグしてみる。アセンブリが解決できないみたいなこと言われたら、イベント ログのアプリケーションを見てみる。

まとめ

この方法を使うとレジストリを汚さずに気軽に COM で遊べる。一般ユーザーでも普通に使える。ただ、試していないけど、デュアル インターフェイスなクラスを WSH から呼び出すとかはできない気がする。