COM コンポーネント インターフェイスを呼び出すときは、通常、Type.InvokeMember() メソッドを使用します。 Type.InvokeMember() は、呼び出されたときにインターフェイスのパラメーター情報を渡すために、Object 型の配列を受け入れる必要があります。 [in] または ByVal のみを含むインターフェイス パラメーターの場合は、そのような配列を構築して Type.InvokeMember() に渡すだけで済みます。
COM コンポーネントのインターフェイス パラメーターに [out] または [in, out] 戻りパラメーター (VB で開発された COM コンポーネントの ByRef) が含まれる場合、上記の方法に加えて、いくつかの追加作業を行う必要があります。インターフェイス パラメーターのどのパラメーターが [in][in,out] または ByRef パラメーターであるかを Type.InvokeMember() に伝える必要があります。そうしないと、戻りパラメーター値を取得できません。 [in][in,out] または ByRef 戻りパラメーターの値を取得するには、ParameterModifier 配列を含む Type.InvokeMember() オーバーロード メソッドを使用する必要があります。
ParameterModifier 配列には、要素を 1 つだけ含める必要があります。ParameterModifier オブジェクトには、呼び出し側パラメーターの Item というインデックス プロパティがあります。呼び出し側インターフェイスでは、N 番目のパラメーターが参照パラメーターである場合、これが参照パラメーターであることを Type.InvokeMember() に伝えるために、N 番目の項目プロパティに true の値を割り当てる必要があります。
以下は、3 つのパラメーター (そのうち 2 つは参照パラメーター) を使用して COM インターフェイスを呼び出す C# の例です。この例では、2 番目のパラメーターと 3 番目のパラメーターは両方とも参照パラメーターです
。
オブジェクト ComObj;
string ReturnValue;
//COM オブジェクトへの参照を作成します。
ComObjType = Type.GetTypeFromProgID("SomeComServer.SomeComObject");
ComObj = Activator.CreateInstance(ComObjType);
//InvokeMethod の呼び出し用のパラメーター配列を構築し、各パラメーター要素を初期化します。
object[] ParamArray = 新しいオブジェクト[3];
ParamArray [0] = "InParam" ;
ParamArray[1] = 5;
ParamArray[2] = "" ;
// ParameterModifier 配列を構築します (上記の ParameterModifier 配列には要素が 1 つしかないことに注意してください)
//ここには 3 つのパラメータがあります。したがって、ParameterModifier オブジェクトを作成するときは、そのコンストラクターでパラメーターの数を指定する必要があります。
//パラメータのインデックス属性を使用して、どのパラメータが返されるパラメータであるかを示します
// [in] または ByRef のパラメーターを指定する必要はありません。
ParameterModifier[] ParamMods = 新しい ParameterModifier [1];
ParamMods[0] = new ParameterModifier (3) // インターフェースパラメータの数に初期化されます。
ParamMods[0][1] = true; // 2 番目のパラメータを戻りパラメータとして設定します。
ParamMods[0][2] = true; // 3 番目のパラメータを戻りパラメータとして設定します。
// ParameterModifier 配列を含むオーバーロードされた関数を呼び出します
ReturnValue = (string) ComObjType.InvokeMember("ReturnSomeValues", //インターフェイス関数名 BindingFlags.Default | BindingFlags.InvokeMethod,
ヌル、
ComObj, // 呼び出される COM コンポーネント ParamArray, // パラメータ配列 ParamMods, // 戻りパラメータ null を指定する ParameterModifier 配列,
null);
//パラメータの値を表示します
Console.WriteLine ("Param1 = {0}", ParamArray[0]) ;
Console.WriteLine ("Param2 = {0}", ParamArray[1]) ;
Console.WriteLine ("Param3 = {0}", ParamArray[2]) ;
Console.WriteLine ("Return Value = {0}", ReturnValue ) ;
正しい ParameterModifier 配列を InvokeMethod() に渡すには、戻り値を受け入れるパラメーター配列内のパラメーターのデータ型を初期化する必要があることに注意してください。上の例では、2 番目のパラメータは整数 [5]、3 番目のパラメータはテキスト [''] です。