2012-12-21 84 views
25

其他指令的#if预处理指令我知道,我可以这样使用预处理指令检查调试/发布:比DEBUG

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

但有关检查其他配置一样,考什么。在VB中,你可以这样做:

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

所以,我的问题是在C#中,我该如何检查测试模式?我有一些我想要执行的代码,如果我在Debug AND Test中,但不是在Release模式下,所以我需要一种方法来检查是否处于Release模式。在VB我这样做:

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

回答

39

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

对于代码,您只需要在测试版本的配置中运行:

#if TEST 
// ... 
#endif 

而且代码你不希望在测试版本配置上运行,你可以#else以上两种,或做这:

#if !TEST 
// ... 
#endif 
+6

我没有了解如何在Build选项卡下设置Conditional编译符号。这正是我所期待的!谢谢!解释如何设置符号+1。 –

4

有几种方法来处理你的因素。在我的世界里,我们用四个主要技术:

  1. 编译器标志(#if
  2. 部分类
  3. 单独实现
  4. 运行时决定

因此,例如,我们已经建立的配置for,具有非托管代码的C#,具有所有托管代码的C#,针对silverlight的C#。在C#非托管项目中,我们有一个编译时符号UNMANAGED,对于C#我们有MANAGED,对于silverlight我们有SILVERLIGHT。这让我可以将小任务注入代码并在所有项目中共享相同的文件。没什么大不了。

对于部分类,我们为每个具有附加代码实现的项目分别创建了.cs文件。在我们无法通过将抽象类作为父类实现大多数实现,然后在每个目标的具体类中使用边缘代码的情况下,我们无法做到这一点。这工作得很好。

对于单独的实现,我们承认在代码库之间可以共享的东西很少,而且我们最好使用单独的代码。这并不理想,但如此吧。

对于运行时检查,就是这样。 #if中不使用DEBUG进行检查,而是使用运行时检查设置进行选择。除非你有非常大的调试脚手架,否则这不是一个不错的选择,因为它也可以让你进行现场调试(但你可能有交付限制来阻止它)。

就我个人而言,我尽量避免编译器标志。他们使代码难以阅读。老实说,有些时候它们是有意义的。我们已经有了不能仅仅因为类声明而编译Silverlight的类(我认为它是ObservableCollection不可用),我们不得不从其他东西继承。其他一切正常。

+0

感谢分享。 –

1

简单的答案是

  • 转到项目 - > [项目名称]属性 - >建设
  • 设置检查[]定义DEBUG

现在你可以用DEBUG前任指令喜欢玩

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

右键单击要使用cust的Project [Project name]名称om预编译器指令。

转到属性项,然后到生成选项卡。

那么你需要在文本框中添加自定义指令。例如,我添加了“本地”作为我的自定义指令见下文

enter image description here

像现在,你可以可以用在你的下面显示的新的编译器指令(在C#)

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

我们可以为每个用户配置而不是项目配置 –