目前我有类似这样的免注册 COM 设置:
a.exe
(依赖b.dll
;不直接依赖c.dll
)a.exe.manifest
(声明c.dll
的免注册 COM 注册)b.dll
(依赖于c.dll
。例如,.NET TMBIMP 生成的 COM 包装器)c.dll
(一些COM实现DLL)c.dll.manifest
(c.dll
的免注册 COM list )
是否可以更改此方案,将 a.exe
上的 list 改为放在 b.dll
上?我希望其他程序能够引用 b.dll
,而不必尽可能在任何地方添加额外的 list 。
(a.exe.manifest
有这个内容:
<file name="msdia110.dll">
<comClass description="Debug Information Accessor" clsid="{761D3BCD-1304-41D5-94E8-EAC54E4AC172}" threadingModel = "Both"/>
</file>
)
和c.dll.manifest
是使用 list 工具mt.exe
生成的。 (这里太长了)
最佳答案
我的经验是它不起作用,或者您需要调用 Activation Context API 才能实际使用 DLL 中的 list :请参阅以下问题:Move manifest file to dll?
我对此的看法,尽管可能不完全准确,是这样的:
基于注册表的 COM 对每个用户都是“全局的”
Regfree list COM 是每个进程的“全局”,应该在可执行文件上进行管理。
只有可执行 list 始终在“范围内”,如果您的 DLL 具有 COM 并排 list ,则您必须使用 Activation Context API 显式加载它,而问题在于它只有当您确切地知道什么时候需要它并控制到 DLL 中需要它的地方的调用路径时才能工作。
因为,据我了解,当您拥有“a.exe.manifest(声明 c.dll 的免注册 COM 注册)” 时,您真正要做的是修改初始/该进程的全局激活上下文。这(似乎)仅适用于可执行 list 。加载 DLL 后,不会自动使用 DLL 的任何 list ,因此当您需要适当的无注册 COM list 时,即在 CoCreateInstance
之前,您必须手动执行此操作。
I had a case我以为我知道 CoCreateInstance
何时被调用并且我需要切换,后来才发现 DLL 生成了一些线程,它们自己执行了一些 CoCreateInstance。 (我无法控制的激活上下文。)
总结一下,我会说:
- 如果可以的话,请在您的可执行文件中包含 SxS COM list
- 如果您完全了解并可以控制何时切换上下文(“手动”),则可以使用 Activation Context API,但与仅将 list 嵌入可执行文件相比,这似乎要麻烦得多。
关于.net - 免注册COM可以应用于DLL吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22799232/