目前,对于免费注册的COM设置,我有这样的内容:
a.exe (依赖于b.dll;不直接依赖于c.dll)a.exe.manifest (声明为c.dll免费注册)b.dll (依赖c.dll )。例如,.NET TMBIMP生成COM包装器)c.dll (一些COM实现DLL)c.dll.manifest (c.dll的免注册COM清单)是否有可能更改此方案,使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>)
c.dll.manifest是使用清单工具mt.exe生成的。(而且太长了,不能包括在这里)
发布于 2014-04-29 10:01:11
我的经验是,它不起作用,或者更确切地说,您需要调用Activation API来实际使用DLL中的清单:参见这个问题:Move manifest file to dll?
我对此的看法,虽然可能不完全准确,但以下是:
只有可执行清单总是“在作用域中”,如果您是DLL,则必须使用Activation显式地加载这个清单,而问题是,只有当您确切知道需要它的时间并控制调用路径到DLL中需要它的位置时,它才能工作。
因为,正如我所理解的,当您拥有"a.exe.manifest (声明c.dll的无注册COM注册)“时,您真正要做的是修改该过程的初始/全局激活上下文。这个(似乎)只适用于可执行的清单。在DLL加载之后,DLL的任何清单都不会自动使用,所以当您需要在适当的位置(即在CoCreateInstance之前)使用reg免费COM清单时,您必须手动地使用它。
在I had a case中,我认为我知道什么时候调用了CoCreateInstance,我需要这个开关,但后来发现DLL产生了一些线程,这些线程本身执行了一些CoCreateInstance任务。(在这里,我无法控制.)
总之,我想说:
https://stackoverflow.com/questions/22799232
复制相似问题