解説一覧C#にはCOMクライアントをサポートするための機能が用意されています。CoCreateInstance()を内部的に呼び出す機能キャストをQueryInterface()呼び出しに変換する機能IDispatchを介したメソッド呼び出しのダイナミックバインディング機能クラスの作成C#では、CoCreateInstance()によるコクラス(IUnknownを継承したCOMクラス)をnewで作成できます。次のようにComImportとCLSIDを与えた空のクラスを書くと、コクラスが定義されます。CIchigo2{}ComImport属性のクラスがnewされると、C#は内部的にCoCreateInstance()を呼び出します。そのままではIUnknown相当であり、クラスメソッドの呼び出しができません。作成したコクラスは、使いたいインターフェースにキャストして使います。APIを利用してCOMインターフェースへの参照を直接得ることもできます。この場合、HRESULTを戻り値とするC++の関数にPreserveSig=falseを与えると、C#がHRESULTを例外に変換してくれます。ppbc);キャストの方法C#は、キャストをQueryInterface()呼び出しに変換する機能を備えています。インターフェースは次のいずれかの方法で得られます。ダイナミックバインディング(IDispatch)を使うSystem.Runtime.InteropServices.ComTypesの定義を利用するコマンドラインツールtlbimpを使ってタイプライブラリを.NETのDLLに変換し、それをusingで読み込むインターフェースをC#コードとして手動で用意する利用が簡単な順にダイナミックバインディング、ComTypes、tlbimp、手動となります。コクラスをnewして、利用するインターフェースにキャストして使うことになります。ダイナミックバインディングを使う方法この場合は、変数型としてdynamicを指定するだけです。次の例のように、dynamic型の変数に保存すればメソッドを呼び出せます。メソッド引数の型については、IDispatchが自動的に解決してくれます。IDispatchを介するため、少し遅くなります。System.Runtime.InteropServices.ComTypesを使う方法System.Runtime.InteropServices.ComTypesはシステムのCOMインターフェースの一部を与えます。例として、次のichigo4のidlファイルを考えます。次のコマンドを実行します。Ichigo4TypeLib.dllという名前のdllが生成されます。IIchigo4インターフェースとIchigo4コクラスが収められています。したがって、このライブラリとインターフェースは次のコードで呼び出せます。}}コマンドラインからビルドする場合は、次のようにします。同じ方法でC#から呼び出せます。どんな言語で書かれていても問題ありません。自分で与えるには次の例のようにします。デフォルトの方法で配列などを扱うと正しく動かないでしょう。MarshalAsという属性を追加します。MarshalAsはC#の引数をNativeの引数に変換する方法を指定します。引数を配列として扱いたい場合は、属性としてUnmanagedType.LPArrayを与えます。このときSizeParamIndex=N(Nは0から始まる引数番号)を与えると、配列のサイズを与えることができます。UnmanagedTypeには多くのタイプが存在します。以下にその一部を示します。配列のサイズはSizeConst(固定長の要素数)、あるいはSizeParamIndex(変数から要素数を取得)により求められる。Unicode文字列これらの機能はC#からアンマネージドコードを呼び出す時に使われるものです。COM以外でも使えます。