Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将字节数组从C#COM DLL返回到VB6/VBA客户端_C#_Vba_Com_Vb6_Com Interop - Fatal编程技术网

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

如何将字节数组从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和一个或多个字

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

如果我删除out参数(或将其切换为ref,但不在C#中设置),则函数调用并正常工作。我有几个具有这种签名的函数(几个int、一个字节数组in和一个或多个字节数组out),因此我尝试不使用某种setter/getter解决方法

此功能有效-

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())