【问题标题】:C# DLL from VBScript, no regasm来自 VBScript 的 C# DLL,没有 regasm
【发布时间】:2013-10-02 17:46:48
【问题描述】:

是否可以从VBScript 访问C# DLL 的方法而不用regasm 注册它?我将创建 DLL 以使其对 VBScript 可见,几乎可以满足任何特殊要求,我可以做到...

我已阅读 here 可能使用 VBScript 中的 GetObject 来实现这一点,但我尝试过没有成功...除了制作DLL "COM visible" 来完成这项工作?

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

【问题讨论】:

    标签: c# dll vbscript


    【解决方案1】:

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

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

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

    【讨论】:

    • 我建议不要使用 ProcMon,而是使用 regasm.exe 的 /regfile 选项,这样它会生成一个 .reg 来说明它将做什么而不是实际执行它。然后只需在使用 HKCU 的 ComRegisterFunction 中编写相应的 C#。 (很容易错过 ProcMon 吐出的东西)。
    • 不,不要那样做。它没有正确记录添加 HKLM\Software\Classes\TypeLib 的注册表项。 Regasm 有点像雷区。
    • 不需要注册。看我的回答。
    【解决方案2】:

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

    Using DLLs in VBScript

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-08
      • 1970-01-01
      • 2010-09-27
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多