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

use*_*783 38 .net c# 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.

sha*_*oth 16

拥有[assembly: ComVisible(false)][assembly: Guid("...")]在同一时间非常有意义在某些情况下.你从一个空的程序集开始,可能想要从它暴露给COM.因此,您将程序集标记为不ComVisible,然后将实体标记为公开为ComVisible.这就是GUID 默认存在原因.

无论如何,如果你真的不希望从程序集中暴露任何东西到COM,请在项目设置中取消选中"Register for COM interop"选项.


Han*_*ant 9

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

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

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