5

参考Build菜单下的“Configuration Manager”,

有没有办法评论我的 C# 代码,以便在解决方案处于调试模式时不会编译被注释掉的代码,但如果我将其更改为发布模式会编译?

我为什么要这个?我想要在发布模式下编译代码而不是在调试模式下编译的原因是我有一些代码在我的开发 PC 上不起作用(从我的主机发送电子邮件的代码等)。

而不是在发布之前运行我的代码和取消注释行,我希望它是自动的。

4

4 回答 4

10

您可能正在寻找这样的东西:

#if DEBUG
     Console.WriteLine("Debug Mode");
#else
     Console.WriteLine("Release Mode");
#endif

如果你只关心发布模式,你可以使用:

#if !DEBUG
     Console.WriteLine("Release Mode");
#endif
于 2009-07-11T13:01:03.147 回答
10

为此,您可以在方法(但不是单独的代码行)上使用Conditional属性。

例如,以下内容只会编译到 DEBUG 版本中。

[Conditional("DEBUG")]
public void MyMethod()
{
    // Do Stuff
}

DEBUG 符号已在项目设置中指定。您必须为发布版本创建自己的符号,例如“RELEASE”,以便您可以执行以下操作:

[Conditional("RELEASE")]
public void MyMethod()
{
    // Do Stuff
}

但是,我建议退后一步,从更高的层次重新审视您的问题,因为我不会真正推荐这种解决方案。

于 2009-07-11T13:03:54.927 回答
4

我会尝试使用面向对象的技术来解决您的问题。使用依赖注入,我将构建一个执行必要的调试操作的类。

就像是:

public class MyClass {

    public MyClass(IDoOtherStuff stuffToDo) {
        DoOtherStuff = stuffToDo;
    }

    private IDoOtherStuff DoOtherStuff { get; set; }

    public void Do() {
        DoOtherStuff.BeforeDo();

        // Blah blah blah..

        DoOtherStuff.AfterDo();
    }
}

public interface IDoOtherStuff {
    void BeforeDo();
    void AfterDo();
}

public class DebugOtherStuff : IDoOtherStuff {
    public void BeforeDo() {
        Debug.WriteLine("At the beginning of Do");
    }

    public void AfterDo() {
        Debug.WriteLine("At the end of Do");
    }
}

public class ReleaseOtherStuff : IDoOtherStuff {
    public void BeforeDo() { }
    public void AfterDo() { }
}

现在,您可以使用WindsorUnityNinjectSpring.NET等控制反转容器来配置您的开发环境与发布环境。

于 2009-07-11T13:24:21.747 回答
-3

我可能错了,但我认为编译器会忽略注释。如果我使用.NET Reflector查看我的程序集,我看不到任何我知道存在的评论。

BlueMonkMN 的方法将根据编译模式运行不同的代码。

如果您想根据您使用的编译模式(和其他变量)运行不同的代码,请查看PostSharp。它是一个后编译编译器,可以为您的程序集添加和删除代码。

使用示例: - 我喜欢为我的项目提供详细的调试和跟踪信息。- 我讨厌在每个方法结果或方法调用之后都有一个printor语句,因为这个额外的调试代码会掩盖执行工作的函数。trace.write

您可以配置 PostSharp 以动态创建这些额外的调试信息!进行一些配置调整,您可以打印对每个函数的每次调用以及每次调用的结果(具有可变内容)。这使得遵循程序逻辑流程变得非常容易。

于 2009-07-11T13:24:16.677 回答