COMサーバ目次interfaceの宣言classの実装アセンブリ属性の追加ビルドとシステムへの登録クライアントソースコード解説一覧C#では、DLLタイプのCOMサーバを実装できます。COMサーバは次の手順で実装できます。IUnknownまたはIDispatchから継承し、必要なメソッドを追加したインターフェース(interface)を定義する。定義したインターフェース(interface)を継承したクラス(class)を実装する。COMサーバは、.NET付属のregasmを利用して、DLLサーバとしてシステムに登録できます。C#ではinterfaceやclassの属性として指定します。そのため、これらのインターフェースは実装する必要がありません。実装することもできません。interfaceの宣言C#では、interfaceを使うと、純粋仮想クラスを定義できます。次のようなCOMに必要な属性を指定してinterfaceを定義します。外部からインターフェースを参照可能とする場合はtrue。インターフェースの種類(IUnknown、IDispatch、Dual)を指定する。interfaceのIIDを指定する。ICSichigo1というインターフェースは次のように定義できます。タイプライブラリ出力可能なしたインターフェースになります。classの実装インターフェースを定義した後は、定義したインターフェースを備えたクラスを実装します。クラスの場合もインターフェースと同様に、COM特有の属性を指定します。タイプライブラリ(.tlb)等でクラスを公開する場合はtrue。通常はNoneを指定する。それ以外の値を用いると、継承に加えて実装するインターフェースの種類を指定する形になる。クラスのCLSIDを指定する。クラスのProgIdを指定する。ProgIdを指定しておくと、このクラスをCLSIDだけでなくProgIdでも参照できるようになる。インターフェース指定をしなかった場合に、ここで指定したインターフェースをデフォルトとする。属性指定する点以外は通常のクラスとほとんど同じです。実装もそれほど難しくありません。自分のアセンブリのために生成したGUIDを指定します。アセンブリ属性はSystem.Reflectionに収められており、COMに関連する項目は次の通りです。タイプライブラリ(.tlb)を生成する場合はtrueを指定します。自分で生成したタイプライブラリのGUIDを指定します。他のGUIDをコピーせず、guidgen等で生成したものを指定します。他のソースコードとリンクされるようになっています。統合環境を使っている場合、これらの情報はプロジェクトのプロパティで編集できます。他の属性と同じように、ソースファイルに直接追加して問題ありません。次のようにアセンブリ属性を指定できます。Guid("0F6A07A0-A000-403E-AF5C-8AAF45CC0C07")]ビルドとシステムへの登録コマンドラインからビルドする場合は、次のようになります。regasmはCOMサーバをシステムに登録するコマンドです。regasmの実行には管理者権限が必要になります。csichigo1.dllregasmに/tlbを指定するとタイプライブラリを出力します。32bit環境では32bit、64bit環境では64bitのCOMサーバになります。実行環境に留意してご登録ください。IDispatchを介さずC++から呼び出せます。C++では、tlbを#import指定するとヘッダの代わりに使えます。csichigo1.tlhというファイル名で生成されます。Write()引数のstringはCOMのBSTR型になります。生成されるファイルcsichigo1.tlhは以下のようなヘッダファイルです。このヘッダファイルを#includeしてビルドすることに相当します。したがって、C++からは次のコードで直接呼び出せることがわかります。説明のため、エラーチェックは省略しています。C++以外の言語からでも呼び出せます。Scriptからは次のように呼び出せます。</script></job>もちろん、C++であってもIDispatchを介したアクセスも可能です。IDispatchの利用はC++からは手間がかかりますが、例えば次のように呼び出せます。説明のため、エラーチェックは省略しています。VariantClear(&vret);ソースコード最後に、csichigo1.csの完全なソースコードを載せておきます。