代码之家  ›  专栏  ›  技术社区  ›  Adam

如何使用后期绑定调用带有byref参数的方法

  •  1
  • Adam  · 技术社区  · 16 年前

    我有一个com组件,我想使用vb.net的后期绑定(使用痛苦的主interop程序集-pia方法)调用它。

    com方法的idl签名如下:

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

    vb.net语言中的两个“byref”参数和一个返回值。

    我试图这样调用此方法:

    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)
    

    此操作异常失败:{“无效被调用方”。(hresult的异常:0x80020010(disp_e_badcalee))“}

    我想这意味着我在参数数组中做错了什么。因为如果我将parametermods数组的任何值设置为“true”,它就可以工作。当然,它不会更新作为[out]参数的参数,因此无法按预期工作。

    由于方法也有一个返回值,还有什么需要考虑的吗?这个 MSDN example 除了示例没有返回值之外,几乎所有的操作都与我正在做的完全相同。如有任何帮助,我们将不胜感激。

    1 回复  |  直到 13 年前
        1
  •  0
  •   JaredPar    16 年前

    一个问题是参数和参数修改器数组的大小不同。我相信它们必须匹配,这样CLR/BCL可以与参数修饰符匹配每个参数。

    如果PIA是用保留签名属性生成的,那么该方法实际上有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())