c# - 为什么要注册 COM 接口(interface)?

标签 c# .net vba interface com

我已经使用 COM 多年了,但我一直在学习新的(和奇怪的)东西。

最近我意识到,COM 接口(interface) 不必在注册表 中注册,实现它们的组件也能正常工作。

在分析了 COM DLL(在 .Net/C# 中实现)的工作站的注册表 之后,我得出了这个结论注册到由 RegAsm 创建的 .reg 文件,因为用户不是管理员。并且 RegAsm 只为 COM 类 而不是 接口(interface) 生成注册表项。

如果这是真的,我的猜测是接口(interface)对于早期绑定(bind) 很重要,并且只能出现在TLB 文件 中。相反,注册实现(类)是必不可少的,因为它们由需要引用的文件系统上的物理代码支持。

1)我是不是疯了,漏掉了什么,或者接口(interface)可以省略?

2)如果它们可以省略,如果有的话会有什么后果?

最佳答案

如果不注册接口(interface),很多事情是做不到的。 COM 的许多功能——编码、代理、异步调用——都有标准的实现,使您不必自己滚动这些东西。例如,CoMarshalInterface是获取任何 COM 对象接口(interface)并将该接口(interface)编码为流以便它可以在另一个线程、进程或机器中解码的标准方法。接口(interface)信息在这方面至关重要——如果没有接口(interface)元数据,像这样的标准 COM 实现将无法工作,因为基础设施根本不了解您的接口(interface),无法以通用方式完成它需要做的事情适用于所有 COM 对象。

此外,虽然大多数自动化客户端(如 VBA、C# 和 C++)可以直接引用类型库文件以进行早期绑定(bind),但仍然存在限制。例如,假设您正在使用一个类型库,其中包含一些实现来自不同类型库的接口(interface)的类,或者第一个类型库中的接口(interface)可能接受另一个类型库中的接口(interface)/枚举/等定义的参数或返回值类型库。为了使自动化客户端能够使用这些包含交叉引用的接口(interface),交叉引用的类型库必须能够以某种方式被发现。注册是完成此操作的方式。

值得注意的是:根据我的经验,当 COM 对象在机器范围内注册(在 HKLM 中注册)时,几乎所有的工作都与在每个用户(在 HKCU 中)注册时完全相同。这通常使 COM 注册在无法执行机器范围注册的情况下更容易接受(例如,用户不是管理员)。然而,有一些重要的陷阱,最值得注意的是 https://techcommunity.microsoft.com/t5/Windows-Blog-Archive/Per-User-COM-Registrations-and-Elevated-Processes-with-UAC-on/ba-p/228531

关于c# - 为什么要注册 COM 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32462493/

相关文章:

c# - Java 的 AbstractMap 在 C# 中的等价物是什么?

.net - 在运行时将 ADO.Net DataSet 指向不同的数据库?

vba - 跟随链接并将表格下载到新工作表中的宏

vba - 数据透视表报告 - 获取切片器、图表和过滤器信息

arrays - ReDim 数组但保留值

c# - 如果查询 = 到 0,则显示消息框

c# - 如何消除错误 "XamlParseException: Set connectionId threw an exception"?

c# - NLog 减慢并破坏了我的 ASP.net MVC 应用程序

c# - 如何从非控制台ASP.Net应用程序捕获stdout

c# - 使用 dbClient 插入大量值