【问题标题】:C# how to detect the build mode used [duplicate]C#如何检测使用的构建模式[重复]
【发布时间】:2016-02-05 03:54:28
【问题描述】:

我有一个在VS2013 中构建的应用程序(使用C# 编写),我怎么知道它是在调试模式还是发布模式下构建的?检查文件.pdb 是否存在就足够了吗? 不是C# if/then directives for debug vs release的重复..假设我没有源代码,只有编译文件,看它们是否可以确定构建模式?我可以只查找.pdb 文件吗?

【问题讨论】:

  • PDB 文件也可以用于发布模式编译。
  • @AntiHeadshot 我不同意,这与定义指令无关,它询问如何确定已编译的程序是在调试还是发布时编译的。
  • @RonBeyer 是的,您可以通过检查指令来获得此信息。问题可能不一样,但答案是一样的。
  • @AntiHeadshot 这些指令在编译后不再存在,它们不会放置在编译后的程序集中的任何地方,因此您无法在编译后检查它们。

标签: c# visual-studio-2013


【解决方案1】:

我怎么知道它是在 Debug 还是 Release 模式下构建的?检查文件 .pdb 是否存在就足够了吗?

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

  • 优化被禁用
  • 发出 PDB
  • 已定义 DEBUG 预处理器符号

我说“通常”是因为没有要求这些事情中的任何一个都始终如一地发生;例如,可以在没有优化的情况下发出 PDB。

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

最简单的方法是简单地在程序集上运行 ILDASM 并检查 IL 是否有任何方法。在禁用优化的情况下构建的方法将始终具有nop 指令。这些是“无操作”指令,什么都不做;它们的存在只是为了通过提供更多开发人员可以放置断点的位置来使代码更易于调试。

例如,禁用优化的“hello world”方法的 IL 是:

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

但启用优化后,nops 会消失。

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

Programmatically detecting Release/Debug mode (.NET)

【讨论】:

    【解决方案2】:

    有几种方法:

    1. 在 debug 和 release 中构建时文件大小更大。
    2. 如果您遵循正确的部署构建,则发布版本应该具有更新的程序集信息。
    3. 使用 DebugView.exe,如果应用程序在 DebugView 中显示调试输出,则它在调试模式下内置。

    【讨论】:

      【解决方案3】:

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

      在 Dependency Walker 中,我保存了一个类型:两个程序上带有导入/导出列表的文本。

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

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

      【讨论】:

        猜你喜欢
        • 2012-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        • 2023-03-31
        • 2019-10-17
        • 1970-01-01
        相关资源
        最近更新 更多