编组C#类型以调用C ++ IDispatch接口会导致类型不匹配

时间:2012-01-30 15:24:14

标签: c# c++ com

我正在尝试使用以下方法定义调用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))”}`

由于

1 个答案:

答案 0 :(得分:5)

您的问题是第二个和第三个参数(pDatapString)在其定义中标记为[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
);