2017-08-28 74 views
2

我有幾個C#彙編庫,它們沒有強烈命名(簽名)。我想使用tlbexp.exe在這些組件上製作一個SxS COM包裝器以在本機程序中使用。是否有必要簽署他們或有另一種方式來做到這一點?COM互操作性需要強命名程序集嗎?

由於

+0

爲什麼你有C++標籤?我的帖子中沒有提及C++語言。另外,程序集和COM不是C++標準語言的一部分。 –

回答

0

當組件被強命名,其類型只能從其他強命名組件中使用。由於你的程序集沒有強命名,所以不需要簽名你的COM包裝器。

簽署程序集可以將其放置在全局程序集緩存(GAC)中。這有利於保持多個版本並排,而不會破壞現有的客戶端。

另一種方法是通過regasm/codebase開關使用Windows註冊表。與傳統COM組件的設置方式大致相同,此選項在系統範圍內註冊COM可見組件。

由於您希望通過SxS /免註冊激活部署您的COM包裝器,因此完全繞過註冊表和GAC,因此實際上不需要對其進行簽名。

2

在這個問題上存在很大的誤解,它使兩位程序員的角色混淆不清。你是圖書館的作者,其他人使用你的圖書館,可能爲另一家公司工作,並且不知道你是誰。客戶端程序員。您反過來不知道客戶端程序員如何使用您的庫,他編寫了多少程序,以及他如何在用戶的機器上部署您的庫。您只運行Tlbexp.exe來幫助他編寫他的代碼。

這是一個麻煩的祕訣,就像無論您在創建庫時使用何種語言或工具。當您在庫中進行更改時,這種麻煩開始,客戶端程序員必須重新構建並重新部署使用您的庫的程序。

COM庫存在額外的麻煩,因爲默認情況下注冊是在整個機器範圍內進行的。如果您所做的更改是錯誤修復,那麼這非常好,所有使用您的庫的客戶端程序都會自動獲得修復。但如果更改中斷並導致舊客戶端程序失敗,那就不好了。標準的災難是客戶端程序員重建這個程序的一些,但忘記或忽略他不再維護的一些舊的。最終用戶通常是真正的受害者,他有一個程序崩潰,但兩個程序員認爲這不是他們需要解決的問題。

客戶端程序員不更新的程序需要繼續使用舊版本的庫,因此它不受更改影響。換句話說,需要在用戶機器上有多個DLL副本,並且程序自動需要選擇正確的DLL。

謝天謝地,這對於[ComVisible] .NET程序集很容易做到。客戶程序員,他的用戶或您爲他提供的安裝程序都可以將程序集放入GAC。它允許程序集的多個副本並排存在,並且CLR可以自動找到正確的一個。這有兩個的要求。你需要碰撞你的庫的[AssemblyVersion],這是標準的。該程序集需要有一個強大的名稱,以便可以放入GAC中。這很簡單,你可以使用Project> Properties> Signing並勾選「Sign the assembly」複選框。這沒有安全隱患,因此密鑰無關緊要,並且密碼是完全不必要的。這是而不是容易由客戶端程序員做,所以這是你必須做的事情。總是。

客戶端程序員還可以選擇使用隔離的COM與清單(也稱爲「regfree COM」),可能是您的意思是「SxS COM-wrapper」。有了他編寫的每個程序都有自己的DLL副本的好處,它在.NET中的默認工作方式。需要手動部署錯誤修復程序,但是您的庫中的更改無法破壞無人維護的客戶端程序。但這完全是他的選擇,沒有任何事情可以確保完成。你必須假設他不使用它,他幾乎肯定不會在第一時間,所以你不能繞過強名的需要。