我有一个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?
这两篇文章是关于类似的,但我无法使用任何一种方法 -