我创建了一个.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的评论是否不正确?
答案 0 :(得分:0)
所以Hans Passant发布了一个很好的答案,但随后删除了它,我不知道为什么。在其中他提到当然,应用于泛型类型的属性不会因为该类型的用户指定类型而改变。显然,这意味着封闭或开放的泛型类型适用于COM。
可用的替代方法是创建一个通过封装包装泛型类型的具体类型,或者切换到使用非泛型集合类型,例如ArrayList
,并遵守我使用它的类型。
后一种选择的缺点是,虽然 I 可能对返回给客户端的数据具有类型规则,但没有什么可以强制客户端遵循它作为参数传递的数据中的类似规则。 前一个选项的优点是强制执行集合项类型,对COM和非COM客户端仍然有用。