註冊沒有管理員權限的 .Net COM DLL / regasm
最近,我用 C# 編寫了一個用於 Office 應用程序的類庫,其中包括約 70 人使用的關鍵 Access 應用程序。對於具有管理員權限的使用者來說,註冊 DLL 很簡單,但是讓 DLL 在其他機器上工作是有問題的。
註冊 DLL 以使用管理員權限
在 Visual Studio 中建構 DLL。確保在項目的應用程序選項卡上選擇了這些選項:
- 輸出類型:類庫
- 裝配資訊:使裝配 COM 可見:選中
使用提升的命令提示符註冊程序集:
RegAsm YourDll.dll /tlb /codebase
YourDll.tlb在 VBA 中添加對的引用:Tools–>References驗證您是否可以創建對象的實例
怎麼了?
Regasm 在這裡做了幾件事。首先,它正在創建一個類型庫 (YourDLL.tlb),它提供有關 DLL 中的類的資訊。其次,它將有關庫的資訊儲存在系統資料庫中,以便系統“知道”您要求將類實例化為對象時的意思。
要查看 Regasm 添加了哪些系統資料庫項,您可以使用以下
/regfile參數執行它:
Regasm YourDLL.dll /codebase /regfile(該
/regfile選項與/tlb參數無效。)如果該
/codebase選項告訴 Regasm 包含有關YourDLL.dll磁碟位置的資訊,這對於創建對像很重要。如果您
YourDLL.reg在文本編輯器中打開,您將看到 Regasm 添加到系統資料庫中的條目:條目到HKEY_Classes_Root(實際上只是重定向到HKLM\Software\Classes)。不幸的是,您需要管理員權限才能修改HKLM,因此這不適用於我們的其他使用者。還有一些其他執行緒(例如,在沒有管理員權限的情況下註冊 COM ,註冊 COM DLL 以供 VBA 使用,為非管理員使用者註冊 DLL (ActiveX),無法註冊 .NET COM DLL,沒有 regasm的 COM 互操作)討論問題,但他們的解決方案很複雜(例如需要系統資料庫重定向)或不完整(假設您已經知道至少一半的答案)或在混合 64/32 位環境(例如 Win64、Office32)中不起作用。
那麼如何註冊一個在 Visual Studio 中創建的 COM DLL,以供目前使用者在 VBA 32 和 64 位環境中使用,而無需管理權限?
設置系統資料庫文件
要註冊在 32 位和 64 位環境中使用的組件,我們需要修改我們在測試案例中創建的系統資料庫文件。用你最喜歡的文本編輯器打開它。條目應如下所示:
[HKEY_CLASSES_ROOT\\ *YourAssembly.Class* ] @=" *YourAssembly.Class* " [HKEY_CLASSES_ROOT\\ *YourAssembly.Class* \\CLSID] @="{ *YourClassGUID* }"確保它包含
"CodeBase"=條目。進行全域查找/替換:
- 更改
HKEY_CLASSES_ROOT(別名為HKLM\Software\Classes)- 到
HKEY_CURRENT_USER\Software\Classes將所有系統資料庫項(及其值,列在項下方)複製到第二個文本文件。在第二個文本文件中:
刪除所有不包含的鍵(及其相關值)
\CLSID\進行全域查找/替換:
- 改變
Classes\CLSID- 到:
Classes\Wow6432Node\CLSID將第二個文本文件中的所有密鑰複製到原始 .reg 文件中,然後保存。
HKLM使用 regasm刪除註冊條目:Regasm YourDLL.dll /unregister確保事情不工作
為了確保我們的更改有效(並且您不只是因為您最初使用 regasm 進行的註冊而成功),我們需要確保 VBA現在無法創建對象。
打開您最喜歡的 VBA 應用程序,並添加對
YourDLL.tlb. 創建一個類似這樣的新過程:Public Sub TestYourDLL() Dim x as AssemblyName.ClassName Set x = New AssemblyName.ClassName Debug.Print "Apparently this worked." End Sub執行
TestYourDLL。您應該收到以下錯誤:執行時錯誤“429”: ActiveX 組件無法創建對象(如果您沒有收到錯誤,您的 DLL 仍在註冊。)
保存並退出您的 VBA 應用程序。
確保他們工作
現在,執行
YourDLL.reg您之前創建的將條目導入系統資料庫。(如果您收到“拒絕訪問”消息,您忘記從 更改HKEY_CLASSES_ROOT為HKEY_CURRENT_USER\Software\Classes)再次打開您的 VBA 應用程序,然後執行
TestYourDLL. 您現在應該看到“顯然這有效。” 在您的即時視窗中。恭喜!您已經註冊了 DLL!(如果您收到“自動化錯誤:系統找不到指定的文件”類型錯誤,您的系統資料庫文件要麼缺少Codebase條目,要麼它們沒有指向 DLL 的實際位置。)附加步驟
就我而言,我將在我的應用程序旁邊的一堆其他使用者的電腦上安裝 DLL,因此在安裝時我將更新
CodeBase值以引用我正在安裝 DLL 的位置,並且我’還將通過程式碼安裝系統資料庫項,而不是通過執行 .reg 文件。但是,既然我知道了所需的條目,那麼這樣做是微不足道的。