45

我的电脑上安装了一个应用程序。如何确定它是否在 DEBUG 模式下编译?

我尝试使用.NET Reflector,但它没有显示任何具体内容。这是我看到的:

// Assembly APPLICATION_NAME, Version 8.0.0.15072
Location: C:\APPLICATION_FOLDER\APPLICATION_NAME.exe
Name: APPLICATION_NAME, Version=8.0.0.15072, Culture=neutral, PublicKeyToken=null
Type: Windows Application
4

5 回答 5

29

我很久以前写过这个,我不知道它是否仍然有效,但代码类似于......

private void testfile(string file)
{
    if(isAssemblyDebugBuild(file))
    {
        MessageBox.Show(String.Format("{0} seems to be a debug build",file));
    }
    else
    {
        MessageBox.Show(String.Format("{0} seems to be a release build",file));
    }
}    

private bool isAssemblyDebugBuild(string filename)
{
    return isAssemblyDebugBuild(System.Reflection.Assembly.LoadFile(filename));    
}    

private bool isAssemblyDebugBuild(System.Reflection.Assembly assemb)
{
    bool retVal = false;
    foreach(object att in assemb.GetCustomAttributes(false))
    {
        if(att.GetType() == System.Type.GetType("System.Diagnostics.DebuggableAttribute"))
        {
            retVal = ((System.Diagnostics.DebuggableAttribute)att).IsJITTrackingEnabled;
        }
    }
    return retVal;
}
于 2008-10-11T20:53:32.773 回答
26

ZombieSheep 的回答不正确。

我对这个重复问题的回答在这里:如何判断 .NET 应用程序是在 DEBUG 还是 RELEASE 模式下编译的?

要非常小心 - 仅查看程序集清单中的“程序集属性”是否存在“可调试”属性并不意味着您有一个未经过 JIT 优化的程序集。程序集可以进行 JIT 优化,但将高级构建设置下的程序集输出设置为包含“完整”或“仅 pdb”信息 - 在这种情况下,将存在“可调试”属性。

请参阅下面的帖子以获取更多信息: 如何判断程序集是调试版还是发布版以及 如何识别 DLL 是调试版还是发布版(在 .NET 中)

Jeff Key 的应用程序无法正常工作,因为它根据 DebuggableAttribute 是否存在来识别“调试”构建。如果您在发布模式下编译并将 DebugOutput 选择为“none”以外的任何内容,则会出现 DebuggableAttribute。

您还需要明确定义“调试”与“发布”的含义......

  • 你的意思是应用程序配置了代码优化?
  • 您的意思是可以将 Visual Studio/JIT 调试器附加到它吗?
  • 你的意思是它会生成DebugOutput吗?
  • 你的意思是它定义了 DEBUG 常量吗?请记住,您可以使用该System.Diagnostics.Conditional()属性有条件地编译方法。
于 2011-03-15T18:42:29.853 回答
8

你实际上是在正确的道路上。如果您在反射器中查看反汇编器窗口,如果它是在调试模式下构建的,您将看到以下行:

[assembly: Debuggable(...)]
于 2008-10-11T20:59:21.483 回答
2

使用 Jeff Key 的IsDebug实用程序怎么样?它有点过时了,但是由于你有 Reflector,你可以反编译它并在任何版本的框架中重新编译它。我做到了。

于 2009-03-12T11:34:11.407 回答
2

这是ZombieSheep提出的解决方案的VB.Net版本

Public Shared Function IsDebug(Assem As [Assembly]) As Boolean
    For Each attrib In Assem.GetCustomAttributes(False)
        If TypeOf attrib Is System.Diagnostics.DebuggableAttribute Then
            Return DirectCast(attrib, System.Diagnostics.DebuggableAttribute).IsJITTrackingEnabled
        End If
    Next

    Return False
End Function

Public Shared Function IsThisAssemblyDebug() As Boolean
    Return IsDebug([Assembly].GetCallingAssembly)
End Function

更新
此解决方案对我有用,但正如 Dave Black 指出的那样,可能存在需要不同方法的情况。
所以也许你也可以看看戴夫布莱克的答案:

于 2013-01-04T15:34:15.277 回答