tcomでActiveXコントロールにアクセスする

.NET frameworkのクラスライブラリ(DLL)はマネージドコードを含むため、
Tcl等の非.NETの言語からアクセスできないが、クラスライブラリ(DLL)を
AcitiveXコントロールにするとアクセス可能になる。
それでは、C#でクラスライブラリ(DLL)を作成して実験してみよう。

ActiveXコントロールの作成

まず、Visual C# 2005で新しいプロジェクトを作成する際に
「クラスライブラリ」のテンプレートを選ぼう。

下記の様に簡単な加減算をするメソッドを記述した。

using System;
using System.Collections.Generic;
using System.Text;

namespace ComSample
{
    public class Expr
    {
        public int Add(int a, int b)
        {
            return a + b;
        }
        public int Sub(int a, int b)
        {
            return a - b;
        }
    }
}

このまま「ビルド」→「ソリューションビルド」をすると普通のクラスライブラリ(DLL)
が出来てしまうので、ActiveXコントロールにするには、プロジェクトのプロパティを
開いて下記の設定をする。

「アプリケーション」の「アセンブリ情報...」を開いて「アセンブリをCOM参照可能にする」にチェックを入れる。

次に、ビルドの出力の「COM相互運用機能の登録」にチェックを入れる。

ビルド

「ビルド」→「ソリューションビルド」をすると.dllと一緒に.tlbというファイルが出来る。
Release or Debugフォルダに.tlbファイルが出来ていれば成功である。

レジストリに登録

ActiveXコントロールはレジストリに登録しないと使えないので、
Visual Studio 2005 コマンド プロンプトを開いて、下記のコマンドを実行する。

regasm.exe ComSample.dll

ActiveXコントロールは、
「名前空間.ユーザコントロールのクラス名」
という ProgId で公開される。

tcomを使ってみる

TclからActiveXコントロールにアクセスするためにtcomパッケージを使う。
使い方はとっても簡単で、下記の例を見ていただければわかるだろう。

package require tcom

set ax [::tcom::ref createobject "ComSample.Expr"]
$ax Add 10 20
=> 30
$ax Sub 10 20
=> -10

このように、Tclから.NETのクラスライブラリに直接アクセスできるので、
tcomとtcltestを組み合わせればクラスライブラリの回帰テストができる。
ただし、レジストリ登録は面倒なので、.NET framework 2.0のReg-Free COM技術を使って回避したい。

参考文献