Выделение типов C # для вызова интерфейса C ++ IDispatch приводит к несоответствию типов - PullRequest
1 голос
/ 30 января 2012

Я пытаюсь вызвать интерфейс IDispatch c ++ со следующим определением метода:

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 Ответ

5 голосов
/ 30 января 2012

Ваша проблема в том, что второй и третий параметры (pData и pString) помечены как [in, out] в их определении, что означает, что они переводятся в ref параметры в C #. Вам необходимо использовать перегрузку InvokeMember, которая принимает аргумент ParameterModifier[], чтобы указать, что эти аргументы должны передаваться по ссылке, а не по значению. Массив 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
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...