代码之家  ›  专栏  ›  技术社区  ›  bzlm

从.NET向COM公开嵌套数组

  •  0
  • bzlm  · 技术社区  · 16 年前

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

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

    此警告导致相关方法未导出到生成的类型库中。有人告诉我,有一些方法可以解决这个问题,使用variant作为COM返回类型,然后在COM客户端强制转换/etc。对于这个特定的程序集,目标客户机访问群体是vb6。 但是你在.NET方面是如何做到的呢?

    注释 :我有一个现有的旧版dll(及其导出的类型库),其中返回类型是变量,但此dll(和.tlb)是使用pre-net旧版工具生成的,因此我无法使用它们。

    如果该程序集是用vb.net编写的,这会有帮助吗?

    2 回复  |  直到 12 年前
        1
  •  4
  •   Euro Micelli    16 年前

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

    从技术上讲,在vb中没有字符串[][的精确等价物。但是,如果数组不是“锯齿状”(即所有子数组的长度都相同),则应该能够使用二维数组作为返回类型。COM互操作应该能够转换它。

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

    无论您的方法是正式返回一个对象(看起来像是vb的一个变量),还是字符串[,](看起来像vb中的字符串数组),都有点无关紧要。字符串数组是更好的返回,但不是必需的。

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

        2
  •  1
  •   Will    16 年前

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

    vb没有c所缺少的任何功能,因此我怀疑如果.NET端是用vb编写的,它会更好或更容易。