从.NET向COM公开嵌套数组

从.NET向COM公开嵌套数组

Exposing nested arrays to COM from .NET

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

WARNING: There is no marshaling support for nested arrays.

此警告导致所讨论的方法未导出到生成的类型库中。 有人告诉我,可以使用Variant作为COM返回类型,然后在COM客户端上进行强制转换等。 对于此特定的程序集,目标客户群体是VB6。 但是,您实际上如何在.NET端执行此操作?

注意:我有一个现有的旧式DLL(及其导出的类型库),其返回类型为Variant,但是此DLL(和.tlb)是使用.NET以前的旧式工具生成的,因此无法使用它们。

如果程序集是用VB.NET编写的,那对您有帮助吗?


即使返回一个对象(映射到COM Interop中的Variant),也不能解决您的问题。 VB将能够"握住"它并"传递"它,但是它将无法执行任何操作。

从技术上讲,VB中没有完全等效的string [] []。但是,如果数组不是"锯齿状的"(也就是说,所有子数组的长度都相同),则应该可以将二维数组用作返回类型。 COM Interop应该能够进行翻译。

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

方法是正式返回对象(类似于VB的Variant)还是字符串[,](类似于VB中的字符串数组),这在某种程度上并不重要。 String数组是更好的返回值,但不是必需的。

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


C#中的变体等效于System.Object。因此,您可能想尝试将结果转换返回给对象,并将其作为另一种形式在另一侧取回。

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


推荐阅读