在Excel VBA中调用没有COM互操作管理权限的regasm

时间:2014-04-14 15:03:44

标签: vba excel-vba com com-interop regasm

此处已说明了在没有管理员权限的情况下调用regasm的解决方法:

COM Interop without regasm

我正在尝试创建一个COM库,我的用户可以在没有管理员权限的情况下从Excel VBA部署和使用它。我喜欢regasm解决方法,因为似乎人们在使用Excel VBA中的免注册COM对象方面没有太大成功。我也想要早期绑定,以便我的用户可以从语法完成中受益。

然而,上述问题中接受的答案并未描述将汇编dll放在用户计算机上的位置。管理员权限是在GAC中安装程序集所必需的,所以我想知道在哪里可以放置dll文件。我假设正在搜索应用程序的目录以查找任何引用的dll,但是如果没有管理员权限,我不能将我的dll放在Excel的目录中。是否可以使用Excel客户端的变通方法?有没有其他方法从VBA调用COM对象而不需要管理员权限来首先部署它们?

2 个答案:

答案 0 :(得分:7)

  

在没有COM互操作管理权限的情况下调用regasm

我认为应该可以使用RegistrationServices.RegisterAssemblyRegOverridePredefKey API一起在HKCU配置单元下以UAC友好的方式实现自动注册。我发布了更详细的答案here

答案 1 :(得分:3)

是的,现在你有两个问题,你不能把它放在放置它的任何地方,比如GAC或c:\ program files子目录。由于这些位置也需要UAC提升。您可能还忘记使用/ codebase选项运行Regasm.exe,这需要告诉CLR在哪里查找文件。

用户需要具有足够的权限才能将DLL复制到他具有写访问权限的目录中。这通常只是c:\ users \ username中的目录,就像appdata子目录一样。您必须解决的问题是.reg文件需要针对每个用户进行调整,因为他的用户名不同。因此,需要为每个用户更改.reg文件中的CodeBase值。这很难扩展,说得温和。

你找到的答案不是很好。 真正的唯一解决方案是编写自己的注册功能。一个在HKCU而不是HKLM中编写注册表项的人。使用[ComRegisterFunction] attribute。您可以从.reg文件中了解需要编写的密钥。并使用Assembly.GetExecutingAssembly()。Location来确定要为CodeBase注册表值写什么。不要忘记[ComUnregisterFunction]。

请记住,至少在精神上,您正试图绕过局域网管理员对这些用户施加的限制。他们非常关心知道在他们支持的机器上运行什么类型的代码。这可能会让你陷入困境,至少可以和那个人说话。