在C#中隔离调试和发布代码

时间:2010-07-22 17:03:34

标签: c# debugging release

我正在编写一个应用程序,其中我有一些我不想删除的 debug 代码,但我希望在编译发布/发布时修改或删除它。例如,我想在调试版本中使用这样的东西:

MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

...在发布版本中成为这个:

MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

理想情况下,我希望做到这样的事情:

#if DEBUG_BUILD
   MessageBox.Show(ex.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
#else
   MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
#endif

每次更改构建类型时,我宁愿不必在项目属性中添加/删除条件编译符号;它应该自动发生。有没有办法在Microsoft Visual C#2008 Express Edition中执行此操作?感谢。

5 个答案:

答案 0 :(得分:15)

使用:

#if DEBUG
  // Debug work here
#else
  // Release work here
#endif

如果你这样做,只需确保在属性页面(项目属性的构建页面)中打开“定义DEBUG常量”切换,它就可以工作。对于新的C#项目,默认情况下设置为true。将为您(默认情况下)为C#编译器定义DEBUG

答案 1 :(得分:14)

您也可以使用此属性。

[Conditional("DEBUG")]

这比预处理器指令有一些优势。

如果未定义条件符号,则对标记为条件的方法的所有调用都将替换为Nops,这样您就不必修改对它的所有调用。

即使未定义符号,您的代码也会检查错误。 (与使用#if DEBUG时不同,#else忽略编译期间{{1}}中的代码)

答案 2 :(得分:1)

您可以使用一个类来编写调试语句 namespace:system.diagnostics Debug.Assert是你想要使用的

http://msdn.microsoft.com/en-us/library/system.diagnostics.debug.assert.aspx

另请参阅Debug类以进行所有调试: http://msdn.microsoft.com/en-us/library/6x31ezs1.aspx

答案 3 :(得分:0)

您可以编写一个包含条件的扩展方法,这样您就不必每次都重复它了

public static class ExceptionExtensions
{
    public static String ToMyString(this Exception ex)
    {
#if DEBUG
        return ex.ToString();
#else
        return ex.Message;
#endif
    }
}

这就是我要去做的事情

然后你的代码行将是

MessageBox.Show(ex.ToMyString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

应该定义DEBUG

答案 4 :(得分:0)

我不知道快递版是否有此功能,但Visual Studio已经在C#中内置了这个版本。

在您的工具栏中,您肯定有下拉列表,让您(默认情况下)在调试和发布版本之间进行选择,调试版本定义DEBUG符号,以便您可以使用:

#ifdef DEBUG
    // debug code
#endif