情况:
我在 C# 中创建了一个 DLL,它使用 COM 运行Process.Start
以通过 Web 浏览器运行程序。我使用 VS2010 的内置部署项目创建了一个 MSI。我为此 DLL 中的对象指定 Guid 属性,但我从未指定位置。当我运行 MSI 并选择为“Just Me”安装时,注册表项会HKCU
按预期在 (current_user) 中创建。我需要它为所有用户运行,所以当我运行 MSI 并选择为“Everyone”安装时,注册表项会在HKLM
(local_machine) 中创建,也符合预期。无论哪种方式,一旦 MSI 安装了 DLL,使用 DLL 的 Intranet Web 应用程序分别对我作为管理员 (current_user) 和所有用户 (local_machine) 都可以正常工作。
然而,在我公司的主要 IT 分支内部,我们无法创建自己的 MSI。我们必须向其唯一功能是为供应商/内部开发人员创建 MSI 的人发送请求和我们的 DLL/TLB 文件。当我手动运行他的 MSI 并选择为“所有人”安装时,它再次按预期工作。
问题:
但是,MSI 需要作为已部署的软件自动运行,发生这种情况时,注册表项仅在 中创建HKEY_CURRENT_USER
,因此在测试用户尝试使用该功能时找不到它们。他说该ALLUSERS
属性设置为 1,所以这应该可以工作。此外,当我要求他将它们安装到正确的位置(local_machine)时,他坚持说我需要在我的 DLL 中进行这些更改,因为“MSI 文件不会创建注册表项,它来自 DLL安装”。根据我在网上阅读的各种文章,MSI 通常指定在注册表中创建这些键的位置。
问题(也适用于 TL;DR):
他关于我需要在我的 DLL 中指定注册表位置的说法是否属实?如果是这样,我如何以编程方式指定HKLM
默认情况下要使用的这些键?现在,我所做的只是指定 ComVisible、ClassInterface、Guid、ProgId 和 ComDefaultInterface……我从未指定位置,除了 MSI 中的“Everyone/Just Me”。我对 COM 对象比较陌生,并且在注册表中弄乱了我自己的创作,所以我不想跳下他的喉咙说我不能做他应该做的事情。
谢谢!