TL;DR regsvr32
生成的所有注册表条目是否都需要在SxS无注册表COM清单中存在,反之亦然?
我正在尝试为第三方组件实现无需注册的COM。
阅读 相关 主题, 我发现有几个元素被提到,可以放入清单中:
从文档中得知, 我们可以向清单中添加以下标签来描述COM组件:
assemblyIdentity
- 这实际上只是描述了“抽象的程序集”(assemblly)。comClass
- 描述COM类(IID接口)。似乎总是需要。typelib
- 什么时候使用?comInterfaceExternalProxyStub
- 什么时候使用?comInterfaceProxyStub
- 什么时候使用?
从HKEY_LOCAL_MACHINE\SOFTWARE\Classes
的其他文档中我们可以观察到COM注册表条目有几个类别:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{CLSID}
我认为 大致对应于comClass
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\{IID}
对应于 可能是comInterface[External]ProxyStub
,但我真的不知道何时使用哪个(或两个都要用)- 哪个注册表条目与
typelib
清单条目相对应??
comClass
条目的清单,没有typelib或ProxyStub条目。 (我交叉检查了写入的键,有关的DLL pdm.dll
,MS的Process Debug Manager只写入那些键,也就是说,在注册表中似乎没有类型库或代理存根信息。)如果注册表仅包含与
comClass
相关的信息,那么这是否意味着此信息将足以在SxS清单中使用,还是需要在清单中添加其他信息?
作为旁注,我注意到注册表中包含一个
VersionIndependentProgId
和一个在末尾附加了版本号的ProgId
。清单只有一个ProgId
条目,并且文档说明如下:
progid:与COM组件相关联的依赖于版本的程序标识符。 ProgID的格式为..。但是文档还指出:
comClass元素可以有…元素作为子元素,列出依赖于版本的progids。
并且他们说 progid属性应该是与版本无关的。
那么,在这里放什么?当客户端不请求特定版本时,这是否重要?