【问题标题】:Does COM allow closed generic types?COM 是否允许封闭的泛型类型?
【发布时间】:2018-03-03 22:32:20
【问题描述】:

我创建了一个 .Net 类程序集,最终可能会将其分发给可能希望通过非 .Net 语言(例如 C++)使用它的外部客户。

为此,我试图使其与 COM 兼容。这是我第一次尝试 COM,我可能完全走错了路!

所以我启动了tlbexp MyClassLibrary.dll,但它产生了一堆关于泛型类型的警告:

TlbExp:警告 TX8013117D:类型库导出器警告处理“MyClassLibrary.IFoo.FooMethod(#0),MyClassLibrary”。警告:类型库导出器在签名中遇到泛型类型实例。通用代码可能无法导出到 COM。

有些用于可空类型(我计划用特定类型的结构类型替换这些类型)。其他的是我用过的场合IList<>

在为后一个问题寻找一个好的解决方案时,我偶然发现了 casperOne 对这个问题的评论:How do I suppress this COM Generics warning?,这似乎表明虽然在 COM 中不允许使用开放式泛型类型,但应该使用封闭式泛型类型。

我暴露的所有场合IList<>的用法我都指定了类型,即它们是封闭的泛型,例如在下面的示例代码中:

public interface IFoo
{
    IList<string> FooMethod(IList<string> bar);
}

如果这是正确的,为什么我的封闭泛型类型使用会导致这些警告?我误解了封闭性吗? casperOne 在这方面的评论不正确吗?

【问题讨论】:

    标签: c# generics dll com class-library


    【解决方案1】:

    所以 Hans Passant 发布了一个很好的答案,但随后将其删除,我不知道为什么。他在其中提到,应用于泛型类型的属性当然不会仅仅因为类型是由该类型的用户指定而改变。显然,这意味着封闭或开放的泛型类型都适用于 COM。

    可用的替代方法是创建一个通过封装封装泛型类型的具体类型,或者切换到使用非泛型集合类型,例如 ArrayList 并遵守我使用的类型。

    后一种选择的缺点是,虽然 I 可以对返回给客户端的数据进行类型规定,但没有什么可以强制 客户端在作为参数传递的数据中遵循类似的规则。 前一个选项的好处是强制集合项类型,并且对 COM 和非 COM 客户端仍然有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      相关资源
      最近更新 更多