这里已经描述了在没有管理员权限的情况下调用 regasm 的解决方法:

COM 互操作,无需 regasm

我正在尝试创建一个 COM 库,我的用户可以从 Excel VBA 部署和使用该库,而无需管理员权限。我喜欢 regasm 解决方法,因为似乎人们在使用 Excel VBA 中的免注册 COM 对象方面并没有取得太大成功。我还希望尽早绑定,以便我的用户可以从语法完成中受益。

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

有帮助吗?

解决方案

在没有COM Interop的管理权限的情况下调用Regasm

我认为应该使用 RegistrationServices.RegisterAssembly RegOverridePredefKey apis一起实现HKCU Hive下的自动注册,以UAC友好的方式。我发布了一个更详细的答案在这里

其他提示

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

用户需要有足够的权限才能将 DLL 复制到他有写权限的目录中。这通常只是 c:\users\username 中的一个目录,如 appdata 子目录。您必须解决的头痛问题是,由于每个用户的用户名不同,.reg 文件需要针对每个用户进行调整。所以 CodeBase 需要为每个用户更改 .reg 文件中的值。温和地说,这种扩展性很差。

您找到的答案并不是一个很好的答案。唯一的解决方案是 真的 作品就是自己写注册函数。将注册表项写入 HKCU 而不是 HKLM 的一种。使用 [ComRegisterFunction] 属性. 。您可以从 .reg 文件中知道需要写入哪些密钥。您可以使用 Assembly.GetExecutingAssembly().Location 来确定要为 CodeBase 注册表值写入哪些内容。不要忘记 [ComUnregisterFunction]。

请记住,至少在精神上,您正试图绕过 LAN 管理员对这些用户施加的限制。他们确实非常关心了解在他们支持的机器上运行什么类型的代码。这很可能会给你带来麻烦,至少要和那个人谈谈。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top