【问题标题】:What's the deal with [ComVisible] default and public classes COM exposure?[ComVisible] 默认和公共类 COM 暴露是怎么回事?
【发布时间】:2013-03-19 06:40:22
【问题描述】:

MSDN 有this article about [ComVisible] attribute。我不太明白当设置[ComVisible(true)] 时会发生什么。

MSDN 说

默认为 true,表示托管类型对 COM 可见。 公共托管程序集类型可见不需要此属性;默认情况下,它们对 COM 可见。只能使公共类型可见。

所以他们说公共类型默认对 COM 可见。但他们也说只有公共类型可以通过设置[ComVisible(true)] 可见。这没有意义:如果公共类型默认可见,那么设置[ComVisible(true)] 如何使公共类型可见?如果它们已经可见,它们将如何变得更加可见?

也许我的理解不正确。如果有人能对上述陈述有所了解,我将不胜感激。

【问题讨论】:

  • 一个令人困惑的方面是默认的 Visual Studio 类库模板添加了一个 [assembly:ComVisible(false)] 属性(在 AssemblyInfo.cs 中)。这会将项目中所有类型的“默认”设置为 false。项目属性的程序集信息中的“使程序集 COM-Visible”标志设置此。
  • 这里有个窍门。 ComVisible 的默认值是 true 好吧,如果它不是由任何人设置的,但 Visual Studio 将此值设置为 false。这意味着除非您手动打开它,否则您的程序集不会是 ComVisible。但是在VS2008之前这个属性确实是默认设置为true的。

标签: c# com comvisible


【解决方案1】:

诀窍是您还可以在程序集级别添加此属性(在 AssemblyInfo.cs 中)。如果您指定[assembly: ComVisible(true)](或不在程序集级别指定,默认情况下具有相同的效果),则所有公共类和接口及其公共方法默认变为 COM 可见。

您也可以在程序集级别设置[assembly: ComVisible(false)],然后所有公共实体默认具有相同的效果,就好像它们有[ComVisible(false)]一样,因此您只能将这些类/接口/方法标记为COM - 你真正需要的可见 ([ComVisible(true)])。

当您有很多公共实体 here 时,这可以帮助您不要暴露太多。如果没有这种机制,您将不得不将[ComVisible(false)] 设置为您不想暴露的每个类/接口/方法。使用[assembly: ComVisible(false)] 可以让你只公开你需要的东西。

并且您只能将public 实体暴露给 COM(默认或显式) - 具有更严格可见性的实体不能暴露给 COM。

【讨论】:

    【解决方案2】:

    没有意义,当公共类型默认可见时,如何将 ComVisible 属性设置为 true [ComVisible(true)] 使公共类型可见。

    默认情况下它们是可见的,因为 ComVisibleAttribute 的默认值为 true。将属性显式设置为 true 不会改变任何内容,它只会让您的意图更加清晰。这是您找到的the documentation 的第一行:

    默认为true,表示托管类型对COM可见。使公共托管程序集和类型可见,不需要此属性;默认情况下,它们对 COM 可见。只有 public 类型可以显示。该属性不能用于使其他内部或受保护的类型对 COM 可见或使不可见类型的成员可见。

    基本上,你可以把它想象成编译器总是默认添加[ComVisibleAttribute(true)]到你的代码中,如果你不自己做的话。

    您需要设置此属性的唯一原因是防止公共类型对 COM 可见(在这种情况下,您可以将其设置为 false)。默认设置已经确保了它们的可见性。

    显然,非公共类型(例如私有和受保护)不能也永远不会对 COM 可见。此属性对具有此类可访问性的类型没有影响。

    【讨论】:

    • 它们并不完全相同。例如,如果 ComVisible 在程序集级别设置为 false,则在类中某处设置的“true”将覆盖它
    猜你喜欢
    • 1970-01-01
    • 2011-12-19
    • 2013-08-07
    • 1970-01-01
    • 2017-09-14
    • 2018-06-10
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多