使用ComVisible(false)时指定Guid有什么意义吗?

时间:2010-02-27 08:02:34

标签: c# .net com guid comvisible

在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。

3 个答案:

答案 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很有用。但由于它不能保证在那里,它不像你可以依赖它。