如何仅为当前用户注册类型库?

时间:2012-08-04 23:16:34

标签: .net deployment com registration typelib

我有一个名为MyCOMAddin.tlb的类型库,我使用tlbexp.exe中的MyCOMAdd.dll提取了该类型库。这是一个用C#编写的.NET COM公开类。这个dll是按用户级别注册的。

问题是

  • 有没有办法我只能注册MyCOMAddin.tlb当前用户?

我尝试了regtlibv12.exe,但它注册了所有用户。 这很不方便,因为如果任何用户在机器上卸载了外接程序,那么在后期绑定中仍然可以访问dll的其他用户将不再能够访问类型库。

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

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

1 个答案:

答案 0 :(得分:1)

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

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

确保您实际上需要注册的类型库。只有在其他编程环境中使用该组件时才需要它。在使用在STA线程上创建的对象并从另一个线程调用它的角落情况下,标准编组使用类型库来编组跨公寓的调用。并且不要忘记带有清单的免注册COM,因此根本不需要注册表修改。目前尚不清楚这是否适用于此。