2009-07-01 69 views

回答

9

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

  • 每次编译时新的GUID - 因为GUID应该发布,所以这会失败。冲突 - 如果GUID每次都是相同的,基于(比如说)哈希名称,多个项目最终会使用相同的GUID用于不同的目的。

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

+1

因此,手动使用该属性的“健康习惯”,还是只在某些情况下才需要? – Nissim 2009-07-01 06:35:21

1

有时候你想给某些类或模块一个唯一的标识符,这个标识符在源代码中是固定的和硬编码的。

2

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

8

这些属性对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)中。你也不要直接使用它,使COM有点像Windows编程的汇编语言。

0

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

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

这告诉我们ComVisible与COM有关,可以让我们指定某个特定类型是否对COM程序可见。进一步在页面上的链接是关于属性是什么以及类型库导出器如何使用它的更多细节的链接。

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

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

但同样,你必须阅读休息一路下来,你会看到另一种类型库出口商。

把这两个放在一起,它开始变得清晰,这两个属性控制着如何导出到一个类型库时处理IEnumerator。如果你不知道类型库是什么,这可能对你没有多大意义。如果你不使用COM互操作,那么这些属性可以安全地被忽略。如果您使用COM interop的,则需要知道Guid才能从非托管COM代码正确访问该接口。

微软将这些放在每个接口定义上,以防需要它们;阅读MSDN页面的一部分技能是识别这种类型的信息并知道它何时对你没有任何用处。现在你知道这两个属性的用途了,你应该能够弄清楚它们是否与你有关,否则就忽略它们。

相关问题