2

抱歉标题混乱,

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

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

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

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

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

提前致谢,

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

4

3 回答 3

4

您有以下限制:

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

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

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

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

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

于 2013-10-06T13:06:44.663 回答
1

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

请参阅此处的一些提示:

.NET 中是否有可行的 DCOM 对应物?

DCOM 服务器和客户端都用 .NET 编写

.NET 中 32 位进程如何与 64 位进程通信?

于 2013-10-06T13:02:24.707 回答
0

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

于 2013-10-06T13:24:13.077 回答