有什么用[标记有ComVisible特性]默认和公共类COM曝光的交易吗?(What's t

2019-08-18 03:49发布

MSDN有这篇关于[ComVisible]属性 。 我不完全得到,当一个设置发生了什么[ComVisible(true)]

MSDN说:

默认值是true,这表示托管类型是COM可见。 不需要这种属性使公共管理组件类型可见 ; 他们是默认COM可见。 只有公共类型,可取得明显。

所以他们说的公共类型对COM可见默认。 但他们也说, 只有公共类型可以通过设置可见 [ComVisible(true)] 。 它不会是有道理的:如果公共类型,默认情况下可见的,那么怎么设置[ComVisible(true)]公开类型可见? 如果他们已经看到他们将如何获得更多的可见?

也许,我的理解是不正确的。 我将不胜感激,如果任何人都可以放一些轻上述声明。

Answer 1:

它不会是有道理的,当公共类型,默认情况下不可见,因此如何设置标记有ComVisible特性属性为true [标记有ComVisible特性(真),使公共类型可见。

他们看到默认情况下,因为ComVisibleAttribute的默认值是true。 明确其值设置为true不会改变任何东西,它只是使你的意图更加清晰。 这是的第一行的文档 ,你发现:

默认值是true,这表示托管类型是COM可见。 不需要这种属性使公共管理组件和类型可见; 他们是默认COM可见。 只有公共类型,可取得明显。 的属性不能用来使否则内部或被保护类型COM可见或进行不可视类型的成员是可见的。

基本上,你可以把它像编译器总是添加[ComVisibleAttribute(true)]对你的代码在默认情况下,如果你不自己做。

你需要设置该属性的唯一原因是为了防止公共类型被COM可见(在这种情况下,你将它设置为false)。 默认已经确保了自己的知名度。

显然,非公有制类型(例如,private和protected)不能和永远不会是COM可见。 此属性与无障碍等类型上没有任何影响。



Answer 2:

关键是,你还可以添加在(在AssemblyInfo.cs中)汇编级这个属性。 如果指定[assembly: ComVisible(true)] (或不指定,在装配水平等都有默认的相同效果),那么所有的公共类和接口和公有方法及其成为COM可见默认。

你也可以同样设置[assembly: ComVisible(false)]在装配水平,然后所有的公共实体将在默认情况下具有相同的效果,如果他们有[ComVisible(false)]他们,那么你只能标记那些类/接口/方法COM可见( [ComVisible(true)] ),你真正需要的。

这有助于当你有大量的公共实体,你不会暴露太多在这里 。 如果没有这个机制,你就必须设置[ComVisible(false)]每个类/接口/方法,你不想暴露。 使用[assembly: ComVisible(false)] ,您可以只公开你需要的东西。

而你只可以公开public实体COM(默认是或明确) -更严格的知名度实体不能暴露在COM。



文章来源: What's the deal with [ComVisible] default and public classes COM exposure?