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の両方が含まれているのはこのためです。
[Assembly: ComVisible(false)]
と[Assembly: Guid("...")]
を同時に持つことは完全に理にかなっています 特定の場合 。空のアセンブリから始めて、そこから何かをCOMに公開したいと思うかもしれません。したがって、アセンブリをComVisible
ではなくマークし、後で公開するエンティティをComVisible
としてマークします。これが、デフォルトでGUIDが存在する)理由です。
とにかく、アセンブリからCOMに何も公開したくない場合は、プロジェクト設定で[COM相互運用機能に登録]オプションをオフのままにします。
一貫性のあるGUIDは、COMでは絶対に不可欠です。 [Assembly:Guid]属性は、タイプライブラリLIBIDを生成します。確かに、プロジェクトテンプレートは、ComVisibleをtrueに切り替えたときにプログラマーがテンプレートを提供することを忘れないように、テンプレートを自動生成します。
アセンブリ[GUID]が提供されていない場合、Tlbexp.exeは、アセンブリ名、バージョン、および公開鍵からアセンブリ[GUID]を合成します。それは本当に十分ではありません、タイプライブラリにはすでにバージョンがあります。 [AssemblyVersion]を変更すると、異なるLIBIDが生成されます。バージョンの自動インクリメントオプション(1.0。*など)を使用する場合は特に悪いことですが、レジストリに大量の死んだTypeLibレジストリキーをすぐに埋めることができます。
簡単に言えば、それは多くの厄介な事故を回避します。
いいえ、それを含める本当の理由はありません。非常に特殊なCOM相互運用シナリオを除いて、これは実際にはかなり不要です。 何かリフレクションでアクセスできるGUID)があると便利だと思いますが、そこにあることが保証されていないため、信頼できるとは限りません。その上に。