从.NET向COM公开嵌套数组

时间:2020-03-05 18:55:26  来源:igfitidea点击:

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

WARNING: There is no marshaling support for nested arrays.

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

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

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

解决方案

回答

等效于Cis System.Object中的变体。因此,我们可能希望尝试将结果转换返回给对象,并将其作为另一种形式重新备份到另一侧。

VB没有Clacks的任何功能,所以我怀疑如果.NET端用VB编写会更好或者更容易。

回答

即使我们要返回一个Object(映射到COM Interop中的Variant),也不能解决问题。 VB可以"抓住"它并"传递"它,但是它将无法执行任何操作。

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

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

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

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