注册免费COM可以应用于DLL吗?

Bil*_*eal 6 .net windows com winapi side-by-side

目前,我有类似的东西用于免注册COM设置:

  • a.exe(取决于b.dll;不直接依赖c.dll)
  • a.exe.manifest(宣布免注册COM注册c.dll)
  • b.dll(取决于c.dll.例如,.NET TMBIMP生成的COM包装器)
  • c.dll (一些COM实现DLL)
  • c.dll.manifest(免注册COM清单c.dll)

是否可以更改此方案,以便将打开的清单a.exe放在上面b.dll?我希望其他程序能够参考b.dll,如果可能的话,无需在任何地方添加其他清单.

(a.exe.manifest有这个内容:

  <file name="msdia110.dll">
    <comClass description="Debug Information Accessor" clsid="{761D3BCD-1304-41D5-94E8-EAC54E4AC172}" threadingModel = "Both"/>
  </file>
Run Code Online (Sandbox Code Playgroud)

)

c.dll.manifest使用清单工具生成mt.exe.(这里包括的时间太长了)

Mar*_* Ba 0

我的经验是它不起作用,或者更确切地说,您需要调用激活上下文 API 才能实际使用 DLL 中的清单:请参阅此问题:将清单文件移动到 dll?

我对此的看法,虽然可能不完全准确,是这样的:

  • 基于注册表的 COM 对于每个用户都是“全局”的

  • Regfree 清单 COM 对于每个进程都是“全局”的,应该在可执行文件上进行管理

只有可执行清单始终“在范围内”,如果您的 DLL 具有 COM 并排清单,则必须使用激活上下文 API 显式加载此清单,而问题在于它只能工作当您确切地知道何时需要它并控制 DLL 中需要它的位置的调用路径时。

因为,据我了解,当您拥有“a.exe.manifest(声明 c.dll 的免注册 COM 注册)”时,您真正要做的是修改该进程的初始/全局激活上下文。这(似乎)仅适用于可执行清单。加载 DLL 后,DLL 的任何清单都不会自动使用,因此当您需要就位(即在CoCreateInstance.

我曾经遇到过这样的情况,我认为我知道何时CoCreateInstance被调用并且需要切换,但后来发现 DLL 生成了一些线程,它们自己执行了一些 CoCreateInstance 操作。(我无法控制的激活上下文。)

总而言之,我会说:

  • 如果可以的话,请将 SxS COM 清单包含在可执行文件中
  • 如果您完全了解并且可以控制何时切换上下文(“手动”),则可以使用激活上下文 API,但这似乎比仅将清单嵌入可执行文件要麻烦得多。