通过COM从32位应用程序调用x64程序集

本文关键字:调用 x64 程序集 应用程序 32位 COM 通过 | 更新日期: 2023-09-27 18:15:14

简短的问题:这可能吗(当然是在x64操作系统上)?如果不是,为什么呢?

我已经为excel 32开发了一个c#插件dll。

在x86中编译时可以正常工作。

在x64中编译时,COM调用失败。

我需要64位版本的excel吗?

我认为COM对编译体系结构是不可知的,并使使用不同技术开发的具有不同体系结构的dll之间的通信成为可能,但我认为后者是错误的。

我猜x64位的dll显然不能通过COM(或其他)从32位应用程序调用。

通过COM从32位应用程序调用x64程序集

COM支持两种服务器,进程内和进程外。Office扩展是进程内组件,是加载到进程中的DLL。32位进程的硬规则是它们不能加载64位dll。反之亦然。这是由注册表本身强制执行的,32位进程不能直接访问64位COM服务器的注册信息。它们被重定向到HKLM/Software/Wow6432Node密钥。或者换句话说,它们甚至不能看到错误位的组成部分。

进程外组件没有这个限制,它们运行在自己的进程中。COM使用RPC编组两个进程之间的调用,并掩盖比特数差异。这也是让进程内64位服务器与32位主机一起工作的一种方法,您可以在代理进程中运行组件。这很难实现,而且几乎不值得这么麻烦,由于所需的封送处理和上下文切换,进程外调用比进程内调用要昂贵得多。它不仅稍微贵了一点,而且速度慢了大约10,000倍,这主要是因为进程内函数调用非常快。它只用于保持遗留的32位服务器与64位程序一起工作。如果你想尝试一下COM+ hosting,我对它了解不多。