我总是用[assembly: ComVisible(true)]
将我的.NET程序集标记为对COM可见,认为我永远不知道什么时候有人可能需要从COM调用它们。我也开始使用FxCop,并开始从代码分析中看到以下警告:
CA1017 : Microsoft.Design :由于“MyLibrary.dll”公开了外部可见的类型,请在程序集级别将其标记为ComVisible(false),然后使用ComVisible(true)标记程序集中应向COM客户端公开的所有类型
有没有什么原因让你不希望所有的公共类型都暴露给COM?我猜是有的,但我无法想象这是什么原因。如果说有什么不同的话,那就是它看起来明显不方便。
发布于 2010-07-22 22:27:55
关键是,导出COM接口不是免费的,因为存在不兼容性和必须满足的要求。这必须既要考虑,又要维护。(警告CA1017暗示了这一点。)
因此,我一直遵循“选择加入”的原则,而不是“选择退出”,也就是说,我将程序集标记为不可见,而不是让所有COM组件都可见。然后,我专注于有选择地公开类型\成员(即选择加入),并确保所公开的API对于COM是合理的(例如,COM不支持泛型、方法重载或接受参数的构造函数),并且已在头脑中使用COM进行了测试。通过这种方式,以一种严格的、经过测试的、有界的和可维护的方式将API公开给COM。
这与使所有COM都可见,然后在以后担心任何潜在问题是相反的,请记住,如果您公开了所有内容,则可能会与COM接口的用户发生耦合,这是您没有预料到的,现在将很难退出。
从记忆中看几个意想不到的后果:
发布于 2014-07-15 03:47:49
作为参考,如果未应用程序集级ComVisibleAttribute
,则假定所有公共类都是COM可见的。未能将程序集标记为[assembly: ComVisible(false)]
通常会导致以下代码分析警告,即使对于未标记为[ComVisible(true)]
的类型也是如此:
CA1405:COM可见类型基类型应为COM可见
发布于 2010-07-22 22:20:48
随着泛型和其他高级类型的出现,现在方法公开不可见的类型比公开可见的类型更常见。
CA1017中推荐的方法旨在鼓励您仅公开那些要向COM公开的类型。
https://stackoverflow.com/questions/3309764
复制相似问题