Dot-Net

註冊沒有管理員權限的 .Net COM DLL / regasm

  • May 12, 2016

最近,我用 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_ROOTHKEY_CURRENT_USER\Software\Classes

再次打開您的 VBA 應用程序,然後執行TestYourDLL. 您現在應該看到“顯然這有效。” 在您的即時視窗中。恭喜!您已經註冊了 DLL!(如果您收到“自動化錯誤:系統找不到指定的文件”類型錯誤,您的系統資料庫文件要麼缺少Codebase條目,要麼它們沒有指向 DLL 的實際位置。)

附加步驟

就我而言,我將在我的應用程序旁邊的一堆其他使用者的電腦上安裝 DLL,因此在安裝時我將更新CodeBase值以引用我正在安裝 DLL 的位置,並且我’還將通過程式碼安裝系統資料庫項,而不是通過執行 .reg 文件。但是,既然我知道了所需的條目,那麼這樣做是微不足道的。

引用自:https://stackoverflow.com/questions/37193356