【问题标题】:Is Visual Studio 2008 capable of conditional compilation for C#?Visual Studio 2008 是否能够对 C# 进行条件编译?
【发布时间】:2023-03-27 21:10:01
【问题描述】:

参考Build菜单下的“配置管理器”,

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

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

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

【问题讨论】:

  • 您在“条件编译”中寻找的术语。
  • 从您的更新来看,我认为条件编译并不是您真正想要的。这是你要求的,但不是你需要的。您需要一个为您的 DEV 环境运行的配置,另一个在 QA 中运行,另一个在生产环境中运行。我真的倾向于为此提供配置或面向对象的解决方案。
  • 啊啊啊啊,“条件编译”……想不出来这个词了。
  • @Jeff,我完全同意。对我来说,这听起来像是过早的优化。
  • 不是优化,只是有几行代码我不想在调试模式下运行,因为它们不起作用并导致异常。不想在发布前返回取消注释代码。

标签: c# visual-studio debugging build projects-and-solutions


【解决方案1】:

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

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

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

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

【讨论】:

  • 我会说同样的问题适用于我的解决方案。我不会推荐它。我建议将问题作为一个整体来看待,看看是否有其他方法可以解决更大的问题。在代码中乱扔大量#if 语句或条件属性肯定会给任何维护程序员(甚至几个月后的自己!)造成很多混乱。
  • 为什么你认为调试符号被错误地使用了?它默认添加到每个项目中,并且框架可以使用它,所以它肯定是打算使用的。我确实觉得你只会在发布模式而不是调试模式下编译一些代码有点不寻常(通常是相反的方式),但是在发布模式和调试模式之间编译不同的代码是环境的一个有意和有用的特性。
  • 偶尔的条件编译标志没有错。我同意,当你看到不止一把时,它会令人困惑,虽然
  • 就是这样...谢谢!只是希望能够在调试模式与发布模式下隐藏一些代码。效果很好!
  • 我了解保留。在这种情况下,对我来说只有几个用途。尝试从我的主机发送电子邮件的几行代码 - 这在我的开发框中不起作用。只是不想在发布前重新浏览我的代码以取消注释。谢谢!
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 不是我想要的直接解决方案,但很高兴知道。谢谢。
【解决方案3】:

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

类似:

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.NETInversion of control 容器来配置您的开发环境与发布环境。

【讨论】:

  • +1 for DI 作为解决方案,虽然可能不是解决这个问题的正确方法,但我相信它可以解决大多数条件编译问题......并且解释得很好。跨度>
【解决方案4】:

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

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

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

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

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

【讨论】:

  • 重读问题。他想要条件编译,但不知道它的存在。
猜你喜欢
  • 1970-01-01
  • 2017-04-01
  • 2010-11-09
  • 2010-12-30
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多