English 中文(简体)
从.NET向COM公开嵌套数组
原标题:
  • 时间:2008-09-16 08:55:38
  •  标签:

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

警告:嵌套数组不支持封送处理。

此警告会导致有问题的方法无法导出到生成的类型库中。有人告诉我,有一些方法可以解决这个问题,使用Variant作为COM返回类型,然后在COM客户端进行强制转换等。对于这个特定的程序集,目标客户端受众是VB6 但是,在.NET方面,您实际上是如何做到这一点的呢

注意:我有一个现有的遗留DLL(及其导出的类型库),其中返回类型为Variant,但这个DLL(和.tlb)是使用.NET之前的遗留工具生成的,所以我不能使用它们。

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

最佳回答

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

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

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

无论您的方法是正式返回Object(在VB中看起来像Variant),还是字符串[,](在VB中将看起来像string数组),都有些无关紧要。String数组是一个更好的返回,但不是必需的。

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

问题回答

C#中变量的等价物是System.Object。因此,您可能需要尝试将结果强制转换返回到对象,然后在另一端将其作为变量重新拾取。

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





相关问题