我有一个使用 C# 编译的 Dll 的 VB6 应用程序。我已经通过 COM 成功地完成了这项工作。但我的问题是我有一个 Variant 数组,其中包含 String 和 Double 数据类型。我需要将此数组传递给我的 C# Dll,它将数组作为对象接收。因此,我需要做的就是将 Variant 数组转换为 C#“可理解”的 Object 数组。有人对此有任何线索吗?
问问题
1969 次
4 回答
2
这应该可以解决问题
ArrayList a = new ArrayList(YourObjectArrayHere);
于 2009-12-23T18:08:46.380 回答
2
这必须从 C# 方面直接完成;如果不是,那么您可以从 VB6 做很多事情。也就是说,默认情况下,声明如下的方法:
void Foo(object[] a);
从 VB6 中将被视为采用Variant
(或者,在 IDL 级别上,作为SAFEARRAY(VARIANT)
)的数组。
如果它对您不起作用,那么您的 C# 声明有问题 - 请发布它们以便对其进行审查。
于 2009-12-23T18:16:03.497 回答
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);
}
自己没有尝试过,但似乎可以解决问题。
于 2009-12-23T18:27:45.673 回答
0
这是 C# 函数声明:
public double[][] CalcMatching( object[][] data1, object[][] data2, long dataLen1, long dataLen2, string matchingType )
这是 VB6 调用:
result = matchingCalcObj.CalcMatching(data1, data2, dataLen1, dataLen2, Matching)
其中data1
和data2
是 Variant 的数组。
我不认为我可以在 C# 上做很多事情,就像你们说的那样,一旦我在函数调用中遇到的错误是“无效的过程调用或参数”。VB6方面的任何选择?
感谢所有的答复。
于 2009-12-23T18:42:11.310 回答