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

让人想犯罪 __ 提交于 2020-02-26 12:44:26

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

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

#define DEBUG 
#define RELEASE

我在测试正确的变量吗?

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

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


#1楼

命名空间

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版本会失败。

所以这就是我的想法(灵感来自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指令并进行编译并执行! 合并后的程序代码会活跃起来!

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

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


#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();
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!