web-dev-qa-db-ja.com

[ComVisible]のデフォルトクラスとパブリッククラスのCOMエクスポージャーはどうなりますか?

MSDNには _[ComVisible]_属性に関するこの記事 があります。 [ComVisible(true)]を設定するとどうなるかわかりません。

MSDNは言う

defaultはtrueであり、マネージタイプがCOMに表示されることを示します。この属性は、パブリックマネージアセンブリおよびタイプを可視にするために必要ではありません。これらはデフォルトでCOMに表示されます。パブリックタイプのみを表示できます。

そのため、パブリック型はデフォルトでCOMに表示されます。しかし、彼らはまた、パブリック型のみを可視化できる[ComVisible(true)]を設定することで言う。意味がありません:パブリックタイプがデフォルトで表示される場合、[ComVisible(true)]を設定するとパブリックタイプが表示されますか?それらが既に表示されている場合、どのようにもっと表示されますか?

おそらく私の理解は正しくありません。誰かが上記の声明に何らかの光を当てることができれば感謝します。

27
user2166888

パブリックタイプがデフォルトで表示されている場合、それは意味をなさないので、ComVisible属性をtrue [ComVisible(true)]に設定するとパブリックタイプが表示されます。

ComVisibleAttributeのデフォルト値がtrueであるため、デフォルトで表示されます。属性を明示的にtrueに設定しても何も変更されず、意図が明確になります。これが ドキュメント の最初の行です:

デフォルトはtrueです。これは、マネージタイプがCOMに表示されることを示します。この属性は、パブリックのマネージアセンブリと型を表示するために必要ではありません。デフォルトでは、COMに表示されます。 publicタイプのみを表示できます。この属性を使用して、COMから内部型または保護された型を表示したり、非表示型のメンバーを表示したりすることはできません。

基本的に、コンパイラーは、自分で実行しない場合、デフォルトで常に[ComVisibleAttribute(true)]をコードに追加するように考えることができます。

この属性を設定する必要がある唯一の理由は、preventパブリックタイプがCOMから見えないようにすることです(この場合、falseに設定します)。デフォルトではすでに可視性が保証されています。

明らかに、非パブリックタイプ(プライベートおよび保護など)は、COMに表示されることはありません。この属性は、このようなアクセシビリティを持つタイプには影響しません。

20
Cody Gray

秘Theは、この属性をAssemblyレベル(AssemblyInfo.cs)で追加することもできます。 [Assembly: ComVisible(true)]を指定した場合(またはアセンブリレベルで指定せず、既定で同じ効果を持つ場合)、すべてのパブリッククラスとインターフェイス、およびそのパブリックメソッドは既定でCOMに表示されます。

アセンブリレベルで[Assembly: ComVisible(false)]を設定すると、すべてのパブリックエンティティはデフォルトで[ComVisible(false)]を持っている場合と同じ効果を持つため、これらのクラスのみをマークできます。/interfaces/methods本当に必要なCOM可視([ComVisible(true)])。

これにより、 here のように多くの公開エンティティがある場合に公開しすぎないようにすることができます。このメカニズムがないと、[ComVisible(false)]を公開したくない各クラス/インターフェース/メソッドに設定する必要があります。 [Assembly: ComVisible(false)]を使用すると、必要なものだけを公開できます。

また、publicエンティティのみをCOMに公開できます(デフォルトまたは明示的に)-より厳密な可視性を持つエンティティはCOMに公開できません。

21
sharptooth