程序出现异常"尝试读取或写入受保护的内存这通常指示其他内存已损坏"

在VS 2008中使用非托管DLL以及DEP
最近使用VS2008编译原来一个可以正常运行的程序时,出现下列错误,错误出现在使用未托管DLL处
程序出现异常
找了很多地方,最后在MSDN论坛得到提示。
解决方案在这篇帖子
http://blogs.msdn.com/ed_maurer/archive/2007/12/14/nxcompat-and-the-c-compiler.aspx
简单的说出现这个错误的原因是vs2008的c#编译器生成的PE文件头增加了NXCOMPAT位,这个与DEP有关,DEP用于防止恶意软件注入进程。那么也就是说位托管的DLL在内存中属于为标记成为可执行的,因而出现了上述的错误。所以解决方案就是消除PE中的这个位。

启动Visual Studio 2008 Command Prompt,输入:
editbin.exe /NXCOMPAT:NO

如果使用VS2008,则可以在工程属性中添加一个Post-build命令:
原文是这样的命令:
call $(DevEnvDir)..\tools\vsvars32.bat
editbin.exe /NXCOMPAT:NO $(TargetPath)

但是在我这里直接引用仿佛不行,我修改成为下面这样
call "(VS安装文件夹)\Common7\Tools\vsvars32.bat"
editbin.exe /NXCOMPAT:NO $(TargetPath)

第一行为设置VS环境,这个设置主要是为了后一行的editbin.exe 命令而服务的。

同时在这样添加以后,还需要在工程属性页的Debug选项中选中下面这个选项。

要不在调试的时候仍然会出现错误。

我为了解决这个问题找了好几天,放在首页希望大家能够有个记忆,在遇到这个问题时候能够想起来。

你可能感兴趣的:(PC)