来自VBScript的C#DLL,没有任何关联

时间:2013-09-26 16:27:16

标签: c# dll vbscript

是否可以从VBScript访问C#DLL的方法而无需将其注册到regasm?我将创建DLL所以几乎任何异乎寻常的要求,使其对VBScript可见,我可以做...

我已阅读here,可以使用GetObject中的VBScript来实现这一目标,但我已经尝试过但没有成功......我还需要其他什么除了使DLL“COM可见”以外,还能做到这一点吗?

我需要避免regasm的原因是它需要管理员权限,我需要“静默地”将此DLL部署到许多可能拥有或可能没有管理员权限的客户端。

2 个答案:

答案 0 :(得分:2)

不需要注册,这是脚本解释器找到包含您在脚本的CreateObject()调用中使用的ProgId的DLL的唯一方法。带有清单的隔离COM不起作用,您无法修改脚本解释器的清单。

有一个技术解决方案,您可以在HKCU注册表配置单元中编写注册表项,而无需获取UAC提升。 Regasm.exe工具始终将它们写入HKLM配置单元。它也会注册程序集,但仅适用于运行Regasm.exe的用户。然而,这很痛苦且容易出错,您必须编写自己的注册方法并应用[ComRegisterFunction] attribute。现在您的工作是使用RegistryKey类来设置密钥。对于[ComUnregisterFunction],它应该再次删除密钥。在interwebs上有一个很多的坏例子,最好的方法是使用SysInternals的ProcMon来观察在正常使用Regasm.exe时写入的注册表项,然后重现在您自己的代码中,改为使用HKCU。

请注意该奖章的另一面,您实际上正在对允许任意代码运行的机器进行配置更改。试图隐藏它不会给用户任何好处,如果你尊重用户保持机器安全和可预测的愿望,就不应该考虑。 UAC不会阻止您进行更改,只是在那里通知用户。

答案 1 :(得分:0)

接受的答案是错误的,使用DLL需要注册。您可以使用GetObject()方法而不是CreateObject()方法,如我对此问题的回答所示。

Using DLLs in VBScript