0

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

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

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

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

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

4

2 回答 2

4

即使您要返回一个对象(映射到 COM 互操作中的变体),也不能解决您的问题。VB 将能够“抓住”它并“传递它”,但它无法对它做任何事情。

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

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

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

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

于 2008-09-16T17:17:41.540 回答
1

C# 中的变体等价物是 System.Object。因此,您可能想尝试将结果转换返回到对象并在另一侧将其作为变体重新拾取。

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

于 2008-09-16T11:31:34.977 回答