如果忽略了DEBUG(VB.net或C#)

20

我在我的代码中有几个这样的内容,到目前为止一直都很正常:

#If DEBUG Then    
   ... some code here       
#End If     

现在我注意到,在“#If DEBUG Then ... #End If”内部的代码也会在“Release Mode”中执行。

这很奇怪,以前没有发生过。可能会发生什么情况,以致于现在忽略了 #If DEBUG(无论是在IDE中的调试还是在最终的可执行文件中都被忽略了)?

我已经尝试了清理、重建等方法:没有成功。谢谢任何提示和帮助。

-Pam


如果你像我一样使用新的项目格式(netcore/standard)来访问这篇文章,那么这是一个VS的bug - Joel
10个回答

34
首先,确保你理解了代码运行和构建方式之间的区别。太多人把“在调试器中启动”等同于“调试版本”,把“不在调试器中启动”等同于“发布版本”。它们是完全正交的 - 你可以在调试器中启动一个发布版本(通常可用信息较少),也可以在非调试器中启动一个调试版本。如果您已经知道这一点,请忽略此提示。
现在,假设您确实已经将要构建的项目配置更改为Release,则需要检查该特定配置的项目属性。我不知道VB中是什么样子的,但在C#中,在项目属性的生成选项卡中,将有一个定义符号的列表 - 那就是影响是否构建 #if DEBUG 代码的东西。也许有人已经将项目配置从Debug复制到Release了?
编辑:在构建时检查这一点的一种方法是:
#if DEBUG
#error This shouldn't happen
#endif

在发布版本中,应该能够无错误地构建。在调试中,可能会出现错误。
编辑:另一个选项是您的整体解决方案配置现在引用了错误的项目配置类型。我记不清确切的菜单名称,但如果您在“项目”中查找“配置管理器”,则应该能够打开一个映射“项目”和“解决方案配置”的网格以构建项目配置。

我没有修改默认配置。是的,我正在以发布模式构建它。即使在最终可执行文件中,#if debug现在也被忽略了(这在昨天之前并没有发生??)。 - Pam
@Pam:看看我对另一个诊断测试和检查的编辑。 - Jon Skeet
如果我使用上面的代码,它会显示(在IDE中的发布模式):错误10 'If'、'ElseIf'、'Else'、'End If'、'Const'或'Region' 期望。 - Pam
在VB中,您可以使用#If (expression) Then #End If,但不幸的是没有#errorVB语言参考编译器指令 - MarkJ

27

C#项目(Visual Studio)

  1. 进入:项目属性 -> 构建(选项卡)
  2. 选择配置:发布
  3. 取消勾选“定义DEBUG常量”

  4. 现在选择配置:调试

  5. 选中“定义DEBUG常量”

  6. 在您的代码中,您现在可以键入以下内容(使用大写字母DEBUG)

#IF DEBUG

// Debugging code goes here

#ENDIF

23

23
在Stack Overflow的帖子中链接到Experts Exchange?! - BoltClock
像往常一样,它已经被检查过了。我没有动它。 - Pam
4
“像往常一样检查了吗?” 在发布版本中不应该进行检查。 - Henrik
嗯,当我链接它时,我只需向下滚动即可显示所有其他答案。而且@BoltClock是我搜索到的第一个答案 :P - Gage
1
等一下!在发布模式下,DEBUG必须取消勾选吗?那么跟踪呢?必须勾选还是不勾选? - Pam

6

你是否在项目属性/生成中的发布配置中勾选了“定义DEBUG常量”?

同时,请确保你没有在解决方案级别的发布配置中构建项目级别的调试配置(请参阅“配置管理器”)。


没有,我没有这样做。在高级编译选项中,定义了Debug被勾选。即使在最终的EXE文件中,#if debug也会被忽略! - Pam

2
我曾遇到过类似的问题,其中“DEBUG”从未为真。尝试通过取消选中和选中“定义DEBUG常量”复选框并每次重新构建来解决问题,但这并没有起作用。
我的解决方案是在Debug配置的“条件编译符号”文本框中手动定义“DEBUG”。重新构建时,Visual Studio 2019会自动从文本框中删除DEBUG符号(因为实际上不应该存在),从那时起它又可以正常工作了。当我从Debug切换到Release时,正确的行被灰化了。 这似乎是VS 2019(16.4.5)中可能存在的一个错误?

1

同时请记住,#if DEBUG 必须大写。例如,#if debug 是行不通的。


@user1306322,无论是答案还是您的评论,都只适用于C#的情况。 - 41686d6564 stands w. Palestine
@AhmedAbdelhameed 我最近没有使用VB的经验,但你知道在VB中“#If”、“#IF”、“Debug”和“debug”的大小写是否有影响吗?据我所知,在C#中,“#if”必须小写,“DEBUG”必须全部大写才能正常工作。 - user1306322
它们并不重要。VB不像C#那样区分大小写,即使是 #iF dEbUg tHEN 也可以正常工作。然而,在VB中编写它的正确方式应该是 #If DEBUG Then如果启用了自动格式化(漂亮列表),VS会为您完成这个操作。简而言之,在C#中是 if/#if,而在VB中是 If/#If,但与C#不同的是,VB编译器将接受两者。 - 41686d6564 stands w. Palestine
我使用了C#,对我很有效。谢谢! - Matvi

0
如果您正在使用VB.NET Framework v4.5,则可以这样使用:
If Debugger.IsAttached Then
    '... some code here
End If

0

undefine DEBUG,这样就不会执行那部分代码了。


什么?我没有得到提示。 - Pam
3
@ Pam: 你说代码即使在发布模式下也在执行。这是因为你的代码中某处定义了 DEBUG。参见:http://msdn.microsoft.com/en-us/library/4y6tbswk.aspx - user195488

0
在NET CORE C#中,这不完全是一个“检查”。您需要转到“项目属性>编译>常规>自定义编译符号”。 一旦在那里,您可以添加DEBUG变量(或者其他在您的Visual Studio环境中支持的变量)。
输入名称并按添加。

Project properties vars


0
如果您正在使用ASP.NET,请确保Web.Config文件中存在这一行:
<compilation debug="false" targetFramework="4.5">

所以如果 debug="true",你的项目将在调试模式下运行。


这与条件编译无关。 - Caspian Canuck
与条件编译无关,而是运行时的问题! - Ali Mahmoodi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接