gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:06:44 27 4
gpt4 key购买 nike

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

CA1017 : Microsoft.Design : Because 'MyLibrary.dll' exposes externally visible types, mark it with ComVisible(false) at the assembly level and then mark all types within the assembly that should be exposed to COM clients with ComVisible(true)



有什么理由不让你的所有公共(public)类型都暴露给 COM?我猜有,但我无法想象这是什么原因。如果有的话,这似乎很不方便。

最佳答案

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

因此,我一直使用“选择加入”理念而不是“选择退出”,即我没有让所有 COM 可见,而是将程序集标记为 COM 不可见。然后,我专注于有选择地公开类型\成员(即通过选择加入),并确保公开的 API 对于 COM 是合理的(例如,COM 不支持泛型、方法重载或带参数的构造函数)并且它具有已在考虑 COM 的情况下进行了测试。通过这种方式,将 API 暴露给 COM 以一种严格的、经过测试的、有界的和可维护的方式完成。

这与让所有 COM 可见然后担心以后可能出现的任何问题相反,请记住,如果您暴露了所有内容,那么可能会与您的 COM 接口(interface)的用户发生耦合,这是您没有预料到的,现在很难退出的。

根据内存,有几个意外后果的例子:

  • 导出重载方法时,默认情况下它们会被导出并使用序列号命名,例如OverloadedMethod1、OverloadedMethod2 等。如果您重构代码并更改方法的顺序或插入重载等,那么任何从您以前的 COM 接口(interface)使用这些方法的人都会遇到麻烦。 OverloadedMethod1 和 OverloadedMethod2 可能已交换。
  • 暴露给 COM 的类必须有一个无参数的构造函数。如果没有维护此契约(Contract)的单元测试,那么以后很容易更改该类,使其没有无参数构造函数,从而破坏您的 COM 接口(interface)用户。
  • 关于.net - 为什么不鼓励将程序集标记为 ComVisible(true)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3309764/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com