2013-08-21 123 views
2

所以我正在使用NetOffice創建一個Outlook插件。GuidAttribute&ProgId,它們是幹什麼用的?

在插件入口點它是這樣的:

[GuidAttribute("d7066ab2-ac03-431a-bea5-b70d3efab2a5"), ProgId("OutlookPlugin"), ComVisible(true)]

現在我明白ComVisible位設置庫作爲,好,標記有ComVisible特性。我認爲這樣做是爲了讓我可以通過Assembly Information - > Make assembly COM-Visible來製作單個類ComVisible而不是整個庫。

但我不明白GuidAttributeProgId用於什麼?

回答

4

COM的一個重要特性是應用程序可以要求創建類對象,並且COM會對可執行程序實現它進行分類併爲您加載它。這需要一個很好的方法來識別組件。

你會說:「好吧,不是問題,只是給它一個名字」。問題是,人們不擅長挑選好名字。有一羣人稱爲「漢斯」,我知道至少有一個人擁有我的確切名字。住在某個地方是荷蘭,不知道他是誰。

這是一個問題,與人名不同,組件名稱衝突是致命的。你會得到完全錯誤的組件,並且你的程序會崩潰。所以COM設計者決定唯一的好解決方案是全球唯一ID,這個數字在整個已知的宇宙中保證是唯一的。一個GUID。

COM應用程序使用該號碼來要求創建對象。底層的api函數是CoCreateInstance,第一個參數是CLSID,它是標識該類的guid。

然而人們並不是很善於記住很長的數字。因此,有一種備份方法可以識別組件,尤其是在腳本語言中使用它。那種以可靠的方式獲得guid值的運行時環境並不是那麼容易。所以這個號碼還有一個名字。這是ProgId。您將它傳遞給一個名爲CreateObject()的助手函數。它做了一個額外的步驟,它使用幫助函數CLSIDFromProgID()將名稱映射到號碼,然後調用CoCreateInstance。不用說,這有時會出現問題。

+0

我覺得這是一個更好的答案 - 謝謝。 – Cheetah

2

所有COM類 - 也稱爲CoClass(es) - 接口由它們的GUID(也分別稱爲CLSID和IID)標識。 CoClasses也有一個友好名稱的ProgID。

當COM組件或COM-Visible程序集註冊(分別與RegSvr32.exe或RegAsm.exe)並相互引用時,所有這些都存儲在註冊表中。

+0

我爲什麼要設置這些?我不能讓他們從.NET自動生成?我可以只使用程序集的相同GUID嗎? – Cheetah

+0

程序集中可能有多個CoClass和接口。如果它們是在每個彙編中自動生成的,那麼您如何保證它們保持不變?你應該讓他們用相應的程序(uuidgen.exe或其GUI版本guidgen.exe,可從Visual Studio的** Tools **菜單中調用)生成一次*並將它們保存在源代碼中。 – Medinoc

+0

沒問題,所以這隻適用於ComVisible類? (即我的App中的入口點類)。鑑於我的大會不是可見的,我可以只使用該GUID?或者最好的做法是讓他們有所不同? – Cheetah

1

對於ProgId,我覺得文檔關於它的用法很清楚:

的ProgIDs將自動被命名空間的類型名稱合併爲一類產生的。但是,這可能會產生無效的ProgID,因爲ProgID限制爲39個字符,並且除句點之外不能包含任何標點符號。在這種情況下,ProgID可以使用ProgIdAttribute手動分配給類。

這裏沒有列出的原因是手動分配它使在整個構建中一致

相關問題