C#if / then指令用于debug和release

在解决方案属性中,我将Configuration设置为“release”,用​​于我惟一的项目。 测试

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

#define DEBUG 
#define RELEASE

我在测试正确的变量吗? debug

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

个人目标是根据调试版本和发布模式为变量设置不一样的默认值。 调试


#1楼

命名空间 code

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;
    }

#2楼

我不是#if的忠实粉丝,特别是若是你把它所有传播到你的代码库中,由于它会给你调试构建经过的问题,但若是你不当心,Release版本会失败。 get

因此这就是个人想法(灵感来自C#中#ifdef ): 编译器

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;
    }
}

#3楼

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

您可能还但愿对新进程使用声明,该进程还没有准备好进入黄金时段,或者在发布代码以前没法在代码中处于活动状态。 io

不管如何,这就是我这样作的方式。


#4楼

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

#define DEBUG  
#define RELEASE

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

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

另外一种选择是这样作......

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

#5楼

默认状况下,若是项目在调试模式下编译,则Visual Studio定义DEBUG,若是项目处于发布模式,则不定义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();
}
相关文章
相关标签/搜索