2009-07-01 94 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頁面的一部分技能是識別這種類型的信息並知道它何時對你沒有任何用處。現在你知道這兩個屬性的用途了,你應該能夠弄清楚它們是否與你有關,否則就忽略它們。

相關問題