2013-03-28 65 views
19

MSDN has this article about [ComVisible] attribute。当我设置[ComVisible(true)]时,我不太明白会发生什么情况。[ComVisible]默认和公共类COM暴露有什么关系?

MSDN说

默认值为true,这表明托管类型是COM可见。此属性不需要制作公共管理组件类型可见;默认情况下它们对COM可见。只有公共类型可以显示。

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

也许我的理解是不正确的。如果有人能够对上述说法进行阐述,我将不胜感激。

+5

一个令人困惑的方面是,默认的Visual Studio类库模板添加了[assembly:ComVisible(false)]属性(在AssemblyInfo.cs中)。这会将项目中所有类型的“默认”设置为false。项目属性的“组件信息”中的“使组件可见”标志设置此项。 – Govert

+0

这里有一个窍门。 ComVisible的默认值是正确的,如果它不是由任何人设置的,但Visual Studio将此值设置为false。这意味着除非手动打开它,否则您的程序集将不会是ComVisible。但是在VS2008之前,这个属性默认设置为true。 – Johnny

回答

16

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

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

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

基本上,你可以认为它就像编译器总是将[ComVisibleAttribute(true)]添加到你的代码中,如果你不自己做。

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

显然,非公开类型(例如,私有和受保护的)不能也不会被COM看到。该属性对具有这种可访问性的类型没有影响。

+2

他们不完全一样。例如,如果ComVisible在程序集级别设置为false,则类中某个地方的“true”集合将覆盖它 – Joezer

18

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

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

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

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