在呼叫COM元件介面的時候,我們一般會使用Type.InvokeMember()的方法來呼叫。 Type.InvokeMember()在呼叫的時候需要接受一個Object類型的陣列來傳遞介面的參數資訊。對於那些只包含有[in]或ByVal的介面參數,你只要建構這樣的數組,並把它傳給Type.InvokeMember()即可。
如果COM元件的介面參數含有[out]或[in,out]回傳參數(在VB開發的COM元件裡面是ByRef),那麼,除了上面的做法之外,還得需要額外做一些工作。你必須得告訴Type.InvokeMember()介面參數裡面哪些參數是一個[in][in,out]或ByRef的參數,否則,你將不會得到任何的回傳參數值。為了得到[in][in,out]或ByRef回傳參數的值,你得用到包含有ParameterModifier陣列的Type.InvokeMember()重載方法。
ParameterModifier陣列中只需要包含一個元素,ParameterModifier物件有一個呼叫參數的索引屬性叫做Item。在呼叫介面中,如果第N個參數是一個引用的參數,那麼,第N個Item屬性就必須賦值為true來告訴Type.InvokeMember()這是一個引用的參數。
以下是一個呼叫包含有三個參數(其中兩個參數為引用參數)一個COM的介面C#例子,在這個例子中,第二個參數和第三個參數都是引用的參數:
type ComObjType;
object ComObj;
string ReturnValue;
//建立COM物件的引用
ComObjType = Type.GetTypeFromProgID("SomeComServer.SomeComObject");
ComObj = Activator.CreateInstance(ComObjType);
//為InvokeMethod 的呼叫建立參數數組,並初始化每個參數元素
object[] ParamArray = new object[3];
ParamArray [0] = "InParam" ;
ParamArray[1] = 5 ;
ParamArray[2] = "" ;
//建構ParameterModifier陣列(注意上面所說的ParameterModifier陣列裡面只有一個元素)
//這裡有三個參數。所以在創建ParameterModifier物件的時候要在其建構函式裡面指出參數的個數
//用參數的索引屬性來指出哪些參數是一個回傳的參數
//對於那些是[in]或ByRef的參數可以不用指定
ParameterModifier[] ParamMods = new ParameterModifier [1];
ParamMods[0] = new ParameterModifier (3); // 初始化為介面參數的數量
ParamMods[0][1] = true; // 設定第二個參數為回傳參數
ParamMods[0][2] = true; // 設定第三個參數為回傳參數
//呼叫含有ParameterModifier數組的重載函數
ReturnValue = (string) ComObjType.InvokeMember("ReturnSomeValues", // 介面函數名稱BindingFlags.Default | BindingFlags.InvokeMethod,
null,
ComObj, // 呼叫的COM元件ParamArray, // 參數陣列ParamMods, // 指定傳回參數的ParameterModifier陣列null,
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 ) ;
注意,為了給InvokeMethod()傳遞正確的ParameterModifier數組,你必須在接受返回的參數數組中初始化參數的資料類型。在上面的例子中,第二個參數是整形[5],第三個參數是文本['']。