首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么不鼓励将程序集标记为ComVisible(true)?

为什么不鼓励将程序集标记为ComVisible(true)?
EN

Stack Overflow用户
提问于 2010-07-22 22:12:11
回答 5查看 15K关注 0票数 21

我总是用[assembly: ComVisible(true)]将我的.NET程序集标记为对COM可见,认为我永远不知道什么时候有人可能需要从COM调用它们。我也开始使用FxCop,并开始从代码分析中看到以下警告:

CA1017 : Microsoft.Design :由于“MyLibrary.dll”公开了外部可见的类型,请在程序集级别将其标记为ComVisible(false),然后使用ComVisible(true)标记程序集中应向COM客户端公开的所有类型

有没有什么原因让你不希望所有的公共类型都暴露给COM?我猜是有的,但我无法想象这是什么原因。如果说有什么不同的话,那就是它看起来明显不方便。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-22 22:27:55

关键是,导出COM接口不是免费的,因为存在不兼容性和必须满足的要求。这必须既要考虑,又要维护。(警告CA1017暗示了这一点。)

因此,我一直遵循“选择加入”的原则,而不是“选择退出”,也就是说,我将程序集标记为不可见,而不是让所有COM组件都可见。然后,我专注于有选择地公开类型\成员(即选择加入),并确保所公开的API对于COM是合理的(例如,COM不支持泛型、方法重载或接受参数的构造函数),并且已在头脑中使用COM进行了测试。通过这种方式,以一种严格的、经过测试的、有界的和可维护的方式将API公开给COM。

这与使所有COM都可见,然后在以后担心任何潜在问题是相反的,请记住,如果您公开了所有内容,则可能会与COM接口的用户发生耦合,这是您没有预料到的,现在将很难退出。

从记忆中看几个意想不到的后果:

  1. 导出重载方法时,默认情况下会导出这些方法并使用序列号命名,例如OverloadedMethod1、OverloadedMethod2等。如果您重构代码并更改方法的顺序或插入重载等,则会遇到在以前的COM接口中使用这些方法的任何人的麻烦。暴露给COM的swapped.
  2. Classes的OverloadedMethod1和OverloadedMethod2必须有一个无参数的构造函数。如果没有适当的单元测试来维护此约定,则很容易在以后更改该类,使其不具有无参数构造函数,从而破坏您的COM接口用户。
票数 29
EN

Stack Overflow用户

发布于 2014-07-15 03:47:49

作为参考,如果未应用程序集级ComVisibleAttribute,则假定所有公共类都是COM可见的。未能将程序集标记为[assembly: ComVisible(false)]通常会导致以下代码分析警告,即使对于未标记为[ComVisible(true)]的类型也是如此:

CA1405:COM可见类型基类型应为COM可见

票数 6
EN

Stack Overflow用户

发布于 2010-07-22 22:20:48

随着泛型和其他高级类型的出现,现在方法公开不可见的类型比公开可见的类型更常见。

CA1017中推荐的方法旨在鼓励您仅公开那些要向COM公开的类型。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3309764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档