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.(这里包括的时间太长了)
我的经验是它不起作用,或者更确切地说,您需要调用激活上下文 API 才能实际使用 DLL 中的清单:请参阅此问题:将清单文件移动到 dll?
我对此的看法,虽然可能不完全准确,是这样的:
基于注册表的 COM 对于每个用户都是“全局”的
Regfree 清单 COM 对于每个进程都是“全局”的,应该在可执行文件上进行管理。
只有可执行清单始终“在范围内”,如果您的 DLL 具有 COM 并排清单,则必须使用激活上下文 API 显式加载此清单,而问题在于它只能工作当您确切地知道何时需要它并控制 DLL 中需要它的位置的调用路径时。
因为,据我了解,当您拥有“a.exe.manifest(声明 c.dll 的免注册 COM 注册)”时,您真正要做的是修改该进程的初始/全局激活上下文。这(似乎)仅适用于可执行清单。加载 DLL 后,DLL 的任何清单都不会自动使用,因此当您需要就位(即在CoCreateInstance.
我曾经遇到过这样的情况,我认为我知道何时CoCreateInstance被调用并且需要切换,但后来发现 DLL 生成了一些线程,它们自己执行了一些 CoCreateInstance 操作。(我无法控制的激活上下文。)
总而言之,我会说: