在调用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],第三个参数是文本[]。