为什么要注册COM接口?

Pra*_*eek 5 .net c# com vba interface

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

最近我意识到,COM接口不必为了实现它们的组件而在注册表中注册

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

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

1)那么我会发疯,丢失某些东西还是忽略接口吗?

2)如果可以忽略它们,后果是什么?

Mic*_*ter 6

没有注册接口,您将无法做很多事情。COM的许多功能-封送处理,代理,异步调用-具有标准的实现,可以防止您不得不自己滚动这些东西。例如,这CoMarshalInterface是一种采用任何COM对象接口并将该接口编组到流中以便可以在另一个线程,进程或计算机中进行编组的标准方法。接口信息在这一点上很关键-如果没有接口元数据,标准的COM实现将无法正常工作,因为基础架构根本不了解您的接口,无法以通用方式进行操作适用于所有COM对象。

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

值得注意的是:根据我的经验,当在整个计算机范围内注册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