質問

32 ビットから 64 ビットに移行しようとしているアプリケーションがあります。これは、x64 フラグを使用してコンパイルされた .NET です。ただし、FORTRAN 90 で書かれ、32 ビット用にコンパイルされた DLL が多数あります。FORTRAN DLL の関数は非常に単純です。データを入力し、データを引き出します。いかなる状態もありません。また、そこに多くの時間を費やしているわけではなく、合計でおそらく 3% ですが、実行される計算ロジックは非常に貴重です。

何らかの方法で 64 ビット コードから 32 ビット DLL を呼び出すことはできますか?MSDN では、それはできないと言っています。簡単なハッキングを行ってこれを確認しました。すべてが無効なエントリ ポイント例外をスローします。これまでに私が見つけた唯一の解決策は、すべての 32 ビット DLL 関数の COM+ ラッパーを作成し、64 ビット プロセスから COM を呼び出すことです。これはかなり頭の痛い問題のようです。WoW エミュレーションでプロセスを実行することもできますが、その場合メモリの上限は増加せず、約 1.6GB が上限となります。

64ビットCLRプロセスから32ビットDLLを呼び出す他の方法はありますか?

役に立ちましたか?

解決

32 ビット DLL を別の 32 ビット プロセスにロードし、64 ビット プロセスがプロセス間通信を介して通信するようにする必要があります。そうでなければ、32 ビット DLL を 64 ビット プロセスにロードする方法はないと思います。

ここにかなり良い記事があります:

64 ビット コードから 32 ビット DLL にアクセスする

他のヒント

Vista 用の WoW32 でロードされるように、実行可能プロセスを 32 ビット プロセス (Any CPU や x64 ではなく) として記述する必要があります。これにより、それらは 32 ビット エミュレーション モードでロードされ、エントリ ポイントの問題は発生しなくなります。ライブラリを AnyCPU モードのままにすることはできますが、実行可能ファイルは x86 としてコンパイルする必要があります。

既存の DLL を再コンパイルしたくない場合、ジョンの答えは正しいです。ただし、それはあなたにとっても選択肢になるかもしれません。

私たちのチームは現在、メモリの上限を増やすために x86 FORTRAN コードを x64 に移行しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top