首页 文章

调试与发布的C#if / then指令

提问于
浏览
360

在解决方案属性中,我将Configuration设置为“release”,用于我唯一的项目 .

在主程序的开头,我有这个代码,它显示“Mode = Debug” . 我也在最顶端有这两行:

#define DEBUG 
#define RELEASE

我在测试正确的变量吗?

#if (DEBUG)
            Console.WriteLine("Mode=Debug"); 
#elif (RELEASE)
            Console.WriteLine("Mode=Release"); 
#endif

我的目标是根据调试与发布模式为变量设置不同的默认值 .

12 回答

  • 45

    命名空间

    using System.Resources;
    using System.Diagnostics;
    

    方法

    private static bool IsDebug()
        {
            object[] customAttributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(DebuggableAttribute), false);
            if ((customAttributes != null) && (customAttributes.Length == 1))
            {
                DebuggableAttribute attribute = customAttributes[0] as DebuggableAttribute;
                return (attribute.IsJITOptimizerDisabled && attribute.IsJITTrackingEnabled);
            }
            return false;
        }
    
  • 7

    默认情况下,如果项目在调试模式下编译,则Visual Studio定义DEBUG,如果项目处于发布模式,则不定义它 . 默认情况下,RELEASE未在发布模式中定义 . 使用这样的东西:

    #if DEBUG
      // debug stuff goes here
    #else
      // release stuff goes here
    #endif
    

    如果您只想在发布模式下执行某些操作:

    #if !DEBUG
      // release...
    #endif
    

    此外,值得指出的是,您可以在返回 void 的方法上使用 [Conditional("DEBUG")] 属性,只有在定义了某个符号时才执行它们 . 如果未定义符号,编译器将删除对这些方法的所有调用:

    [Conditional("DEBUG")]
    void PrintLog() {
        Console.WriteLine("Debug info");
    }
    
    void Test() {
        PrintLog();
    }
    
  • 603
    bool isDebug = false;
    Debug.Assert(isDebug = true); // '=', not '=='
    

    方法Debug.Assert具有条件属性 DEBUG . 如果未定义,则调用 and the assignment isDebug = trueeliminated

    如果定义了符号,则包含呼叫;否则,省略呼叫(包括呼叫参数的评估) .

    如果定义了 DEBUG ,则 isDebug 设置为 true (并传递给 Debug.Assert ,在这种情况下不执行任何操作) .

  • 4

    由于这些COMPILER指令的目的是告诉编译器不要包含代码,调试代码,beta代码或者所有最终用户所需的代码,除了那些广告部门,即你想要的#Define AdDept能够根据您的需要包含或删除它们 . 如果非AdDept合并到AdDept中,则无需更改源代码 . 然后,所有需要做的就是在程序的现有版本的编译器选项属性页面中包含#AdDept指令并进行编译并执行!合并后的程序代码会活跃起来!

    您可能还希望为新进程使用声明,该进程尚未准备好进入黄金时段,或者在代码发布之前无法在代码中处于活动状态 .

    无论如何,这就是我这样做的方式 .

  • 0

    删除代码中的 #define DEBUG . 在该特定构建的构建配置中设置预处理器(DEBUG / _DEBUG应该已在VS中定义) .

    它打印"Mode=Debug"的原因是因为你的 #define 然后跳过 elif .

    另外,正确的检查方法是:

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

    不要检查RELEASE

  • 6

    删除顶部的定义

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

    确保在Project Build Properties中定义DEBUG常量 . 这将启用 #if DEBUG . 我没有看到预定义的RELEASE常量,因此可能意味着DEBUG块中的任何内容都不是RELEASE模式 .

    Define DEBUG constant in Project Build Properties

  • 16

    如果您尝试使用为构建类型定义的变量,则应删除这两行...

    #define DEBUG  
    #define RELEASE
    

    ...这些将导致#if(DEBUG)始终为真 .

    RELEASE也没有默认的条件编译符号 . 如果要定义一个转到项目属性,请单击“生成”选项卡,然后将“RELEASE”添加到“常规” Headers 下的“条件编译符号”文本框中 .

    另一种选择是这样做......

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

    我更喜欢像这样查看#defines:

    if (System.Diagnostics.Debugger.IsAttached)
    {
       //...
    }
    else
    {
       //...
    }
    

    当然,您可以在调试模式下编译和部署某些内容,但仍然没有附加调试器 .

  • 1

    Tod Thomson作为静态函数而不是单独的类稍微修改(bastardized?)版本的答案(我希望能够在我已经包含的viewutils类的WebForm视图绑定中调用它) .

    public static bool isDebugging() {
        bool debugging = false;
    
        WellAreWe(ref debugging);
    
        return debugging;
    }
    
    [Conditional("DEBUG")]
    private static void WellAreWe(ref bool debugging)
    {
        debugging = true;
    }
    
  • 2

    一个可以为您节省大量时间的提示 - 不要忘记,即使您在构建配置下选择 debug (在vs2012 / 13菜单上它's under BUILD => CONFIGURATION MANAGER) - that'还不够 .

    你需要注意PUBLISH Configuration ,因为:

    enter image description here

  • 17

    我不是#if的忠实粉丝,特别是如果你把它全部传播到你的代码库中,因为它会给你调试构建通过的问题,但如果你不小心,Release版本会失败 .

    所以这就是我的想法(灵感来自#ifdef in C#):

    public interface IDebuggingService
    {
        bool RunningInDebugMode();
    }
    
    public class DebuggingService : IDebuggingService
    {
        private bool debugging;
    
        public bool RunningInDebugMode()
        {
            //#if DEBUG
            //return true;
            //#else
            //return false;
            //#endif
            WellAreWe();
            return debugging;
        }
    
        [Conditional("DEBUG")]
        private void WellAreWe()
        {
            debugging = true;
        }
    }
    

相关问题