2011-08-09 20 views
0

x64プラットフォームで実行しているときにx86 DLLでメソッドを呼び出すと、 'AccessViolationException'が発生する '保護されたメモリを読み書きしようとしています' 7)。すべてがx86プラットフォームでうまくいきます。VS 2010/DotNet 4.0 x86ターゲットアプリケーションからx86 dllを呼び出す

私は同様の問題に関する多くの記事を読んだことがありますが、私のコードを動作させることができませんでした。

私は古いx86アプリケーションをWindows 7(x64)とServer 2008 R2(x64)でうまく動作させようとしています。このアプリは、VB6、VB.Net、C#、MicroFocus COBOL、C++の組み合わせです。 (当時は、他の言語を捨てることはできませんでした)。 DotNetコードはもともとDotNet 1.1のVisual Studio 2003で書かれていました。私はコードをVisual Studio 2010とDotNet 4.0に移植しました。すべてのプロジェクトの対象をx86に設定しました。私がun-managed 32ビットdllを呼び出すと、私は上記のエラーを受け取ります。

私たちのInstallShieldセットアップルーチンは、C:\ Windows \ System32の代わりにx86 DLLをC:\ Windows \ sysWOW64にインストールしています。この動作は正しいようです。 DLLは、COBOLのオブジェクトコードと実行時のコンポーネントで、CスタイルのDLLにリンクされています。私は問題がCOBOLやリンクプロセスと関係しているとは思えません。Code Projectのサンプルアプリケーションを、単純なC++ dllを呼び出すVB.Net WinFormsアプリケーションで移植しました。私はそこに同じエラーを取得します。私はまた、DLLを呼び出すC + +コマンドラインアプリを構築しようとしました。ライブラリのロードは成功します。 GetProcAddressは成功します。特定のメソッドの関数ポインタを呼び出すと失敗します。私たちのVB6アプリケーションは、Windows 7 x64で動作しているときにdllをうまく呼び出すことができます。また、UACを無効にして、マニフェストのrequestedExecutionLevelをhighestAvailableに設定してみました。私は管理者として実行しようとしました。

これはうまくいくはずですが、次に試すものはわかりません。何か案は?

答えて

0

x64で.netプログラムは64ビットプログラムとして実行され、32ビットのDLLを呼び出すことはできません。

"任意のターゲット"ではなくターゲットのx86でアプリケーションをコンパイルしてみてください。また、.Net CorFlags.exeユーティリティを使用して、ビルドされた.exeのターゲットを、32ビットモードで実行するように、 のターゲットを強制することもできます。

もちろん、プログラムは32ビット環境で実行されます。特に、最大2GBのRAMしか搭載されません。

+0

OPでは、「...すべてのプロジェクトのターゲットをx86に設定してください」と表示されます。 –

+0

私に戻ってくれてありがとう。はい、私はすでにそれを行っています - すべてのプロジェクトはx86をターゲットに設定されており、アクセス違反エラーがあります。その他の提案はありますか? – user886851

0

グッドニュース、

我々はDEPをオンにしたときも、私たちのVB6のコードが失敗することを見たように私たちは、問題の原因として、DEPを調べました。 VB.NetコードがDEPがオンのときと同じ方法で失敗していることがわかりました。明らかに、私たちのCOBOL dllはDEPが満足していないことをしています。あなたがeditbin.exeを使用してDEPをオフにする必要がありますので残念ながら過去ログアセンブリは、オペレーティングシステムのDEPの設定を尊重するように見えるしません:

editbin.exe/nxnocompat:なし

を、私はまだそれをテストする必要があります私たちの完全なアプリケーションでは、我々は解決策があるように見えます!

関連する問題