41

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

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

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


編集:

回答を要約すると:

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

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

4

3 に答える 3

18

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

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

于 2010-02-27T15:34:17.160 に答える
9

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

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

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

于 2010-02-27T15:17:55.093 に答える
4

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

于 2010-02-27T08:11:33.680 に答える