茶馆

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
最近使用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 <your binary>

如果使用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选项中选中下面这个选项。

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

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

posted on 2008-01-20 23:28  laue  阅读(2310)  评论(0编辑  收藏  举报