2

紛らわしいタイトルで申し訳ありませんが、

私は c# を使用しており、ArcMap を操作しようとしています。これは、地理ファイルを操作して c++ で記述し、マネージド c++ でラップできるようにする dll の束です。私の職場にある Arcmap のバージョンは 32 ビットなので、 Dll と対話する唯一の方法は、32 ビット アプリケーションを開発することです。

別のdllにある私が書いたクラスを使用する64ビットアプリケーションがあります(32ビットにするか、必要に応じて構成できます)。クラスはArcMap dllをロードし、それらを使用してファイルを読み取ろうとします(形状ファイル)..

問題は、64 ビット アプリケーションから 32 ビット クラスをロードできないことです。また、Arcmap オブジェクトを使用するクラスを 32 ビットから 64 ビットに変更できません。これは、Arcmap DLL がロードされないためです。

私が現在持っている唯一の解決策は、クラスをコンソール プロジェクトに変換し、それを 32 ビットとして実行し、それが完了するのを待つことです。コンソール プロジェクトは、彼が赤くしたデータを txt ファイルに書き込みます。応用。

これは私が今まで持っていた最も醜い回避策です。誰かがより良い解決策を見つけるのを手伝ってくれることを願っています.

前もって感謝します、

PS私の質問の一部が不明な場合は、何をコメントしてください。私が何を意味したかを説明しようとします。

4

3 に答える 3

4

次の制約があります。

  • 同じプロセスで 32 ビットと 64 ビットのコードを実行することはできません。
  • サードパーティ コードは、32 ビット モジュールとしてバイナリ形式で提供されます。

このことから、サードパーティ コードは 32 ビット プロセスで実行する必要があると結論付けることができます。これは、次のオプションがあることを意味します。

  1. 可能であれば、プロセスを 32 ビットに変換してください。これは、はるかに簡単な解決策です。
  2. プロセスを 64 ビットのままにして、サード パーティのコードを別のプロセスとして実行します。

質問で説明する醜い解決策は、オプション 2 を実装する 1 つの方法です。外部ファイルを使用して通信する代わりに、リモート プロシージャ コール メカニズム (RPC) を使用できます。

多くのオプションがありますが、最も明白なものは COM です。32 ビット コードをアウトプロセス COM サーバーに配置し、64 ビット アプリケーションから使用します。これにより、メソッド呼び出しを使用してサードパーティ ライブラリと通信するクリーンなコードを記述できます。基礎となる RPC メカニズムは、2 つのプロセス間で情報を取得することに関連するすべての低レベルの重労働を行います。

于 2013-10-06T13:06:44.663 に答える
1

32 ビット アプリケーションを作成し、COM/DCOM またはその他の種類の .NET リモート処理を有効にして、64 ビットのメイン アプリケーションと対話することもできます。したがって、ファイルを読み書きする必要はありません。他の形式の IPC (名前付きパイプ、DCE/RPC) を使用することもできますが、これはそれほど単純ではない可能性があります。

ここでいくつかのポインタを参照してください:

.NET の DCOM に相当するものはありますか?

.NET で記述された DCOM サーバーとクライアント

32 ビット プロセスは .NET で 64 ビット プロセスとどのように通信できますか?

于 2013-10-06T13:02:24.707 に答える
0

次の構文を使用して、64 ビット アプリケーションを 32 ビット アプリケーションに変換できます。 CorFlags.exe xxx.exe /32BIT+

于 2013-10-06T13:24:13.077 に答える