2008-08-26 72 views
18

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

回答

21

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

使用条件属性的例子如下(在C#中,但在VB.NET太工作):

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

当你编译没有调试标志设置,以WriteDebug任何通话将被删除正如在Debug.Write()中所假设的那样。

+0

真棒...爱学习新的小技巧! – BigBlondeViking 2009-07-09 14:01:33

-6

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

使用发行版肯定不会删除System.Diagnostics.Debug.Write语句。

+0

它们不一样;并且由于将ConditionalAttribute应用于该方法,默认情况下释放模式实际上将删除对Debug.Write的调用。 – 2008-10-11 21:21:56

1

我要做的就是封装调用调试在我自己的类,并添加一个预编译器指令

public void Debug(string s) 
{ 
#if DEBUG 
    System.Diagnostics.Debug(...); 
#endif 
} 
1

使用DEBUG编译符号会,就像你说的,其实忽略从组件的代码。

我相信System.Diagnostics.Debug.Write将始终输出到附加的调试器,即使您已经构建在发布模式下。根据MSDN article

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

如果你不希望任何输出做,你需要换你的电话与像胡安的DEBUG常量Debug.Write说:

#if DEBUG 
    System.Diagnostics.Debug.Write(...); 
#endif 
1

我也读过这篇文章,它让我相信,当DEBUG没有被定义时,在System.Debug函数中声明的ConditionalAttribute会导致编译器完全忽略这段代码。对于TRACE,我认为同样的事情是正确的。也就是说,System.Diagnostics.Debug函数必须具有DEBUG和TRACE的ConditionalAttributes。我在这个假设上错了。单独的Trace类具有相同的功能,并且这些定义了依赖于TRACE常量的ConditionalAttribute。

从System.Diagnostics.Debug: _ 公共共享子写入(_ 消息作为字符串_ )

从System.Diagnostics程序。跟踪: _ 公共共享子的WriteLine(_ 消息作为字符串_ )

看来那时,我原来的设想是正确的,那System.Diagnostics.Debug(或system.Diagnostics.Trace)声明实际上是不包含在编译中,就好像它们包含在#IF调试(或#IF TRACE)区域中一样。

但我也从你们这里了解到,并验证过,RELEASE构建本身并没有考虑到这一点。至少在Silverlight项目中,这些项目仍然有点片面,您需要进入“高级编译选项...”并确保DEBUG未定义。

我们从.NET 1.1/VS2003跳到.NET 3.5/VS2008,所以我认为其中一些用于不同的工作,但也许它在2.0/VS2005中有所变化。

5

检查Debug.Write方法。它标有

[Conditional("DEBUG")] 

属性。

的MSDN帮助ConditionalAttribute状态:

表示该方法调用 或属性应该被忽略 除非指定条件 编译符号定义编译器。

构建配置是否具有释放或调试标签无关紧要,重要的是DEBUG符号是否在其中定义。

1

要选择是否要调试信息进行编译或被删除,

进入项目的属性窗口中的“生成”选项卡。

选择合适的配置(主动/发行/调试/全部),并确保您 选中“DEBUG常数”如果你想要的信息, 或取消它,如果你不这样做。

应用更改并重建

相关问题