代码之家  ›  专栏  ›  技术社区  ›  Pete

.NET编译器——调试与发布

  •  19
  • Pete  · 技术社区  · 17 年前

    多年来,我一直在使用VB.NET中的DEBUG编译器常量向控制台写入消息。我也一直在使用System。诊断。调试。以类似的方式写作。我一直认为,当使用RELEASE作为构建选项时,编译器会省略所有这些语句,从而将生产代码从调试语句的开销中解放出来。最近在使用Silverlight 2 Beta 2时,我注意到Visual Studio实际上附加到了我在公共网站上运行的RELEASE构建,并显示了我认为甚至没有编译的DEBUG语句!现在,我的第一个倾向是假设我的环境有问题,但我也想问任何对系统有深入了解的人。诊断。调试和Debug构建选项,一般来说,我在这里可能会误解。

    7 回复  |  直到 17 年前
        1
  •  21
  •   Mike    17 年前

    首选方法是实际使用条件属性来包装调试调用,而不是使用编译器指令。#ifs可能会变得棘手,并可能导致奇怪的构建问题。

    使用条件属性的示例如下(在C#中,但在VB.NET中也适用):

    [ Conditional("Debug") ]
    private void WriteDebug(string debugString)
    {
      // do stuff
    }
    

    当您在没有设置DEBUG标志的情况下编译时,对WriteDebug的任何调用都将被删除,就像假设DEBUG发生的那样。Write()。

        2
  •  5
  •   Bjorn Reppen    17 年前

    检查 Debug.Write 方法。它标有

    [Conditional("DEBUG")]
    

    属性。

    MSDN帮助 ConditionalAttribute 声明:

    向编译器指示一个方法 应忽略调用或属性 除非另有规定 有条件的 编译符号已定义 .

    构建配置是否有发布或调试标签并不重要,重要的是其中是否定义了debug符号。

        3
  •  1
  •   juan    17 年前

    我也读过这篇文章,它让我相信,当DEBUG没有定义时,ConditionalAttribute在System上声明。调试函数会导致编译器完全省略此代码。我认为TRACE也是如此。也就是说,系统。诊断。调试函数必须具有Debug和TRACE的ConditionalAttribute。我的那个假设是错误的。单独的Trace类具有相同的函数,这些函数根据Trace常量定义ConditionalAttribute。

    从系统。诊断。调试: _ 公共共享子写入(_ 消息为字符串_ )

    从系统。诊断。跟踪: _ 公共共享子写线(_ 消息为字符串_ )

    看来我最初的假设是正确的,那个系统。诊断。Debug(或system.Digrations.Trace)语句实际上不包含在编译中,就像它们包含在#if Debug(或#if Trace)区域中一样。

    但我也从你们那里了解到,并验证了RELEASE构建本身并不能解决这个问题。至少对于Silverlight项目,它仍然有点不稳定,你需要进入“高级编译选项…”,并确保未定义DEBUG。

    我们跳了起来。NET 1.1/VS2003到。NET 3.5/VS2008,所以我认为其中一些过去的工作方式不同,但也许在2.0/VS2005中发生了变化。

        4
  •  1
  •   Chris Karcher    17 年前

    我所做的是将对Debug的调用封装在我自己的类中,并添加一个预编译器指令

    public void Debug(string s)
    {
    #if DEBUG
        System.Diagnostics.Debug(...);
    #endif
    }
    
        5
  •  1
  •   Pete    17 年前

    正如您所说,使用DEBUG编译器符号实际上会从程序集中省略代码。

    我相信这个系统。诊断。调试。即使您已在发布模式下构建,写入也将始终输出到附加的调试器。根据 MSDN article :

    将有关调试的信息写入listeners集合中的跟踪侦听器。

    如果你不想 任何 输出时,您需要将调用打包到Debug。像Juan说的那样用DEBUG常量写:

    #if DEBUG
        System.Diagnostics.Debug.Write(...);
    #endif
    
        6
  •  1
  •   Elad A    15 年前

    要选择是要编译还是删除调试信息,

    在项目的属性窗口中进入“构建”选项卡。

    选择正确的配置(活动/发布/调试/全部),并确保 如果你想要信息,请检查“调试常数”, 或者如果不选中,则取消选中。

    应用更改并重建

        7
  •  -6
  •   Vincent    17 年前

    根据我的经验,在VB.NET中选择调试和发布没有什么区别。您可以将自定义操作添加到这两种配置中,但默认情况下,我认为它们是相同的。

    使用Release肯定不会删除系统。诊断。调试。写陈述。