在解决方案属性中,我将Configuration设置为“release”,用于我唯一的项目 .
在主程序的开头,我有这个代码,它显示“Mode = Debug” . 我也在最顶端有这两行:
#define DEBUG
#define RELEASE
我在测试正确的变量吗?
#if (DEBUG)
Console.WriteLine("Mode=Debug");
#elif (RELEASE)
Console.WriteLine("Mode=Release");
#endif
我的目标是根据调试与发布模式为变量设置不同的默认值 .
12 回答
命名空间
方法
默认情况下,如果项目在调试模式下编译,则Visual Studio定义DEBUG,如果项目处于发布模式,则不定义它 . 默认情况下,RELEASE未在发布模式中定义 . 使用这样的东西:
如果您只想在发布模式下执行某些操作:
此外,值得指出的是,您可以在返回
void
的方法上使用[Conditional("DEBUG")]
属性,只有在定义了某个符号时才执行它们 . 如果未定义符号,编译器将删除对这些方法的所有调用:方法Debug.Assert具有条件属性
DEBUG
. 如果未定义,则调用 and the assignmentisDebug = true
为eliminated:如果定义了
DEBUG
,则isDebug
设置为true
(并传递给Debug.Assert
,在这种情况下不执行任何操作) .由于这些COMPILER指令的目的是告诉编译器不要包含代码,调试代码,beta代码或者所有最终用户所需的代码,除了那些广告部门,即你想要的#Define AdDept能够根据您的需要包含或删除它们 . 如果非AdDept合并到AdDept中,则无需更改源代码 . 然后,所有需要做的就是在程序的现有版本的编译器选项属性页面中包含#AdDept指令并进行编译并执行!合并后的程序代码会活跃起来!
您可能还希望为新进程使用声明,该进程尚未准备好进入黄金时段,或者在代码发布之前无法在代码中处于活动状态 .
无论如何,这就是我这样做的方式 .
删除代码中的
#define DEBUG
. 在该特定构建的构建配置中设置预处理器(DEBUG / _DEBUG应该已在VS中定义) .它打印"Mode=Debug"的原因是因为你的
#define
然后跳过elif
.另外,正确的检查方法是:
不要检查RELEASE
删除顶部的定义
确保在Project Build Properties中定义DEBUG常量 . 这将启用
#if DEBUG
. 我没有看到预定义的RELEASE常量,因此可能意味着DEBUG块中的任何内容都不是RELEASE模式 .如果您尝试使用为构建类型定义的变量,则应删除这两行...
...这些将导致#if(DEBUG)始终为真 .
RELEASE也没有默认的条件编译符号 . 如果要定义一个转到项目属性,请单击“生成”选项卡,然后将“RELEASE”添加到“常规” Headers 下的“条件编译符号”文本框中 .
另一种选择是这样做......
我更喜欢像这样查看#defines:
当然,您可以在调试模式下编译和部署某些内容,但仍然没有附加调试器 .
Tod Thomson作为静态函数而不是单独的类稍微修改(bastardized?)版本的答案(我希望能够在我已经包含的viewutils类的WebForm视图绑定中调用它) .
一个可以为您节省大量时间的提示 - 不要忘记,即使您在构建配置下选择
debug
(在vs2012 / 13菜单上它's under BUILD => CONFIGURATION MANAGER) - that'还不够 .你需要注意PUBLISH
Configuration
,因为:我不是#if的忠实粉丝,特别是如果你把它全部传播到你的代码库中,因为它会给你调试构建通过的问题,但如果你不小心,Release版本会失败 .
所以这就是我的想法(灵感来自#ifdef in C#):