如何识别DLL是否是Debug或Release版本(在.NET中)

时间:2009-04-28 17:13:13

标签: .net dll build debugging release

  

可能重复:
  How to tell if a .NET application was compiled in DEBUG or RELEASE mode?

我确定之前已经问过这个问题,但google和SO搜索失败了。

如何识别DLL是发布版本还是调试版本?

2 个答案:

答案 0 :(得分:93)

执行此操作的唯一最佳方法是检查已编译的程序集本身。 Rotem Bloom发现了一个名为“.NET Assembly Information”的非常有用的工具here。安装它之后,它会将自己与.dll文件关联,以便自行打开。安装完成后,您只需双击程序集即可打开,它将为您提供下面屏幕截图中显示的程序集详细信息。在那里你可以确定它是否是调试 编译与否。

希望这会有所帮助..

答案 1 :(得分:84)

恕我直言,上述申请确实具有误导性;它只查找IsJITTrackingEnabled,它完全独立于是否编译代码以进行优化和JIT优化。

如果在Release模式下编译并选择DebugOutput为“none”以外的任何值,则存在DebuggableAttribute。

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

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

恕我直言,当有人询问程序集是否为“Debug”或“Release”时,它们的确意味着代码是否已经优化...

Sooo,您想手动还是以编程方式执行此操作?

手动: 您需要查看程序集元数据的DebuggableAttribute位掩码的值。这是如何做到的:

  1. 在ILDASM中打开程序集
  2. 打开清单
  3. 查看DebuggableAttribute位掩码。如果DebuggableAttribute不存在,它肯定是优化程序集。
  4. 如果它存在,请查看第4个字节 - 如果它是'0'则是JIT优化 - 其他任何东西,它不是:
  5.   

    //元数据版本:v4.0.30319 .... // .custom instance void   [mscorlib程序] System.Diagnostics.DebuggableAttribute ::。构造函数(值类型   [mscorlib] System.Diagnostics.DebuggableAttribute / DebuggingModes)=(   01 00 02 00 00 00 00 00)

    以编程方式:假设您希望以编程方式了解代码是否为JITOptimized,这是正确的实现:

    object[] attribs = ReflectedAssembly.GetCustomAttributes(typeof(DebuggableAttribute), 
                                                            false);
    
    // If the 'DebuggableAttribute' is not found then it is definitely an OPTIMIZED build
    if (attribs.Length > 0)
    {
        // Just because the 'DebuggableAttribute' is found doesn't necessarily mean
        // it's a DEBUG build; we have to check the JIT Optimization flag
        // i.e. it could have the "generate PDB" checked but have JIT Optimization enabled
        DebuggableAttribute debuggableAttribute = attribs[0] as DebuggableAttribute;
        if (debuggableAttribute != null)
        {
            HasDebuggableAttribute = true;
            IsJITOptimized = !debuggableAttribute.IsJITOptimizerDisabled;
            BuildType = debuggableAttribute.IsJITOptimizerDisabled ? "Debug" : "Release";
    
            // check for Debug Output "full" or "pdb-only"
            DebugOutput = (debuggableAttribute.DebuggingFlags & 
                            DebuggableAttribute.DebuggingModes.Default) != 
                            DebuggableAttribute.DebuggingModes.None 
                            ? "Full" : "pdb-only";
        }
    }
    else
    {
        IsJITOptimized = true;
        BuildType = "Release";
    }
    

    我在我的博客上提供了这个实现:

    <强> How to Tell if an Assembly is Debug or Release