web-dev-qa-db-ja.com

ComVisible(false)を使用するときにGuidを指定することに意味はありますか?

Visual Studioで新しいC#プロジェクトを作成すると、生成されたAssemblyInfo.csファイルには、アセンブリGUIDを指定する属性が含まれます。属性の上のコメントは、「このプロジェクトがCOMに公開されている場合」に使用されることを示しています。

どのアセンブリにもCOMに表示する必要のある型が含まれていないため、アセンブリに[Assembly: ComVisible(false)]のマークを付けました。では、GUIDを指定する意味はありますか?

私の考えでは、答えは「いいえ」です。それでは、デフォルトのAssemblyInfo.csファイルに[Assembly: ComVisible(false)][Assembly: Guid("...")]の両方が含まれているのはなぜですか。


編集:

回答を要約すると:

それらの間で、回答は、COM相互運用機能が使用されている場合にのみGUIDを指定する必要があることを説明しています。したがって、私の状況では、a GUID必要。

sharptoothはさらに、[Assembly: ComVisible(false)]は、個々のタイプのComVisibleをオーバーライドできるため、COM相互運用機能を使用しないことを意味しないと説明しています。デフォルトのAssembyInfo.csに[Assembly: ComVisible(false)]とGUIDの両方が含まれているのはこのためです。

38
user200783

[Assembly: ComVisible(false)][Assembly: Guid("...")]を同時に持つことは完全に理にかなっています 特定の場合 。空のアセンブリから始めて、そこから何かをCOMに公開したいと思うかもしれません。したがって、アセンブリをComVisibleではなくマークし、後で公開するエンティティをComVisibleとしてマークします。これが、デフォルトでGUIDが存在する)理由です

とにかく、アセンブリからCOMに何も公開したくない場合は、プロジェクト設定で[COM相互運用機能に登録]オプションをオフのままにします。

16
sharptooth

一貫性のあるGUIDは、COMでは絶対に不可欠です。 [Assembly:Guid]属性は、タイプライブラリLIBIDを生成します。確かに、プロジェクトテンプレートは、ComVisibleをtrueに切り替えたときにプログラマーがテンプレートを提供することを忘れないように、テンプレートを自動生成します。

アセンブリ[GUID]が提供されていない場合、Tlbexp.exeは、アセンブリ名、バージョン、および公開鍵からアセンブリ[GUID]を合成します。それは本当に十分ではありません、タイプライブラリにはすでにバージョンがあります。 [AssemblyVersion]を変更すると、異なるLIBIDが生成されます。バージョンの自動インクリメントオプション(1.0。*など)を使用する場合は特に悪いことですが、レジストリに大量の死んだTypeLibレジストリキーをすぐに埋めることができます。

簡単に言えば、それは多くの厄介な事故を回避します。

9
Hans Passant

いいえ、それを含める本当の理由はありません。非常に特殊なCOM相互運用シナリオを除いて、これは実際にはかなり不要です。 何かリフレクションでアクセスできるGUID)があると便利だと思いますが、そこにあることが保証されていないため、信頼できるとは限りません。その上に。

4
Josh