如何判断一个.NET应用程序是在DEBUG模式还是RELEASE模式下编译的?

49

我在电脑上安装了一个应用程序。我该如何找出它是否是以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

在Stackoverflow上有很多类似的问题,其中一个问题是如何在.NET中编程检测发布/调试模式,而且有许多不同的答案: https://dev59.com/LHRB5IYBdhLWcg3wV196 https://dev59.com/c3RA5IYBdhLWcg3w2x6W https://dev59.com/snVC5IYBdhLWcg3wvT_g https://dev59.com/fkXRa4cB1Zd3GeqPoxjd http://stackoverflow.com/questions/890459/asp-net-release-build-vs-debug-build - Kiquenet
5个回答

30

我很久以前 写过博客,不知道它是否仍然有效,但代码大概是这样的...

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;
}

就像我说的那样,这是几年前我进行调查工作的时候...谁知道框架发生了什么变化,或者我最初做得有多糟糕。 ;) - ZombieSheep
了不起的代码!我创建了一个控制台应用程序,集成到我的构建机器中,以验证最终要交付的应用程序不会处于调试模式。 - Samuel
3
请看下面我的回答,解释为什么这种检查 DEBUG 构建的方法并不是最佳解决方案。 - Dave Black
FYI - 我刚刚使用了Visual Studio 2013构建了同一个dll的调试和发布版本,并在上面运行了上述方法(使用LINQPad),两次脚本都认为所涉及的DLL是发布版本。 - raddevus

26

ZombieSheep的回答是不正确的。

关于如何判断.NET应用程序是在DEBUG模式还是RELEASE模式下编译的,我在这个重复问题的答案在这里:How to tell if a .NET application was compiled in DEBUG or RELEASE mode?

请小心 - 只查看程序集清单中“程序集属性”中是否存在“Debuggable”属性并不意味着您拥有一个未进行JIT优化的程序集。该程序集可能已经进行了JIT优化,但在高级构建设置下将程序集输出设置为包含'full'或'pdb-only'信息 - 在这种情况下,“Debuggable”属性将出现。

请参考下面的链接获取更多信息: 如何判断程序集是Debug还是Release如何判断DLL是Debug还是Release版本(在.NET中)

Jeff Key的应用程序不能正确工作,因为它基于DebuggableAttribute是否存在来标识“Debug”版本。如果您以发布模式编译并将DebugOutput选择为除“none”之外的任何内容,则DebuggableAttribute将存在。

您还需要明确定义“Debug”与“Release”的确切含义...

  • 您是指应用程序已配置代码优化吗?
  • 您是指可以将Visual Studio/JIT调试器附加到它吗?
  • 您是指它生成DebugOutput吗?
  • 您是指它定义了DEBUG常量吗?请记住,您可以使用System.Diagnostics.Conditional()属性有条件地编译方法。

感谢您对“调试版本”不同方面和类型进行详细解释。下次我遇到一些可疑的实现时,我一定会向大家推荐您的博客。 - ulty4life

8

实际上,您已经走在了正确的道路上。如果您在反编译器窗口中查看,您将会看到以下代码行(如果它是以调试模式构建的):

[assembly: Debuggable(...)]

8
不正确;我刚在 Release 模式下检查了一个汇编程序,它仍然有这个属性: [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] - Robert Taylor
3
我在发布模式下编译,并在反编译器中看到了这个: [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] - chikak
5
当我以调试模式拆卸一个程序集时,我看到了这个:[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.EnableEditAndContinue | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.Default)]当我以发布模式构建它时,debuggable属性只有IgnoreSymbolStoreSequencePoints标记,这正如你们所提到的那样。 - Alric
你的答案不正确 - 如果你在发布模式下编译并选择DebugOutput为除“none”以外的任何值,那么DebuggableAttribute就会存在。 - Dave Black

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指出的那样,可能需要不同的方法来解决一些情况。
所以也许您还可以看一下Dave Black的答案:


1
这个答案是不正确的。请看我详细的解释,为什么它是不正确的:https://dev59.com/c3RA5IYBdhLWcg3w2x6W#5316565 - Dave Black

2
使用Jeff Key的IsDebug工具怎么样?它有点过时,但由于您有Reflector,您可以将其反编译并重新编译为任何版本的框架。我已经这样做了。

2
+1,但是没有必要反编译该实用程序 - 作者提供了源代码:http://www.sliver.com/Downloads/IsDebugSource.zip - Luke Girvin
1
答案中的链接已过期 - “此网站正在出售!” - Pang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接