我正在尝试使用以下方法定义调用c ++ IDispatch接口:
ATL HRESULT TestFunc(long Command, [in, out] long* pData, [in, out] BSTR* pString, [out, retval] long* pRC);
// ...
Type t = Type.GetTypeFromProgID( "IMyTestInterfce" );
Object so = Activator.CreateInstance(t);
Object[] args = new Object[3];
args[0] = -8017;
args[1] = 0;
args[2] = "";
Object result = so.GetType().InvokeMember("TestFunc", BindingFlags.InvokeMethod, null, so, args);
来电的结果是类型不匹配,但我不确定原因。
InnerException = {“类型不匹配。(HRESULT异常:0x80020005(DISP_E_TYPEMISMATCH))”}`
由于
答案 0 :(得分:5)
您的问题是第二个和第三个参数(pData
和pString
)在其定义中标记为[in, out]
,这意味着它们会在C#中转换为ref
个参数。您需要使用接受ParameterModifier[]
参数的the overload of InvokeMember
来指定那些参数应该通过引用传递,而不是通过值传递。 ParameterModifier
数组应包含一个元素,该元素指定第二个和第三个索引为true
,以表示它们是通过引用传递的。
ParameterModifier modifier = new ParameterModifier(3);
modifier[1] = true;
modifier[2] = true;
Object result = so.GetType().InvokeMember(
"TestFunc", // name
BindingFlags.InvokeMethod, // invokeAttr
null, // binder
so, // target
args, // args
new ParameterModifier[] { modifier }, // modifiers
null, // culture
null // namedParameters
);