Как использовать позднюю привязку для вызова метода с параметрами ByRef - PullRequest
1 голос
/ 23 мая 2009

У меня есть COM-компонент, который я хочу вызвать с использованием позднего связывания из VB.NET (используя болезненную сборку первичного взаимодействия - метод PIA)

Моя подпись IDL для метода COM выглядит следующим образом:

HRESULT Send([in]BSTR bstrRequestData,
             [out]VARIANT *pvbstrResponseData,
             [out]VARIANT *pvnExtCompCode,
             [out,retval]int *pnCompletionCode);

Итак, 2 параметра «ByRef» в языке VB.NET и возвращаемое значение.

Я пытаюсь вызвать этот метод следующим образом:

Dim parameters(2) As Object
parameters(0) = "data"
parameters(1) = New Object()
parameters(2) = New Object()

Dim p As New ParameterModifier(3)
p(1) = True
p(2) = True
Dim parameterMods() As ParameterModifier = {p}

objReturn = MyObject.GetType().InvokeMember("Send", _
                                            BindingFlags.InvokeMethod, _
                                            Nothing, _
                                            MyObject, _
                                            parameters, _
                                            parameterMods, _
                                            Nothing, _
                                            Nothing)

Это происходит неэффективно, за исключением: {"Invalid callee. (Exception from HRESULT: 0x80020010 (DISP_E_BADCALLEE)))"}

Полагаю, это означает, что я что-то не так делаю в своем массиве parameterMods. Потому что, если я закомментирую установку любого значения массива ParameterMods в «True» - это работает. Конечно, он не обновляет параметры, которые являются [out] параметрами, и поэтому не работает должным образом.

Есть что-то еще, чтобы рассмотреть, так как метод также имеет возвращаемое значение? Пример MSDN в значительной степени делает именно то, что я делаю, за исключением того, что в примере не было возвращаемого значения. Любая помощь приветствуется.

1 Ответ

0 голосов
/ 23 мая 2009

Одна проблема заключается в том, что ваш аргумент и массивы ParameterModifier имеют разные размеры. Я считаю, что они должны совпадать так, чтобы CLR / BCL мог сопоставлять каждый аргумент с ParameterModifier.

Если PIA был создан с атрибутами preserve signature, метод фактически имеет 4 аргумента вместо 3. Вам нужно расширить массивы, чтобы они содержали 4 члена, и возвращаемое значение pnCompletionCode будет в последнем индексе массив аргументов после завершения вызова.

Также мне любопытно, почему вы используете этот метод вызова. Так как вы используете VB.Net, почему бы не отключить Option Explicit и не использовать позднюю привязку VB. Это гораздо проще, чем писать код отражения самостоятельно (и, как правило, оно будет немного более правильным, потому что оно будет работать со странными правилами сортировки).

Option Explicit Off
...
Dim obj As Object = DirectCast(MyObject,Object)
obj.Send("data", new Object(), new Object())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...