19

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

4

7 回答 7

22

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

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

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

当您在没有设置 DEBUG 标志的情况下进行编译时,任何对 WriteDebug 的调用都将被删除,因为假设发生在 Debug.Write() 中。

于 2008-08-26T19:45:54.900 回答
5

检查Debug.Write方法。它标有

[Conditional("DEBUG")]

属性。

ConditionalAttribute的 MSDN 帮助指出:

向编译器指示应忽略方法调用或属性,除非定义了指定的条件编译符号

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

于 2008-08-26T21:37:42.183 回答
2

我也阅读了这篇文章,它让我相信,当未定义 DEBUG 时,在 System.Debug 函数上声明的 ConditionalAttribute 会导致编译器完全忽略此代码。我认为 TRACE 也是如此。也就是说,System.Diagnostics.Debug 函数必须具有用于 DEBUG 和 TRACE 的 ConditionalAttributes。我的假设是错误的。单独的 Trace 类具有相同的功能,它们定义了依赖于 TRACE 常量的 ConditionalAttribute。

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

来自 System.Diagnostics.Trace:_ Public Shared Sub WriteLine (_ message As String _)

看来我最初的假设是正确的,System.Diagnostics.Debug(或 system.Diagnostics.Trace)语句实际上不包含在编译中,就好像它们包含在#IF DEBUG(或#IF TRACE)区域中一样。

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

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

于 2008-08-26T19:50:28.523 回答
1

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

public void Debug(string s)
{
#if DEBUG
    System.Diagnostics.Debug(...);
#endif
}
于 2008-08-26T19:25:58.333 回答
1

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

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

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

如果您不想要任何输出,则需要像 Juan 所说的那样使用 DEBUG 常量包装对 Debug.Write 的调用:

#if DEBUG
    System.Diagnostics.Debug.Write(...);
#endif
于 2008-08-26T19:36:24.393 回答
1

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

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

选择正确的配置(Active/Release/Debug/All),如果需要信息,请确保选中“DEBUG Constant”,如果不需要,请取消选中。

应用更改并重建

于 2010-03-16T15:27:43.927 回答
-6

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

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

于 2008-08-26T19:23:42.957 回答