有没有办法判断C#程序集是否已使用优化参数编译?

有没有办法判断C#程序集是否已使用优化参数编译?,c#,optimization,assemblies,C#,Optimization,Assemblies,相反,是否有一种方法可以判断它是在启用或禁用优化参数的情况下编译的。我不想知道它是发布版还是调试版,因为这两种版本都可以通过优化或不通过优化来启用。从我的角度来看,尽管代码上说它是发布版本,但它真的优化了吗?谢谢。这篇文章可能会对你有所帮助 具体地说,在ildasm中,您可以查找DebuggableAttribute以及是否缺少NOP。检查的一种方法是查看程序集上的DebuggableAttribute()。如果C#编译器通过了/optimize选项,则不会设置DisableOptimizati

相反,是否有一种方法可以判断它是在启用或禁用优化参数的情况下编译的。我不想知道它是发布版还是调试版,因为这两种版本都可以通过优化或不通过优化来启用。从我的角度来看,尽管代码上说它是发布版本,但它真的优化了吗?谢谢。

这篇文章可能会对你有所帮助


具体地说,在ildasm中,您可以查找DebuggableAttribute以及是否缺少NOP。

检查的一种方法是查看程序集上的
DebuggableAttribute
()。如果C#编译器通过了/optimize选项,则不会设置
DisableOptimizations
标志

注意:尽管这适用于大多数场景,但这并不是一个100%的傻瓜式解决方案。它至少可以通过以下方式被打破

  • 使用另一种具有不同优化语义的语言编译
  • 如果用户手工定义了
    DebuggableAttribute
    ,它将优先于C#编译器定义的属性

  • 使用Ildasm.exe查看程序集清单:

      // --- The following custom attribute is added automatically, do not uncomment -------
      //  .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(
              valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) 
              = ( 01 00 02 00 00 00 00 00 ) 
    
    这是发行版。调试生成值为(01 00 07 01 00 00)


    还有一个问题是调试器可以禁用JIT优化器。这是VS中的一个可配置选项,工具+选项,调试,常规,“在模块加载时抑制JIT优化”。如果您正在调试发布版本并希望获得类似的性能,则需要关闭该选项。这使得调试更具挑战性,当优化器重新排列和内联代码时,单步执行的行为很奇怪,而且您通常无法检查局部变量的值,因为它们存储在CPU寄存器中。

    我迟到了8年,但如果您和我一样,想要C#方式,那么这里就是:

    using System.ComponentModel;
    using System.Diagnostics;
    using System.Reflection;
    
    internal static class AssemblyExtensions
    {
        public static bool IsOptimized(this Assembly asm)
        {
            var att = asm.GetCustomAttribute<DebuggableAttribute>();
            return att == null || att.IsJITOptimizerDisabled == false;
        }
    }
    

    该信息特定于VB.Net编译器。它的语义与C#.1非常相似,但略有不同。这可能不是问题,因为问题是关于C#Assembly的,但是,不是2。是否仍然有效(如果用户重写该属性,是否会消除运行时优化,因此程序集可能会被视为未优化?@Zaki是和否。JIT优化将被禁用,但其他C#编译器优化将不会被启用。@Hans,对否定感到困惑。修正了,亲爱的,谢谢大家。在Scott Hanselman的博客上发现了这一点,给出了实现这一点的代码。谢谢请注意,您可以使用ILSpy(或类似工具)查看程序集的属性。当我设置为enabled(已启用)、C#“优化代码”和debug中的rebuild(重新生成)时,仍然可以看到您引用的调试值。//--以下自定义属性是自动添加的,不要取消注释-------/.custom实例void[mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype[mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes)=(01 00 07 01 00 00)我刚刚用VS2012重新检查过。不,仍然像我描述的那样工作。不要忘记在更改选项后重建。谢谢。当代码没有优化时,我得到了上面描述的内容,这与您的描述相匹配,但是当我对代码进行了优化时,默认情况下在发布模式下设置,清单中根本没有提到debug属性。是的,这与我上面的陈述相矛盾,抱歉。我将继续查看我的程序集,看看是否可以看到具有您提到的构建值的DebuggableAttribute—当代码设置为优化时。这是VS2010。谢谢。在对这种方法进行后续操作时,(01 00 02 00 00 00 00 00)”的DebuggableAttribute值似乎是一个优化的程序集,但仅具有pdb输出。如果在输出设置为full的情况下对程序集进行了优化,则DebuggableAttribute将显示为“(01 00 03 00 00)”。最后,如果对其进行了优化,并将输出设置为“无”,则这里将根本没有DebuggableAttribute。
    static void Main(string[] args)
    {
        Console.WriteLine("Is optmized: " + typeof(Program).Assembly.IsOptimized());
    }