为什么首先需要GUID属性?

时间:2009-07-01 06:19:08

标签: .net com attributes guid

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

5 个答案:

答案 0 :(得分:9)

如果编译器自动处理此问题,您最终会遇到以下两种情况之一。

  • 每次编译时都会有一个新的GUID - 因为GUID应该被发布,所以这会失败。

  • 冲突 - 如果GUID每次都相同,基于(比方说)名称的哈希,多个项目最终将使用相同的GUID用于不同目的。

现有方法 - 显式GUID使开发人员能够根据需要控制这些方法。

答案 1 :(得分:9)

这些属性对COM很重要。这是.NET的前身,并且在Java被淘汰之前在九十年代鼎盛时期。 .NET需要与COM兼容才有可能取得成功。或者换句话说,您需要能够以.NET语言编写COM服务器,这是大型遗留程序可以使用的。

[ComVisible]属性确保COM客户端程序可以查看和使用IEnumerable接口。允许客户端程序枚举.NET集合的必要条件。

[Guid]属性在COM中至关重要,它标识了一个接口。这是由guid而不是名称完成的,以确保它在不同程序员编写的多个应用程序中是唯一的。 .NET也有这个,但是使用一个名字可以让人们更容易。 “System.Collections.IEnumerable,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089”。

IEnumerable<>,通用版本,没有[Guid]。泛型与COM不兼容。这些日子并不重要,不再有太多可见的COM,大部分已被友好的.NET类包装。但在Windows中仍然非常核心,特别是在全新的WinRT(又名Metro,又名Modern UI,又名UWP)中。你也不直接使用它,使COM有点像Windows编程的汇编语言。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

有时,您希望为某些类或模块提供一个唯一的标识符,该标识符在您的源代码中是常量和硬编码的。

答案 4 :(得分:0)

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

  

控制单个托管类型或成员或程序集中所有类型的可访问性。

这告诉我们ComVisible与COM有关,并让我们指定COM程序是否可以看到特定类型。在页面的下方是一个链接,其中包含有关属性的详细信息以及类型库导出器如何使用它的详细信息。

第二个GuidAttribute,起初有点帮助:

  

当不希望使用自动GUID时,提供显式的System.Guid

但同样,你必须阅读剩下的部分,你会看到另一个类型库导出器的提及。

将这两者结合在一起,就会发现这两个属性控制了导出到类型库时如何处理IEnumerator。如果您不知道类型库是什么,这对您来说可能没什么意义。如果您不使用COM互操作,则可以安全地忽略这些属性。如果 使用COM互操作,则需要知道Guid以从非托管COM代码正确访问该接口。

Microsoft将这些内容放在每个接口定义上以备不时之需;阅读MSDN页面的部分技巧是识别这类信息,并知道何时对您没有任何用处。既然你知道这两个属性是什么,你应该能够弄清楚它们是否与你相关,否则就忽略它们。