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 和 GUID。

4

3 回答 3

18

在某些情况下,拥有[assembly: ComVisible(false)][assembly: Guid("...")]同时是非常有意义的。您从一个空程序集开始,并且可能希望将其中的某些内容暴露给 COM。因此,您将程序集标记为 not ,然后将要公开的实体标记为. 这就是 GUID默认存在的原因。ComVisibleComVisible

无论如何,如果您真的不想将程序集中的任何内容暴露给 COM,请在项目设置中取消选中“注册 COM 互操作”选项。

于 2010-02-27T15:34:17.160 回答
9

一致的 GUID 在 COM 中是绝对必要的。[assembly:Guid] 属性生成类型库 LIBID。当然,项目模板会自动生成一个,以确保程序员在他/她将 ComVisible 翻转为 true 时不会忘记提供一个。

如果未提供程序集 [Guid],则 Tlbexp.exe 从程序集名称、版本和公钥合成一个。这还不够好,类型库已经有一个版本。更改 [AssemblyVersion] 将生成不同的 LIBID。当您使用版本的自动增量选项(如 1.0.*)时尤其糟糕,您可以用大量无效的 TypeLib 注册表项快速填充注册表。

长话短说,它避免了很多令人讨厌的事故。

于 2010-02-27T15:17:55.093 回答
4

不,没有真正的理由包含它。除了非常特定的 COM 互操作场景外,这真的非常不必要。虽然我认为拥有一个可以通过反射访问的 GUID可能会有一些有用的东西。但由于它不能保证在那里,它不像你可以依赖它。

于 2010-02-27T08:11:33.680 回答