如何将字节数组从C#COM DLL返回到VB6 / VBA客户端

时间:2012-11-29 20:04:01

标签: c# vba com vb6 com-interop

我有一个C#库,我通过COM暴露给VBA / VB6。我能够在大多数情况下调用函数并传递参数,但是当调用具有字节数组的函数作为out参数时,我得到一个错误“运行时错误-2146233079,对象'xxx'的方法'yyy'失败“。最初,我遇到了崩溃,然后我意识到我没有在VB中分配我的字节数组。一旦我这样做,该功能就会起作用,但前提是我没有设置输出值。

如果我删除了我的out参数(或将其切换为参考,但不在C#中设置),该函数调用并正常工作。我有几种具有这种签名的函数(几个整数,一个字节数组,一个或更多字节数组),所以我试图不使用某种setter / getter解决方法。 / p>

此功能有效 -

public int NoOuts(int x, int y, ref byte[] msgId){}

如果我尝试设置/更改sn out / ref值,这些变化会出错(我尝试了In,Out,ref,MarshalAs等的多种组合) -

public int OneOut(int x, int y, ref byte[] msgId, [Out] out byte[] sn){}
public int OneOut(int x, int y, ref byte[] msgId, ref byte[] sn){}
public int OneOut(int x, int y, ref byte[] msgId, [Out] ref byte[] sn){}
public int OneOut(int x, int y, ref byte[] msgId, [[Out, MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_UI1)] out byte[] sn){}
'// Even tried it with an object
public int OneOut(int x, int y, ref byte[] msgId, [Out] out object nonce){}

这是我的VB6测试代码(我还需要它在VBA中工作) -

    Dim i as Long
    Dim msg(7) as Byte
Dim sn(7) as Byte

For i = 0 To UBound(mesa)
    msg(i) = i * 2
Next

i = api.OneOut(5, 4, 3, 2, msg(), sn())

我能够验证msg的值在我的C#函数中是否可用。我也能够来回传递和改变字符串。

我在同一行上发布了一个上一个问题,但主要是将值传递给C#,而不是返回它们。 How to Pass Byte Arrays as UDT Properties from VB6/VBA to C# COM DLL?

这两篇文章是关于类似的,但我无法使用任何一种方法 -

Accepting a Byte array, vb6 to C# interop

Return byte array from C# to VBScript via COM interop

0 个答案:

没有答案