为什么GUID属性需要摆在首位?(Why is GUID attribute needed in t

2019-06-24 14:50发布

什么是必要的GUID属性? 为什么不只是让编译器自动处理这个?

Answer 1:

如果编译器自动处理这一点,你会最终两种情况之一。

  • 一个新的GUID每次编译时间 - 因为GUID的都应该公布,这将失败。

  • 碰撞 - 如果GUID是每次都一样的,根据(比方说)这个名字的哈希值,多个项目最终将使用相同的GUID用于不同的目的。

现有的方法 - 一个明确的GUID使开发人员根据需要控制这些权力。



Answer 2:

这是事关一个伟大的交易,COM属性。 这是.NET的前身了全盛时期在上个世纪九十年代,Java的风头了。 .NET需要与COM兼容有成功的机会。 或者换句话说,你需要能够写在一个大的传统程序可以使用.NET语言COM服务器。

的[标记有ComVisible特性]属性确保COM客户程序可以看到并使用IEnumerable接口。 必须允许客户端程序来列举.NET的集合。

的[的Guid]属性是在COM至关重要的,它指定了一个接口。 这是由一个GUID,而不是名义下进行,以确保它是跨不同的程序员编写的多个应用程序是唯一的。 .NET有这个太,但却使用了名称,使之对人体更容易。 “System.Collections.IEnumerable,mscorlib程序,版本= 2.0.0.0,文化=中性公钥= b77a5c561934e089”。

IEnumerable的<>,通用版本,不具有[的Guid]。 泛型是不兼容COM。 它并没有多大关系,这些天,没有多少可见COM身边了,大部分已被友好的.NET类包装。 不过还是很核心的Windows中,特别是在全新的WinRT(又名地铁,又名现代的UI,又名UWP)。 你不使用任何直接,使得COM有点像Windows程序设计的汇编语言。



Answer 3:

你可以这样做(只是省略了属性),但是编译器会生成一个新的GUID每个重新编译,即使接口没有改变。 这是不幸的,因为该接口的用户不知道的变化,并且将检索界面通过它的老GUID,因此将无法取回。



Answer 4:

有时你想给某些类或模块的唯一标识符是恒定的,硬编码源里面。



Answer 5:

要阅读这个定义你需要查找每个这些属性的含义。 第一, ComVisibleAttribute ,被描述为这样的:

的个体的对照可访问管理类型或成员,或所有类型的组件内,以COM。

这告诉我们, ComVisible是事做COM,并让我们指定一个特定的类型是否是COM程序可见的。 网页上再往下是更多详细信息的链接的属性是什么,以及如何通过它的类型库导出使用。

第二, GuidAttribute ,起初是有点不太有用:

提供一个明确的System.Guid时自动GUID是不可取

但同样,你必须阅读的方式休息下来,你会看到类型库导出的再次提及。

把这些两者结合起来,它开始变得清晰,这两个属性控制如何IEnumerator处理时导出到类型库。 如果你不知道一个类型库是什么,这可能并不意味着多给你。 如果您不使用COM互操作,那么这些属性可以安全地忽略。 如果您正在使用COM互操作,你需要知道Guid正确地从非托管COM代码访问接口。

微软把这些在每一个案件的接口定义,你需要他们。 在阅读MSDN页面技能的一部分,是认识到这种类型的信息,并知道什么时候是没有任何使用你。 现在你知道什么这两个属性是,你应该能够找出它们是否与你有关,否则忽略它们。



文章来源: Why is GUID attribute needed in the first place?