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

警告:没有对嵌套数组的封送支持。

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

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

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

有帮助吗?

解决方案

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

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

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

无论您的方法正式返回一个对象(对于 VB 来说,它看起来像一个变体),还是一个字符串[,](在 VB 中看起来像一个字符串数组),都不太重要。字符串数组是一个更好的返回,但不是必需的。

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

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top