在解决方案属性中,我将Configuration设置为“release”,用于我惟一的项目。 测试
在主程序的开头,我有这个代码,它显示“Mode = Debug”。 我也在最顶端有这两行: spa
#define DEBUG #define RELEASE
我在测试正确的变量吗? debug
#if (DEBUG) Console.WriteLine("Mode=Debug"); #elif (RELEASE) Console.WriteLine("Mode=Release"); #endif
个人目标是根据调试版本和发布模式为变量设置不一样的默认值。 调试
命名空间 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; }
我不是#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; } }
因为这些COMPILER指令的目的是告诉编译器不要包含代码,调试代码,beta代码或者全部最终用户所需的代码,除了那些广告部门,即你想要的#Define AdDept可以根据您的须要包含或删除它们。 若是非AdDept合并到AdDept中,则无需更改源代码。 而后,全部须要作的就是在程序的现有版本的编译器选项属性页面中包含#AdDept指令并进行编译并执行! 合并后的程序代码会活跃起来! it
您可能还但愿对新进程使用声明,该进程还没有准备好进入黄金时段,或者在发布代码以前没法在代码中处于活动状态。 io
不管如何,这就是我这样作的方式。
若是您尝试使用为构建类型定义的变量,则应删除这两行...
#define DEBUG #define RELEASE
...这些将致使#if(DEBUG)始终为真。
RELEASE也没有默认的条件编译符号。 若是要定义一个转到项目属性,请单击“ 生成”选项卡,而后将“RELEASE”添加到“ 常规”标题下的“ 条件编译符号”文本框中。
另外一种选择是这样作......
#if DEBUG Console.WriteLine("Debug"); #else Console.WriteLine("Release"); #endif
默认状况下,若是项目在调试模式下编译,则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(); }