system.web.compilation.debug 与 system.codedom.compilers.compiler.compilerOptions /define:Debug=True 的区别

7
当我将ASP.NET Web应用程序部署到生产环境时,我会使用配置转换来从<compilation>中删除debug="true"。然而,就在今天我注意到web.config中另一个类似于以下代码的部分:
<system.codedom>
    <compilers>
        <compiler compilerOptions="/define:Debug=True" />
    </compilers>
</system.codedom>

这是什么?那里的存在是否有违从<compilation>中删除它的目的?如果像上面展示的那样删除该属性会发生什么?
2个回答

6
“那里是否存在的事实会否导致从<compilation>中移除它的目的失败?”
MSDN C#编译器选项中, 要打开编译器上的debug标志,需要使用/debug而不是/define:Debug=True

/debug : 指示编译器生成调试信息。
/define : 定义预处理器符号。

因此,当您定义Debug=True时,只有该代码情况被激活:
#if DEBUG == true
// Compile what is inside here !
#endif

/define:Debug=True不会添加任何额外的调试信息,除非你手动使用上述代码包含它们。

测试页面

我使用以下代码进行测试并查看发生了什么。

    txtDebug.Text = HttpContext.Current.IsDebuggingEnabled.ToString();

    #if DEBUG
    txtDebug.Text +=  "<br>defined Debug is on";
    #endif
    #if DEBUG == true
    txtDebug.Text +=  "<br>defined Debug = true is on";
    #endif

结果1

如果debug="false"且使用compilerOptions="/define:Debug=True",结果为

false
定义的Debug=true已启用

结果2

如果debug="true"且使用compilerOptions="/define:Debug=True",结果为

true
定义的Debug已启用
定义的Debug=true已启用

结果3

现在我进行了一次测试,我在web.config文件中添加了这行内容

  <compiler language="c#;cs;csharp" extension=".cs" 
    compilerOptions="/define:Debug=True /D:DEBUG,TESTFLAG" 
   type="Microsoft.CSharp.CSharpCodeProvider, System, 
     Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" 
       warningLevel="4" />

结果是 debug=false

False(debug为false)
定义的Debug为on(但定义的DEBUG现在运行)
定义的Debug = true为on(这也在运行)
测试标志(但定义的额外标志也在运行)

MSDN

查看/define(预处理器定义)的MSDN页面,我发现声明:

/define:Debug=True

这个工作只适用于这种代码情况。

#if DEBUG == true
txtDebug.Text +=  "<br>defined Debug = true is on";
#endif

抱歉我一直拖延。我不确定我是否理解了#if DEBUG的用法。除非我更改工具栏上的配置下拉菜单(您可以看到Debug,Release等),然后重新构建,否则我无法使其返回false。另外,#if DEBUG#if DEBUG == true之间有什么区别?最后,您的最终答案是什么?David Ebbo的答案表明,具有/define:Debug=Truedebug="true"是相同的。您的答案是否与他的答案一致或相矛盾? - oscilatingcretin
@oscilatingcretin,拥有debug="true"并不等同于/define:debug=true,因为前者具有更高的优先级,而后者在这里无法工作。我已经制作了一个测试页面,并在此展示了结果,证明了这一点。现在我还回答了#if DEBUG#if DEBUG == true之间的区别,如果您看到测试结果,就会理解它们。我不能再在这里写一遍了。 - Aristos
@oscilatingcretin 不是一样的,这里有来自 MSDN 的证明:http://msdn.microsoft.com/en-us/library/6s2x2bzy.aspx,我会再次更新答案。 - Aristos
看了那个以及 Debug=true 的 MSDN 文档后,我相信你是正确的。授予你奖励并接受你的答案以结束此问题。 - oscilatingcretin
Test页面的完整代码是什么?生产环境下推荐使用哪种codedom配置 - Kiquenet

1
您在 compilerOptions 中设置的字符串基本上是一个命令行片段,它会添加到所有编译中。
如果您使用 aspx 页面,则也可以在其中设置它,以便仅适用于一个页面。例如:
<%@ Page Language="C#" CompilerOptions="etc..." %>

你是如何将配置设置为 "/define:Debug=True" 的?这不是典型的设置。但是回答你的问题,是的,这将有效地打开调试功能,无论 debug 属性的值是什么。
除非你有充分的理由使用它,否则我建议你完全删除它。

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