应用程序是 64 位时以 32 位模式运行代码,这可能吗?

Posted

技术标签:

【中文标题】应用程序是 64 位时以 32 位模式运行代码,这可能吗?【英文标题】:Running code in 32bit mode while the app is 64bit, is it possible? 【发布时间】:2013-10-13 02:15:12 【问题描述】:

抱歉标题混乱,

我正在使用 c# 并尝试使用 ArcMap,它是一堆 dll,允许我使用地理文件并用 c++ 编写然后包装在托管 c++ 中,我在工作场所拥有的 Arcmap 版本是 32 位,因此与其 Dll 交互的唯一方法是开发 32 位应用程序。

我有一个 64 位应用程序,它使用我编写的位于另一个 dll 中的类(我可以将其设为 32 位或以任何必要的方式进行配置),该类加载 ArcMap dll 并尝试使用它们来读取一些文件(形状文件)..

问题是我无法从 64 位应用程序加载 32 位类...而且我无法将使用 Arcmap 对象的类从 32 位更改为 64 位,因为这样就无法加载 arcmap dll。

我目前唯一的解决方案是将类转换为控制台项目,以 32 位运行并等待它完成,控制台项目会将他红色的数据写入 txt 文件,然后我将从中读取我原来的 64 位应用程序。

这是我遇到的最丑陋的解决方法,我希望有人可以帮助我找到更好的解决方案。

提前致谢,

附言 如果我的问题中的某些部分不清楚,请评论是什么,我会尽力解释我的意思。

【问题讨论】:

可能重复:***.com/questions/6744284/… 是否可以将 64 位应用程序转换为 32 位?除此之外,您还可以使用进程间通信,但不会比使用文本文件传递数据好多少。 【参考方案1】:

您有以下限制:

您不能在同一进程中执行 32 位和 64 位代码。 第三方代码以二进制形式提供,作为 32 位模块。

由此您可以得出结论,第三方代码必须在 32 位进程中运行。这意味着您有以下选择:

    如果可能,请将您的进程转换为 32 位。这无疑是最简单的解决方案。 将您的进程保留为 64 位,并将第三方代码作为单独的进程运行。

您在问题中描述的 ugly 解决方案是实现选项 2 的一种方法。但是没有那么丑陋的方法可以做到这一点。您可以使用远程过程调用机制 (RPC),而不是使用外部文件进行通信。

有很多选择,但最明显的一个是 COM。将 32 位代码放入进程外 COM 服务器并从 64 位应用程序中使用它。这将让您编写干净的代码,使用方法调用与第三方库进行通信。底层 RPC 机制完成了在两个进程之间获取信息所涉及的所有低级繁重工作。

【讨论】:

“将 32 位代码放入进程外 COM 服务器” - 你能详细说明这是什么意思吗,我不明白你说“com 服务器”是什么意思 我认为这里不是教你 COM 的地方。当然不在评论中。如果你不明白什么是 COM 服务器,那么我想你需要做一些背景阅读。如果您真的不了解 COM 和 RPC,那么这可能需要一些步骤。因此,将您的应用转换为 32 位的解决方案更具吸引力。 我有时间也愿意去了解一下,你说的“COM服务器”是不是和“COM对象”一样?我知道 COM 对象允许 c++/c# 和其他语言之间的互操作性,但我认为它在同一个进程中运行,因此它将以相同的“位数”(64 或 32)运行,就像加载 COM 对象的进程一样。我会很感激一两个链接到相关的东西来阅读。谢谢! COM 服务器是实现 COM 对象的代码。 COM 客户端是使用对象的代码。 COM 服务器可以在进程内,与客户端在同一进程中,也可以在进程外,在单独的进程中。最著名的进程外 COM 服务器是 Office 套件程序。当您将它们自动化时,您正在使用在不同进程中实现的 COM 对象。这就是您可以从 64 位进程自动化 32 位 Excel 的方式,反之亦然。关于 COM 的最佳书籍是 Don Box 的 Essential COM。【参考方案2】:

您也可以创建一个 32 位应用程序并启用 COM/DCOM 或其他类型的 .NET 远程处理来与您的 64 位主应用程序进行讨论。所以你不需要读/写文件。 您也可以使用其他形式的 IPC(命名管道、DCE/RPC)——但这可能不是那么简单。

请看这里的一些提示:

Is there a viable counterpart to DCOM in .NET?

DCOM server and client both written in .NET

How can a 32 bit process communicate with a 64 bit process in .NET?

【讨论】:

【参考方案3】:

您可以通过以下语法将 64 位应用程序转换为 32 位应用程序: CorFlags.exe xxx.exe /32BIT+

【讨论】:

确实如此。但是鉴于提问者拥有 64 位应用程序的源代码,更改目标并重新编译不是更容易吗?我的意思是,在某些时候程序似乎可能会被重新编译。

以上是关于应用程序是 64 位时以 32 位模式运行代码,这可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

(n*2-1)%p:n和p为32位时避免使用64位

仅 64 位应用程序中的 SQL 溢出异常

是否可以在支持Intel IA-32e模式的操作系统中运行16位代码?

版本 32 位还是 64 位?如何检查[重复]

错误:使用 gcc 32 位时,“asm”操作数具有不可能的约束

在 Visual Studio 2015 中为调试模式运行 iisexpress 32 位而不是 64 位