如何判断.NET应用程序是以DEBUG还是RELEASE模式编译?

我的电脑上安装了一个应用程序。 我如何知道它是否以DEBUG模式编译?

我试图使用.NETreflection器 ,但它没有显示任何具体的东西。 以下是我所看到的:

// 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 

我很久以前就博客了,不知道它是否仍然有效,但是代码是…

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

要非常小心 – 只要查看Assembly Manifest中“assembly properties”的“Debuggable”属性,并不意味着你有一个未被JIT优化的程序集。 该程序集可以进行JIT优化,但是将高级构build设置下的程序集输出设置为包含'full'或'pdb-only'信息 – 在这种情况下,将会出现'Debuggable'属性。

请参阅下面我的post以获取更多信息: 如何判断程序集是debugging还是发布以及如何确定DLL是debugging还是发布版本(.NET)

Jeff Key的应用程序无法正常工作,因为它基于DebuggableAttribute是否存在来标识“Debug”版本。 如果您在发布模式下编译DebuggableAttribute,并selectDebugOutput除“none”以外的其他任何内容。

您还需要定义exaclty “debugging”与“发布”的含义。

  • 你的意思是应用程序configuration了代码优化?
  • 你的意思是你可以附加Visual Studio / JITdebugging器吗?
  • 你的意思是它产生DebugOutput?
  • 你的意思是它定义了DEBUG常量? 请记住,您可以使用System.Diagnostics.Conditional()属性有条件地编译方法。

实际上你走在正确的道路上 如果您在reflection器的反汇编程序窗口中查看,则会在debugging模式下生成以下行:

 [assembly: Debuggable(...)] 

如何使用Jeff Key的IsDebug工具? 这是有点过时了,但既然你有reflection器,你可以反编译并在任何版本的框架重新编译它。 我做了。

这是ZombieSheep提出的解决scheme的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