3

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

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

此功能有效-

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#,而不是返回它们。 如何将字节数组作为 UDT 属性从 VB6/VBA 传递到 C# COM DLL?

这两个帖子是关于类似的东西,但我无法让任何一种方法起作用-

接受字节数组,vb6 到 C# 互操作

通过 COM 互操作将字节数组从 C# 返回到 VBScript

4

0 回答 0