如果COM組件的接口參數含有[out]或者[in,out]返回參數(在VB開發(fā)的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; //創(chuàng)建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數組里面只有一個元素) //這里有三個參數。所以在創(chuàng)建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],第三個參數是文本['']。