如何将字节数组从C#COM DLL返回到VB6/VBA客户端
我有一个C#库,我正在通过COM向VBA/VB6公开它。在大多数情况下,我能够调用函数并传递参数,但当调用具有字节数组的函数作为输出参数时,我会得到一个错误“运行时错误-2146233079,对象“xxx”的方法“yyy”失败”。起初,我遇到了一个崩溃,然后我意识到我没有在VB中分配字节数组。一旦我这样做了,函数就会工作,但前提是我没有设置值 如果我删除out参数(或将其切换为ref,但不在C#中设置),则函数调用并正常工作。我有几个具有这种签名的函数(几个int、一个字节数组in和一个或多个字节数组out),因此我尝试不使用某种setter/getter解决方法 此功能有效-如何将字节数组从C#COM DLL返回到VB6/VBA客户端,c#,vba,com,vb6,com-interop,C#,Vba,Com,Vb6,Com Interop,我有一个C#库,我正在通过COM向VBA/VB6公开它。在大多数情况下,我能够调用函数并传递参数,但当调用具有字节数组的函数作为输出参数时,我会得到一个错误“运行时错误-2146233079,对象“xxx”的方法“yyy”失败”。起初,我遇到了一个崩溃,然后我意识到我没有在VB中分配字节数组。一旦我这样做了,函数就会工作,但前提是我没有设置值 如果我删除out参数(或将其切换为ref,但不在C#中设置),则函数调用并正常工作。我有几个具有这种签名的函数(几个int、一个字节数组in和一个或多个字
public int NoOuts(int x, int y, ref byte[] msgId){}
如果我尝试设置/更改sn out/ref值(我尝试了In、out、ref、MASHALAS等的多种组合),则这些变化会出错-
这是我的VB6测试代码(我也需要它在VBA中工作)-
我能够验证msg的值在我的C#函数中是否可用。我还能够来回传递和更改字符串
我之前也提出了一个同样的问题,但主要是关于将值传递到C#中,而不是返回它们
这两篇文章的内容类似,但我无法找到任何一种方法-
参数表必须是
ref byte[]
,VB才能将其识别为可以处理的参数/数据类型。就这么简单。@Deanna-就像在我的第二次声明中一样,它是公共intoneout(intx,inty,ref byte[]msgId,ref byte[]sn){}
?它可以工作,只是不允许我在C代码中更改它。
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){}
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())