【发布时间】:2021-09-17 13:54:34
【问题描述】:
我正在将最初用 VB6 编写的 Excel 加载项迁移到托管代码和 64 位 Excel。该加载项通过 COM 代理与一些旧的 32 位 COM DLL 服务器进行互操作,并且遇到了一个问题,即只有 coclass 各自默认接口中的方法和属性在运行时可用。尝试调用组件公开的任何其他接口中的方法和属性会导致 System.MissingMethodExceptions。
当迁移的插件与 32 位 Excel 一起使用并且服务器在进程中运行时,非默认接口可用。
有什么办法可以使非默认接口在 64 位模式下可用于加载项?
【问题讨论】:
-
一般来说,不仅仅是配置。发现 COM 规则(代理/存根、编组、线程模型、套间)只有在您退出进程时才被开发人员理解(或简单地忽略)是一种常见情况。必须修改 DLL,或者您必须在其上编写一个 COM 正确的 32 位包装器(另一个 dll),以便您可以从 64 位使用该包装器。
-
有资源吗?我所能找到的只是对自定义代理的模糊暗示。
-
您只需要一个代理:您当前使用的那个。我正在谈论的包装器将是一个 32 位 DLL,与您的 32 位 DLL 同步。它的目的只是向 COM 世界的其他部分公开相同(或几乎)的 COM 接口,但与进程外客户端/代理兼容。这只是要编写的自定义代码。您不会再直接在 COM 中使用 32 位 DLL。
-
你能给我举个例子吗?
-
否,因为它完全取决于您的 32 位 DLL 及其表现出的确切问题。这里没有什么神奇之处,这不一定是一件容易的事。如果您有一个小型的现有复制项目,我们可以尝试做一些事情。
标签: com 64-bit com-interop vb6-migration midl