2009年9月2日水曜日

[.Net] .NetでのCOM相互運用

.Netで作成したDLLをCOM(ActiveX?)としても使うようにするためのメモ

まずはクラスライブラリとしてプロジェクトを作成します。
プロジェクトのプロパティでアプリケーションタブ内のアセンブリ情報から「アセンブリをCOM参照可能にする」にチェックを入れます。
あとは、コンパイルタブの「COM相互運用機能の登録」にもチェックを入れておくと、デバッグとかが楽かも。
プロジェクトにクラスを足すときは、「COMクラス」を使うのがお勧めです。

次に、COMの確認。
VBSファイルを作ってやるとか、VB6を使うとか、CraeteObjectで呼んでみるとかがありますね。

Dim obj
Set obj = CreateObject("ClassLibrary1.ComClass1")
MsgBox o.MethodTest()

こんな感じですかね。

後は、VSの入っていない環境にCOMを設定する方法。
WinXPとFramework 2.0の場合で具体例で書きます。
コマンドプロンプトで「C:\WINDOWS\Microsoft.Net\Framework\v2.0.50727」に移動します。
でコマンド「regasm [DLLの絶対パス] /tlb /codebase」を実行します。
ワーニングが出ますが成功って感じです。

このコマンド、「/codebase」をつけないとうまくいかないんですよね。
/codebaseをつけないと、登録しただけではうまく動かなくて、/unregisterするとうまくいって。。。
色々やりすぎて原因不明です。このまま迷宮に入れておきます。

メソッドの修正とかしてもモジュールを上書きするだけでOKです。
(クラスの追加、削除は再登録がいるかも?)
これがアセンブリの著名をつけない時のメリットですね。
アセンブリの著名をつけちゃうと、GACに登録はされますが、
バージョン管理をきっちりやる必要が出てきます。
ちょっとやってみたんですけど、バージョンダウンして動かすことが出来ませんでした。
これはそのうち解決したいです。

以下はその他の気になった点のメモです。
・Object型をCOM公開すると警告(BC42102)が出るが問題なし
  →プロジェクトファイルに以下の文を追加で出なくなる
+Project
 +PropertyGroup
  <NoWarn>42102</NoWarn>

・オーバーロードと可変引数は使えない
・自作クラスを継承したクラスがうまく公開できない(たぶん個人的な知識不足が原因)

・・・いつか、この記事をまとめなおそう。。。

0 件のコメント: