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

时间:2013-10-06 12:51:17

标签: c# 32bit-64bit arcmap

很抱歉这个令人困惑的标题,

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

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

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

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

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

提前致谢,

P.S 如果我的问题中的某些部分不清楚,请评论什么,我会尝试解释我的意思。

3 个答案:

答案 0 :(得分:4)

您有以下限制:

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

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

  1. 如果可能,将您的流程转换为32位。这是最简单的解决方案。
  2. 将您的进程保留为64位,并将第三方代码作为单独的进程运行。
  3. 您在问题中描述的丑陋的解决方案是实现选项2的一种方法。但是,这样做的方法不那么难看。您可以使用远程过程调用机制(RPC),而不是使用外部文件进行通信。

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

答案 1 :(得分:1)

您也可以创建一个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?

答案 2 :(得分:0)

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