从VB6传递字符串数组到C#.net

7
如何通过COM互操作将VB6字符串数组 [假设为s =Array("a", "b", "c", "d")] 传递给C# .Net?我尝试了实现将C#字符串数组传递给VB和将VB字符串数组传递给C#,如下所示:C#->VB正常工作,但另一种方式(VB-> C#)会出现编译错误,错误信息是:“函数或接口标记为受限制,或该函数使用Visual Basic不支持的自动化类型”。以下是我的代码:
C#
public interface ITest   
{ 
     string[] GetArray();
     void SetArray(string[] arrayVal );
}

public class Test : ITest 
{
    string[] ITest.GetArray() {                                //Working fine
        string[] stringArray = { "red ", "yellow", "blue" };
        return stringArray;
    }
}

void ITest.SetArray(string[] arrayVal) //Giving an issue
{
   string[] stringArray1 = arrayVal;
}

VB

Dim str As Variant

Debug.Print ".NET server returned: "    
For Each str In dotNETServer.GetArray      'dotNETServer=TestServer.Test
    Debug.Print str
Next

Dim arr(3) As String
arr(1) = "Pahee"
arr(2) = "Tharani"
arr(3) = "Rathan"

dotNETServer.SetArray (arr) 'This one causing the compile error which I mentioned earlier

更新:

在C#中,我们需要将数组作为引用传递。在接口和方法中进行更改。

void SetArray(ref string[] arrayVal ); //ref added

我喜欢JSON方法:http://stackoverflow.com/questions/15649696/how-can-i-pass-a-collection-of-objects-from-vb6-to-net - Jeremy Thompson
4
在VB6中,只需使用字符串数组,声明为“Dim arr(42) As String”即可。如果你启用了Option Base 0选项,则会自动转换为“string[]”。如果你因某种原因想要使用Variant,则需要在C#中使用 object 并进行类型转换。 - Hans Passant
@HansPassant,非常感谢。有没有关于我的问题如何将VB6字符串数组发送到C#的想法? - RobinAtTech
2
我在谈论将字符串从VB6“发送”到C#的编组。 - Hans Passant
这个回答解决了您的问题吗?使用COM互操作将VBA中的数组传递到C# - GSerg
@RobinAtTech,你更新中的链接已经失效了。 - SteveB
2个回答

3

将数据转换为适当的类型可以解决您的问题。注意下面涉及到的数据转换和 ref 关键字的改变。

void ITest.SetArray([MarshalAs(UnmanagedType.SafeArray, SafeArraySubType=VT_BSTR)] ref string[] arrayVal)
{
   string[] stringArray1 = arrayVal;
}

我根据您的代码和无法从VB6获取数据的问题制定了此解决方案。如果上述解决方案对您不起作用,则请在此处尝试查找适合您应用程序的数组类型/子类型 http://msdn.microsoft.com/en-us/library/z6cfh6e6(v=vs.110).aspx


1
你是对的。当我在数组参数前添加 ref 关键字时,它可以工作。刚刚发现。谢谢。 - RobinAtTech
编组属性是不必要的。是ref修复了它。 - GSerg

1

您的问题出在 Vb6 代码中:

dotNETServer.SetArray (arr)

这实际上是通过括号而没有使用 Call 关键字来强制传递按值传递的 arr

您需要执行以下操作:

Call dotNETServer.SetArray(arr)

or

dotNETServer.SetArray arr

VB6无法通过值传递数组。如果可以的话,就不会出现“函数或接口标记为受限,或函数使用Visual Basic不支持的自动化类型”错误。无论是添加Call还是删除括号都无法改变这一点。解决方法是在C#端添加ref - GSerg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接