2013-09-26 15 views
1

是否有可能從VBScript訪問C#DLL的方法,而無需使用regasm註冊它?我將創建的DLL那麼幾乎任何異國情調的規定,使其爲VBScript可見,我可以做...來自VBScript的C#DLL,無reginam

我已閱讀here,這可能是可以使用GetObjectVBScript實現這一點,但我有嘗試過,沒有成功......除了讓DLL「COM可見」使其發揮作用外,還有什麼需要做的嗎?

我需要避免regasm的原因是它需要管理員權限,我需要將此DLL「靜靜地」部署到許多可能具有管理權限的客戶端。

回答

2

不,註冊是必需的,腳本解釋程序可以找到包含您在腳本的CreateObject()調用中使用的ProgId的DLL的唯一方法。帶有清單的獨立COM不起作用,您無法修改腳本解釋器的清單。

有一個技術解決方案,你可以在在HKCU註冊表配置單元中寫入註冊表項,而不需要獲取UAC標高。 Regasm.exe工具始終將它們寫入HKLM配置單元中。這也註冊了程序集,但僅限運行Regasm.exe的用戶。然而,這是非常痛苦和容易出錯,你必須編寫自己的註冊方法並應用[ComRegisterFunction] attribute。現在您的工作是使用RegistryKey類來設置密鑰。 [ComUnregisterFunction]相同,它應該再次刪除鍵。有一個很多在互聯網上的壞例子,最好的方法是使用SysInternals的ProcMon來觀察通常使用Regasm.exe時寫入的註冊表項,然後在您自己的代碼中再現該註冊表項,改用HKCU。

請注意該獎章的另一面,您實際上正在對允許任意代碼運行的計算機進行配置更改。試圖隱藏這一點並不會對用戶產生任何好處,如果您遵守用戶保持機器安全和可預測的願望,就不應該考慮這一點。 UAC不會阻止您進行更改,它只是在那裏通知用戶。

+0

而不是使用將procmon,我會建議使用regasm.exe的'/ regfile'選項,它會產生什麼會做的,而不是真正做一個.reg。然後在使用HKCU的ComRegisterFunction中編寫相應的C#。 (很容易錯過ProcMon吐出的東西)。 – vcsjones

+0

不,不要那樣做。它不會正確記錄添加HKLM \ Software \ Classes \ TypeLib的註冊表項條目。 Regasm是一個排雷場。 –

+0

註冊不是必需的。看到我的答案。 – Nilpo

0

接受的答案不正確,需要註冊才能使用DLL。您可以使用GetObject()方法代替CreateObject()方法,如我對此問題的回答所示。

Using DLLs in VBScript