我想知道在发布模式下运行时我是否打算在Debug输出中看到任何内容?
看到调试的东西让我觉得我实际上并没有运行发布编译,有没有办法可以确定我肯定在运行发布模式?
答案 0 :(得分:2)
这些似乎是Trace
messages,而不是Debug
messages,所以它们甚至出现在发布版本中。
通过调查术语"调试"的各种语境含义,让我们看看发生了什么。这里。
首先,使用" Debug"下拉列表的上下文。和"发布" Visual Studio中的选项。这些选项是构建配置。要了解此选项的重要性,请双击"属性"您的项目的节点,并切换到" Build"页。
此页面(以及其他一些页面)可以具有特定于某个构建配置的设置。您可以通过页面上的下拉菜单查看每个配置的设置(默认为您当前正在使用的任何构建配置)。
名称" Debug"没有什么特别之处。和"发布" - 这些只是默认配置,具有这些方案的默认设置。您可以更改配置的设置。您也可以定义自己的构建配置,但这样做不在本答案的范围内。最后,这些设置也由simliar目标平台参数化(例如," AnyCPU"," x86"等),但对于这个答案,我假设所有构建都是使用相同的平台设置。
C#具有条件编译功能 - 能够根据编译时定义或未定义的符号编译不同的代码段。例如,这个常数的值为" A"如果MY_SYMBOL_NAME
被定义,或者" B"否则。
public const string MyConst =
#if MY_SYMBOL_NAME
"A";
#else
"B";
#endif
项目的前三个设置" Build"页面控制这些符号。特别是"定义DEBUG常数"和"定义TRACE常数" - 这实际上是指编译符号。通过选中这些,所选的构建设置将分别使用DEBUG
和TRACE
符号进行编译。
默认情况下," Debug"和"发布"配置定义TRACE
,但仅适用于#34; Debug"定义DEBUG
。
Debug
班级条件编译专门扩展到System.Diagnostics.Debug
和System.Diagnostics.Trace
类的成员:对这些类的调用'只有在定义了适当的符号时才会编译方法。所以这个:
Debug.WriteLine("!");
是这样对待的:
#if DEBUG
Debug.WriteLine("!");
#endif
这些方法写入所谓的"跟踪侦听器",can be configured either in code or in application configuration files。
因此,如果您看到的文字是通过拨打Trace
来写的,那么即使在发布配置中,您仍会看到它。当然,这意味着此日志记录将保留在已发布的版本中,除非您明确禁用"定义TRACE常量"设置。
那么为什么Visual Studio会显示这些内容呢?因为" Debug"的一个更多含义是:您是否使用Visual Studio的调试器启动应用程序。启动的两个选项都列在VS'调试菜单栏:"开始调试"和"开始时不调试"。某些内容与您正在使用的构建配置正交:您可以在没有附加调试器的情况下运行Debug构建,并且可以运行附加调试器的Release构建(尽管这可能没有用,因为某些部分可能不会出现断点)例)。
使用调试器时,“输出”窗口显示写入默认跟踪侦听器的消息。这标有" Debug"但它包括在那里写的任何内容 - 包括调用Trace
,在发布版本中包含(默认情况下)。