C#如何检测使用的构建模式

时间:2015-11-04 15:20:35

标签: c# visual-studio-2013

我使用VS2013内置的应用程序(用C#编写),我怎么知道它是在Debug还是Release模式下构建的?是否足以检查文件.pdb是否存在? 它不是C# if/then directives for debug vs release的副本..假设我没有源代码,只有编译过的文件,查看它们是否可以确定构建模式?我可以只查找.pdb个文件吗?

3 个答案:

答案 0 :(得分:5)

  

我怎么知道它是在Debug或Release模式下构建的?是否足以检查文件.pdb是否存在?

在调试模式下构建通常需要三件事:

  • 禁用优化
  • 发布PDB
  • 定义了DEBUG预处理程序符号

我说"通常"因为没有要求任何这些事情都是一致的;例如,可以在没有优化的情况下发出PDB。

你没有说出你感兴趣的这三件事中的哪一件,或者为什么。我将描述如何检测第一个:是否已禁用优化构建的程序集?

最简单的方法是在程序集上运行ILDASM并检查任何方法的IL。在禁用优化的情况下构建的方法将始终包含nop条指令。这些都是"没有操作"无效的指示;它们的存在只是为了通过提供开发人员可以放置断点的更多位置来使代码更容易调试。

例如," hello world"禁用优化的方法是:

nop
ldstr      "Hello world"
call       void [mscorlib]System.Console::WriteLine(string)
nop
ret

但是启用优化后,nop就会消失。

如果您对检测调试与发布模式的其他方法感兴趣,请参阅此重复问题中的链接:

Programmatically detecting Release/Debug mode (.NET)

答案 1 :(得分:0)

有几种方法:

  1. 在debug vs release中构建时文件大小更大。
  2. 如果您遵循正确的deploybuild,那么发布版本应该已经更新了程序集信息。
  3. 使用DebugView.exe,如果应用程序在DebugView中显示调试输出,则其内置在调试模式下。

答案 2 :(得分:0)

我在测试程序的发布和调试版本上都使用了Dependency Walker。

在Dependency Walker中,我进行了类型保存:两个程序都包含导入/导出列表的文本。

然后我对输出进行了文件比较:

enter image description here

唯一显着的区别是Release版本的页面文件内存使用为零。