在Visual中创建新的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。
发布于 2010-02-27 15:34:17
同时拥有[assembly: ComVisible(false)]和[assembly: Guid("...")]是非常合理的in certain cases。从一个空程序集开始,您可能希望将其中的某些内容公开给COM。因此,您可以将程序集标记为非ComVisible,然后将要公开的实体标记为ComVisible。这就是GUID默认存在的原因。
无论如何,如果您真的不想公开从程序集到COM的任何内容,请在项目设置中保留“”选项。
发布于 2010-02-27 15:17:55
在COM中,一致的GUID是绝对必要的。程序集:Guid属性生成类型库LIBID。当然,项目模板自动生成一个以确保程序员在s/他将ComVisible翻转为true时不会忘记提供一个模板。
如果没有提供程序集Guid,那么Tlbexp.exe从程序集名称、版本和公钥中合成一个。这还不够好,类型库已经有了一个版本。更改AssemblyVersion将生成不同的LIBID。特别糟糕的是,当您对版本使用自动增量选项(比如1.0.*)时,您可以快速地用大量的死TypeLib注册表项填充注册表。
长话短说,它避免了许多令人讨厌的灾难。
发布于 2010-02-27 08:11:33
不,没有真正的理由把它包括进去。除了在非常具体的COM互操作场景之外,这真的是非常不必要的。不过,我认为,拥有一个GUID可以通过反射访问,这可能会有一些有用的东西。但既然不能保证它的存在,你就不可能依赖它。
https://stackoverflow.com/questions/2346620
复制相似问题