.net - 免注册COM可以应用于DLL吗?

标签 .net windows winapi com side-by-side

目前我有类似这样的免注册 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/

相关文章:

c# - WindowsImpersonationContext 下的程序集绑定(bind)。如何防止 FileLoadException?

.net - 用自定义异步计时器类替换 Threading.Timer?

windows - Zend : . htaccess 现在不能在 Windows 上运行如何继续我的项目?

vba - 在 VBA 中逐像素扫描图像

.net - 如何安装支持 .NET Core 6.0 的 .NET SDK?

c# - 如何在 C# 中将类型 'system.windows.media.imagesource' 转换为 'system.drawing.image' 或 byte[]?

windows - 如何编译这个程序?链接器阶段错误

c - 如何向从 SYSTEM 帐户登录的用户显示消息框?

c - 键盘加速器不捕获 CTRL + A

c++ - 静态库调用错误: Exception: "A null reference pointer was passed to the stub." (using winsock2 Win32)