C#で COM オブジェクトを作る方法

こんにちは、ruby-csharp_script の開発者の舩原です。

心機一転した当ブログですが、その第一弾としての記事は
「C# で COM オブジェクトを作る方法」です。

Ruby と C# を Windows 上で繋ぐ時に重要になる技術が COM です。
COM は Component Object Model の略で、
主にプログラミング言語を横断するコンポーネントとして使われていたようです。



COM の作り方をどう探すか?

COM 技術は、.Net Framework の登場以前からあったため、
Web で検索しても 古い情報と新しい情報が混ざり合って
正しいか過去の情報となっているのかがなかなか判断できませんでした。

プログラミング言語によっても作り方が違ってくるので、
プログラミング言語名と「COM」の両方のキーワードと
期間指定をして目的の作り方を探しましょう。



C# で COM クラスを作るサンプル

いよいよ本題です。
C# で作る方法を検索しましたが、
英語だろうと日本語だろうとあまりありませんでした。
(だからこそこの記事を書いている訳ですが…)

一番参考になったのは、以下の記事。

COM クラスの例 (C# プログラミング ガイド)
Example COM Class (C# Programming Guide)
の日本語・英語の同じ記事です。

サンプルを掲載すると著作権を侵害してしまうので掲載しないので、
リンク先のマイクロソフトのドキュメントを御覧ください。


サンプルコード解説

COM クラスを作るためのポイントを
上記のサンプルコードにて解説します。

まず、 COM クラスには、 19行目 ComClass1 のようなクラス本体と
その interface(12行目)。
COM のイベント元としてのインターフェイス(12行目)が必要になります。

クラスやインターフェイスの前の”[]”で始まる宣言は、
“属性”(Attribute)と呼ばれるもので、クラスに情報を意味づけするものです。

COM クラスのためには、サンプルコードにかかれている Guid属性, ClassInterface属性, ComSourceInterfaces属性が最小限に必要な属性で、
そのクラスに属するインターフェイスにもそれぞれ必須の属性があります。

この属性を指定してあげて、
さらに以下の記事のように

C# で COM コンポーネントを公開する

Visual Studio にて 「アセンブリを COM 参照可能にする」を指定し、
管理者権限でビルド、もしくは regasm コマンドを用いて
ライブラリの登録作業を行うと使えるようになります。

ruby-csharp_script において COMクラスを使用したソースコードは以下になります。
https://github.com/masoo/ruby-csharp_script/tree/master/ruby-csharp_script/csharp_script

サンプルコードより、属性が増えていますが、基本的な事は変わりません。

もし COM オブジェクトを作るのなら参考にしてください。