如何判断.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