#if preprocessor指令用于DEBUG以外的指令

时间:2012-12-21 13:16:34

标签: c# .net preprocessor-directive

我知道我可以使用预处理程序指令来检查Debug / Release:

#if DEBUG
    //debug mode
#elif
    //release mode
#endif

但是要检查其他配置,比如Test。在VB中你可以这样做:

#If CONFIG = "Release" Then
    'Release mode
#ElseIf CONFIG = "Test" Then
    'Test mode
#ElseIf CONFIG = "Debug" Then
    'Debug mode
#End If

所以,我的问题是在C#中,如何检查测试模式?我有一些代码,如果我在调试和测试中,我想要执行,但不是在发布模式,所以具体来说,我需要一种方法来检查不在发布模式。在VB中我会这样做:

#If Not CONFIG = "Release" Then
    'Do something here for every configuration that is not Release
#End If

4 个答案:

答案 0 :(得分:49)

与DEBUG相同, 假设您已在“条件编译符号”文本框中定义了列出TEST 的构建配置(在项目属性>构建选项卡下;这是一个以空格分隔的列表。)

对于您只想在TEST构建配置中运行的代码:

#if TEST
// ...
#endif

对于您不想在TEST构建配置中运行的代码,您可以#else以上,或者执行此操作:

#if !TEST
// ...
#endif

答案 1 :(得分:4)

有几种方法可以处理您的因子。在我的世界里,我们使用了四种主要技术:

  1. 编译器标志(#if
  2. 部分课程
  3. 单独实施
  4. 运行时决策
  5. 例如,我们为C#构建了配置非托管代码,C#构建了所有托管代码,C#构建了Silverlight。在C#非托管项目中,我们有一个编译时符号UNMANAGED,对于C#,我们有MANAGED,对于silverlight我们有SILVERLIGHT。这使我可以将小任务注入代码并在所有项目中共享相同的文件。没什么大不了的。

    对于部分类,我们为每个具有边缘代码实现的项目都有单独的.cs文件。在我们无法通过将抽象类作为具有大部分实现的父类,然后在每个目标的具体类中使用边缘代码来实现这项工作的情况下使用它。这很好用。

    对于单独的实现,我们承认代码库之间几乎没有共享,我们最好使用单独的代码。这不是理想的,但也是如此。

    对于运行时检查,就是这样。不是在DEBUG中检查#if,而是使用运行时检查来设置该选项。除非你有非常庞大的调试脚手架,否则这不是一个糟糕的选择,因为它还允许你进行现场调试(但是你可能有阻止它的传输限制)。

    就个人而言,我试图避免使用编译器标志。它们使代码更难阅读。但老实说,有时它们才有意义。由于类声明(我认为ObservableCollection不可用),我们已经有了不能在Silverlight中编译的类,我们不得不继承其他东西。其他一切都很好。

答案 2 :(得分:3)

右键单击要使用自定义预编译器指令的项目[项目名称]名称。

转到属性项,然后转到构建选项卡。

然后您需要在文本框中添加自定义指令。例如,我添加了“本地”字样。作为我的自定义指令,见下图

enter image description here

现在您可以使用新的编译器指令,如下所示(在C#中)

  #if **Local**
    //TODO:Add your c# code here
  #endif

答案 3 :(得分:1)

简单的答案是

  • 转到项目 - > [项目名称]属性 - >构建
  • 设置选中[]定义DEBUG

现在您可以使用DEBUG前身指令,如

#if DEBUG
...
#else
...
#endif