COM 是否允许封闭的泛型类型?

Does COM allow closed generic types?

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

为此我正在尝试使其与 COM 兼容。这是我第一次接触 COM,我可能走错了路!

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

TlbExp : warning TX8013117D : Type library exporter warning processing 'MyClassLibrary.IFoo.FooMethod(#0), MyClassLibrary'. Warning: Type library exporter encountered a generic type instance in a signature. Generic code may not be exported to COM.

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

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

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

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

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

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

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

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