在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。
答案 0 :(得分:15)
同时拥有[assembly: ComVisible(false)]
和[assembly: Guid("...")]
非常有意义in certain cases。你从一个空的程序集开始,可能想要从它暴露给COM。因此,您将程序集标记为ComVisible
,然后将实体标记为ComVisible
。这就是为什么GUID默认存在 。
无论如何,如果你真的不希望从程序集中暴露任何东西到COM,请在项目设置中取消选中“Register for COM interop”选项。
答案 1 :(得分:9)
一致的GUID在COM中绝对必不可少。 [assembly:Guid]属性生成类型库LIBID。当然,项目模板会自动生成一个,以确保程序员在他/她将ComVisible转换为true时不会忘记提供一个。
如果未提供程序集[Guid],则Tlbexp.exe将从程序集名称,版本和公钥中合成一个程序集。这还不够,类型库已经有了版本。更改[AssemblyVersion]将生成不同的LIBID。当您使用版本的自动增量选项(如1.0。*)时尤其糟糕,您可以使用大量死亡的TypeLib注册表键快速填充注册表。
长话短说,它避免了很多令人讨厌的事故。
答案 2 :(得分:4)
不,没有真正的理由将它包括在内。除非在非常具体的COM互操作场景中,否则这是非常不必要的。虽然我认为有一些某些对于拥有可以使用反射访问的GUID很有用。但由于它不能保证在那里,它不像你可以依赖它。