.net - 如何为当前用户注册一个类型库?

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

问题是

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

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

我正在使用 Inno setup 部署插件,因此我可以直接在注册表中写入 key 。但是我不知道哪些键以及在哪里写它们。

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

最佳答案

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

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

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

https://stackoverflow.com/questions/11812697/

相关文章:

google-apps-script - 将使用 google apps 脚本构建的图表插入到 go

oauth - 刷新 OAuth2 访问 token 的正确范例

c# - XML Serializer 不序列化具有公共(public) getter 但没有 se

c# - 向 XElement 添加空白行以保留其他格式

web-applications - 在 Servlet 中获取 Web 应用程序名称

c# - 是否可以在 MS Access 中执行批量插入

smalltalk - 遍历圆变形的直径

css - 高度 :100%; works, 但最小高度 :100%; doesn't work?

php - 你如何使用 PHP 检查文件是否在某个目录中?

install4j - 如何在自定义代码或 API 中检查 32 位或 64 位