2009-12-23 30 views
1

我有一个使用C#编译的Dll的VB6应用程序。我通过COM进行这项工作取得了成功。 但我的问题是,我有一个带有String和Double数据类型的Variant数组。我需要将此数组传递给我的C#Dll,它将数组作为Object接收。 因此,我需要做的就是将Variant数组转换为C#可以理解的Object数组。任何人有任何线索?将VB6变体分配到对象

回答

2

这应该做的伎俩

ArrayList a = new ArrayList(YourObjectArrayHere); 
2

这必须从事物C#侧做的权利;如果不是这样,那么从VB6中可以做的事情就不多了。这就是说,在默认情况下,一种方法声明如下:

void Foo(object[] a); 

将从VB6被视为服用Variant的阵列(或上IDL水平,SAFEARRAY(VARIANT))。

如果它不适合你,那么你的C#声明有问题 - 请发布它们以便它们可以被检查。

0

对象[] System.Runtime.InteropServices.Marshal.GetObjectsForNativeVariants(IntPtr的aSrcNativeVariant,INT cVars)

您是否尝试过这种方法吗?

object[] result; 
unsafe 
{ 
    pin_ptr<object> pinObj = &obj; 
    result = Marshal.GetObjectsForNativeVariants(new IntPtr(pinObj), objSize); 
} 

自己没有尝试过,但似乎它会做的伎俩。

0

这是C#函数声明:

public double[][] CalcMatching(object[][] data1, object[][] data2, long dataLen1, long dataLen2, string matchingType) 

这是VB6呼叫:

result = matchingCalcObj.CalcMatching(data1, data2, dataLen1, dataLen2, Matching) 

其中data1data2是变体的阵列。

我不认为我可以在C#上做很多事情,就像你们说的那样,一旦我在函数调用中得到的错误是“无效的过程调用或参数”。 VB6方面的任何选项?

感谢所有的答复。