5

我需要将一个 int 或 long 数组(没关系)从 VB6 应用程序传递给 C# COM Visible 类。我试过在 C# 中声明接口,如下所示:

void Subscribe([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_I4)]int[] notificationTypes)

void Subscribe(int[] notificationTypes)

但他们俩都提出了一个Function or interface markes as restricted, or the function uses an Automation type not supported in Visual Basic

我应该如何声明 C# 方法?

4

2 回答 2

1

如果您感到绝望,请在虚拟 VB6 ActiveX dll 项目中编写签名。然后通过 Visual Studio 或命令行工具生成 .NET Interop 版本的 vb6 组件。然后使用 Reflector 或 dotPeek 将代码拉出互操作程序集。这是很长的路要走,但它确实有效。

于 2012-07-13T15:47:11.100 回答
0

9年后我遇到了这个问题。我想出的解决方案是将指针传递给数组的第一个元素,以及上限(VB6 中的 UBound)。然后迭代指向上限的指针并将每个元素放入一个列表中。

在 vb6 端使用

    Dim myarray(3) As float
    Dim ptr As integer
    Dim upperbound as integer

    myarray(0) = 0.1
    myarray(1) = 0.2
    myarray(2) = 0.3
    myarray(3) = 0.4

    ptr = VarPtr(myarray(0))
    upperbound = UBound(myarray)

    SetMyFloat(ptr, upperbound)
    

C# 代码


    public float MyFloat {get; set;}

    public unsafe void SetMyFloat(float* ptr, int ubound)
    {
        MyFloat = PointerToFloatArray(ptr, ubound);
    }

    public unsafe float[] PointerToFloatArray(float* ptr, int ubound)
    //this is to deal with not being able to pass an array from vb6 to .NET
    //ptr is a pointer to the first element of the array
    //ubound is the index of the last element of the array
    {
        List<float> li = new List<float>();
        float element;
        for (int i = 0; i <= ubound; i++)
        {
            element = *(ptr + i);
            li.Add(element);
        }
        return li.ToArray();
    }

于 2021-06-18T23:24:43.083 回答