簡體   English   中英

有關COM .net程序集,重排,dll,tlb和guids的幾個簡短問題

[英]Several short questions about COM .net assemblies, regasm, dll, tlb and guids

所有問題都與.net Framework 2.0中的.net項目dll有關,該dll將自身公開為COM。

1)如果我們在源代碼(typelib,類,接口)中未指定任何GUID,那么誰在生成GUID? 編譯還是高潮?

2)GUID值存在於dll,tlb或兩個文件中嗎?

3)任何具有相同源代碼的開發人員都會在其生成或運行重裝的機器上獨立生成非常相同的GUID?

4)如果我通過現有的dll和tlb文件運行regasm,如果dll和tlb不匹配怎么辦? Regasm使用最新元素和GUID重新生成tlb文件嗎? 還是將TypeLib注冊到當前的tlb文件?

5)使用dll和tlb參數設置運行regasm有什么意義? Tlb文件是部署內容的一部分,還是最佳做法是僅部署dll,讓regasm快速生成tlb?

6)最后一個問題,真的需要tlb嗎? 擁有tlb文件的意義是什么? 並非所有信息都已在注冊表中? 它提供什么額外的信息?

7)在注銷時,我們需要提供什么? dll文件? Tlb? 都? 如果dll(或tlb)與現有的reg條目不匹配怎么辦? 如果已經使用tlb選項注冊,但是我只運行dll的regasm unregister,它也會刪除TypeLyb條目嗎?

8)關於位,再充氣也總是在SysWow64下生成條目嗎? Framework64下的重制與Framework下的重制相同嗎?

類型庫與.NET元數據完全等效。 它對客戶端程序員最重要的是,它使編譯器和IDE更加了解您的庫。 提供自動完成和語法檢查功能,因此他的代碼與您的代碼不匹配的幾率很小。 注冊步驟是必需的,以便可以找到您的文件。 通常將類型庫作為資源嵌入到DLL本身中,例如.NET元數據,但是.NET構建模型並不容易做到。 客戶端編譯器使用類型庫信息來生成適當的COM調用。 指導很重要,因為這是客戶端編譯器需要使用的,標識符名稱不起作用。 有一種使用名稱使用“后期綁定”的方法,該名稱與.NET中的Reflection完全等效,但是不涉及類型庫。

誰在生成GUID?

CLR可以。 每個.NET接口或類都有一個,無論是否為[ComVisible(true)]。 也通過Type.GUID屬性公開。 如果您沒有在類型上使用[Guid]屬性,則它將運行一種算法來生成Guid,該Guid將類型聲明用作輸入。 換句話說,如果您對類型進行了任何更改,則可以確保Guid的值將有所不同。 這是您永遠不要使用[Guid]屬性的基本原因,除非您必須創建精確的直接替換並且不能重新編譯客戶端代碼。 TLBID來自創建項目時自動生成的AssemblyInfo.cs文件。

在DLL,TLB或兩個文件中?

僅當您使用[Guid]屬性時,它才存在於DLL中,但通常如上所述,它是在運行時生成的。 它始終存在於類型庫中,這就是客戶端編譯器知道如何創建類的對象並使用其接口的方式。

會生成完全相同的GUID

是的,只有類型聲明才起作用。

如果我運行regasm傳遞現有的dll和tlb文件

Regasm只能按照其/ tlb選項的要求創建類型庫,而不能使用現有的類型庫。 否則,它將執行與Tlbexp.exe完全相同的操作,使用Reflection枚舉程序集中的類型以查找[ComVisible(true)]類型並生成匹配的類型庫聲明。 它要做的額外事情是將類型庫的注冊表項寫入HKLM / Software / Classes / Typelib。 因此客戶端IDE可以找到它。

使用dll和tlb參數設置運行regasm有什么意義?

沒有“ dll參數”的真實含義可能意味着。 如上所述,使用/ tlb生成類型庫。 是否部署類型庫取決於其用法,如果不同時提供客戶端代碼,則應始終部署它,以便客戶端程序員可以使用它。 類型庫的其他用法的主題這個帖子 如果您不確定客戶端程序員將如何使用您的代碼,請始終進行部署。

並非所有信息都已在注冊表中?

注冊表中的內容是有限的,只有足夠的信息才能找到類型庫文件。 類型庫中包含接口,函數簽名,GUID和工廠功能所需的CLSID的描述。

在重新注冊時,我們需要提供什么?

與注冊完全相同,只需添加/取消注冊。 如果以前使用過/ tlb,還必須提供它,以便可以刪除TypeLib注冊表項。 在您忙於開發和測試庫時,將其自動化非常重要,因為Guid通常是自動生成的,因此您可能在注冊表中產生大量垃圾。 當您忘記運行Regasm時,還會感到頭疼。 項目>屬性>構建選項卡,“注冊COM互操作”復選框。 但不利的一面是,您必須運行提升的VS,這樣它才能寫入注冊表。

regasm也會總是在SysWow64下生成條目嗎?

SysWow64不起作用,請始終避免部署到c:\\ windows。 但是,是的,位數確實很重要,注冊表的結構如此設計,因此64位應用程序不能在32位庫中意外創建對象並在丑陋的異常中死亡。 反之亦然。 一個32位客戶端應用程序將從HKLM / Software / WOW6432Node讀取注冊表項,只有使用32位版本的Regasm時,您才能獲得注冊表項。 值得注意的是,考慮到C#代碼可以在任何平台上運行,通常可以同時運行兩種Regasm。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM