将VB6 Variant分配给对象

时间:2009-12-23 18:04:29

标签: c# vb6 object variant

我有一个使用C#编译的Dll的VB6应用程序。我通过COM成功地完成了这项工作。 但我的问题是我有一个Variant数组,其中包含String和Double数据类型。我需要将此数组传递给我的C#Dll,它将数组作为Object接收。 因此,我需要做的就是将Variant数组转换为C#“可理解”的Object数组。任何人都有任何线索吗?

4 个答案:

答案 0 :(得分:2)

这应该可以解决问题

ArrayList a = new ArrayList(YourObjectArrayHere);

答案 1 :(得分:2)

这必须从C#方面做到;如果不是,那么从VB6中你可以做的并不多。也就是说,默认情况下,这个方法声明如下:

void Foo(object[] a);
从VB6中可以看到

采用Variant数组(或者,在IDL级别,为SAFEARRAY(VARIANT))。

如果它对您不起作用,那么您的C#声明有问题 - 请发布它们以便对它们进行审核。

答案 2 :(得分:0)

object [] System.Runtime.InteropServices.Marshal.GetObjectsForNativeVariants(IntPtr aSrcNativeVariant,int cVars)

你试过这种方法吗?

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

我自己没有尝试过,但似乎可以做到这一点。

答案 3 :(得分: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是Variant的数组。

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

感谢所有回复。