Windows VistaでC#のプログラムからあるDLLをコールすると「保護されているメモリに書き込みできません。(Access Violation)」が発生しました。
色々と調べていて、WindowsXPのSP2以降についたデータ実行防止(DEP)によって、エラーが表示されることがわかりました。
それも、.NET Framework2.0のSP1以降でビルドした実行ファイルの場合にこの現象が発生します。次に選択するものを除くすべてのプログラム...で実行ファイルを追加しようと思っても「DEPを有効にして実行する必要があります。DEPを無効にすることができません」警告メッセージが表示されます。
試しに、SPなしでビルドすると、追加することができて、正常にDLLをコールすることができます。
どうもこれは、.NET Framework2.0のSP1以降からDEPの設定を有効にするようになったことが影響しています。
調べてもC++ではリンカの設定がありますが、C#の場合には、DEPを無効に設定する機能がありません。
そこで、どのようにするかというと、コマンドプロンプトで、以下のように入力すれば、DEPを無効にした実行ファイルを作成することができます。
Visual Studioのインストールフォルダ\Common\\tools\vsvars32.bat
editbin.exe /NXCOMPAT:NO "指定したい実行ファイル名"
それにしても突然発生したので、原因が2日くらい悩みました。
この変更にはかなりビックリしました。
色々と調べていて、WindowsXPのSP2以降についたデータ実行防止(DEP)によって、エラーが表示されることがわかりました。
それも、.NET Framework2.0のSP1以降でビルドした実行ファイルの場合にこの現象が発生します。次に選択するものを除くすべてのプログラム...で実行ファイルを追加しようと思っても「DEPを有効にして実行する必要があります。DEPを無効にすることができません」警告メッセージが表示されます。
試しに、SPなしでビルドすると、追加することができて、正常にDLLをコールすることができます。
どうもこれは、.NET Framework2.0のSP1以降からDEPの設定を有効にするようになったことが影響しています。
調べてもC++ではリンカの設定がありますが、C#の場合には、DEPを無効に設定する機能がありません。
そこで、どのようにするかというと、コマンドプロンプトで、以下のように入力すれば、DEPを無効にした実行ファイルを作成することができます。
Visual Studioのインストールフォルダ\Common\\tools\vsvars32.bat
editbin.exe /NXCOMPAT:NO "指定したい実行ファイル名"
それにしても突然発生したので、原因が2日くらい悩みました。
この変更にはかなりビックリしました。