将嵌套数组从.NET公开给COM

时间:2008-09-16 08:55:39

标签: .net com vb6 marshalling tlbexp

我在.NET(C#)中有一个返回string[][]的方法。当使用RegAsm或TlbExp(来自.NET 2.0 SDK)为包含程序集创建COM类型库时,我收到以下警告:

  

警告:嵌套数组没有编组支持。

此警告导致有问题的方法无法导出到生成的类型库中。我被告知有很多方法可以使用Variant作为COM返回类型,然后在COM客户端上转换/ etc。对于此特定程序集,目标客户端受众是VB6。 但是你如何在.NET端实际执行此操作?

注意:我有一个现有的遗留DLL(带有导出的类型库),返回类型是Variant,但是这个DLL(和.tlb)是使用pre-.NET传统工具生成的,所以我不能使用它们。

如果汇编是用VB.NET编写的,它会有用吗?

2 个答案:

答案 0 :(得分:4)

即使您要返回一个Object(映射到COM Interop中的Variant),也无法解决您的问题。 VB将能够“抓住”它并“传递它”,但它将无法用它做任何事情。

从技术上讲,VB中没有字符串[] []的确切等价物。但是,如果您的数组不是“锯齿状”(即,所有子数组的长度相同),您应该能够使用二维数组作为返回类型。 COM Interop应该能够翻译它。

string [,] myReturnValue = new string[rowCount,colCount];

你的方法是否正式返回一个Object(看起来像一个Variant到VB),或者一个字符串[,](看起来像VB中的一个字符串数组),有点无关紧要。 String数组是一个更好的返回,但不是必需的。

如果数组 呈锯齿状,那么您将不得不想出一个不同的方法。例如,您可以选择使返回的2D数组与最大的子数组一样大,然后将长度信息传递到单独的[out] int []参数中,以便VB可以知道使用了哪些元素。

答案 1 :(得分:1)

C#中的变体等价物是System.Object。因此,您可能希望尝试将结果转换为对象,并将其作为变体在另一侧进行备份。

VB没有C#缺少的任何功能,所以我怀疑如果.NET端是用VB编写的那样会更好或更容易。