【问题标题】:How to deal with Interops between 32-bit and 64-bit environments?如何处理 32 位和 64 位环境之间的互操作?
【发布时间】:2012-12-17 05:15:34
【问题描述】:

简短的 2 个问题,我在阅读了几个主题/页面后找不到明确的答案。

    1234563将其注册为 64 位就足够了(使用 regasm) - 或者我们可能不注册互操作 - 只有 COM?
  1. 如果我有互操作 dll - 我能否获得为其创建此互操作的原始 COM(这对于创建另一个互操作很有用,例如用于 64 位环境)?

编辑:在@David 回复后,我又检查了一个选项,出乎意料地它起作用了,但现在我不确定这对这个讨论和解决方案意味着什么。有人可以帮忙解决这个问题吗?

我做了什么: 我按照here 的说明进行操作,现在来自 COM 的对象可以与我的 64 位应用程序一起使用!对所有对象(数百个在互操作中)手动执行此操作可能会很棘手 - 这是处理我的互操作的正确方法吗?

问候, 乔特贝克

【问题讨论】:

  • regasm 用于在 .NET 中创建要从 COM 应用程序使用的库时使用,而不是在您有要在 .NET 中使用的 COM 库时使用。
  • @David:谢谢,我不知道。
  • 虽然使用DllSurrogate 确实解决了位数问题,但它的预期用途似乎是隔离 - 防止 COM DLL 中的任何问题影响主程序。

标签: .net com interop registry 32bit-64bit


【解决方案1】:

COM 服务器 (DLL) 是本机代码,因此它们不能跨越位数边界,即 32 位到 64 位。您的 .NET 代码需要编译为 x86(好吧,至少启动代码是这样)才能有一个 32 位进程来加载 COM DLL(除非 COM DLL 本身是 64 位的,在这种情况下您的启动代码需要编译为 x64)。

互操作 DLL 只是一个 .NET 程序集,其中包含调用 COM 对象方法的胶水。知道互操作 DLL 用于哪个 COM DLL 将不允许您生成具有不同位数的工作互操作 DLL。

【讨论】:

  • @jotb​​ek - 互操作 DLL 应该是 AnyCPU。需要匹配的是 COM DLL 的位数以及您的启动代码所在的任何程序集。AnyCPU 程序集将以进程启动的任何位数运行(这就是为什么它是“AnyCPU”:)。比如说,您当然可以构建一个 32 位特定的互操作 DLL,但这只是额外的工作。
  • 没有任何简单的方法可以将 32 位 DLL 加载到 64 位进程中。您必须使用代理过程。此外,RCW 是包含在互操作 DLL 中的对象。
  • 我猜 COM DLL 没有“正确注册”,因为它注册在注册表的 32 位区域,而不是 64 位区域。这正确的,因为它是一个 32 位 DLL。
  • msdn.microsoft.com/en-us/library/windows/desktop/…DllSurrogate 只是让 Windows 为您创建代理进程的一种方式。
  • 没有办法对任何组的 COM 对象执行此操作。此注册表项的作用是导致系统将每个此类 COM DLL 放入其自己的进程中,这相当耗费资源 - 开发人员有责任决定哪些 DLL 需要此功能并将其与整体系统响应能力相平衡.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2011-09-10
  • 2016-06-01
  • 1970-01-01
  • 2012-09-03
  • 1970-01-01
相关资源
最近更新 更多