3

我有一个名为 的类型库MyCOMAddin.tlb,我使用它tlbexp.exeMyCOMAdd.dll. 这是一个用 C# 编写的 .NET COM 公开类。此 dll 在每个用户级别注册。

问题是

  • 有什么方法我也可以MyCOMAddin.tlb只注册当前用户吗?

我试过regtlibv12.exe了,但它为所有用户注册。这很不方便,因为如果任何用户在机器上卸载插件,在后期绑定中仍然可以访问 dll 的其他用户将无法再访问类型库。

我正在使用 Inno setup 来部署加载项,因此我可以直接在注册表中写入密钥。但我不知道哪些键以及在哪里写它们。

我希望regtlibv12.exe有一个/peruser选择。

4

1 回答 1

3

这并非不可能,但您当然会遇到一些并发症。首先,仅在本地注册类型库是不够的,您还需要在本地注册 CLSID,否则仍然无法正常工作。Regasm.exe 完成的工作。与其运行regtlib,不如使用它的/tlb 命令行选项(没有文件)。请注意,任何使用类型库的编程工具都可能需要一些额外的注册表项才能将库识别为组件,例如,“Control”键很常见。

专业安装人员在安装时不依赖 Regasm 或 Regtlib 等工具编写密钥,他们自己编写密钥。当然,这需要知道这些键是什么。一种方法是观察使用 SysInternals 的 ProcMon 实用程序编写密钥的安装工具。尽管它往往会产生大量信息。您会在WiX 项目中找到一个专用工具,Heat.exe 是“收获”工具。修改您发现的所有内容,从使用 HKCR 或 HKLM 改为使用 HKCU。HKCR 映射到 HKCU\Software\Classes。可能为 64 位操作系统添加了 Wow6432Node。

并确保您确实需要注册类型库。仅当您在另一个编程环境中使用该组件时才需要。以及使用在 STA 线程上创建的对象并从另一个线程调用它的极端情况,标准编组器使用类型库来编组跨单元的调用。并且不要忘记带有清单的无注册 COM,因此根本不需要修改注册表。目前尚不清楚这是否适用于此。

于 2012-08-05T16:05:45.827 回答