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

Posted

技术标签:

【中文标题】system.web.compilation.debug 与 system.codedom.compilers.compiler.compilerOptions /define:Debug=True【英文标题】:system.web.compilation.debug vs. system.codedom.compilers.compiler.compilerOptions /define:Debug=True 【发布时间】:2013-04-01 06:36:01 【问题描述】:

当我将 ASP.NET Web 应用程序部署到生产环境时,我使用配置转换从 <compilation> 中删除 debug="true"。然而,就在今天,我注意到 web.config 中的另一个部分如下所示:

<system.codedom>
    <compilers>
        <compiler compilerOptions="/define:Debug=True" />
    </compilers>
</system.codedom>

这是什么?这样做是否违背了将其从&lt;compilation&gt; 中删除的目的?如果我如上所示删除该属性会发生什么?

【问题讨论】:

【参考方案1】:

是否存在违背目的的事实 从&lt;compilation&gt;中删除它

来自MSDN C# Compiler Options 要打开 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" 结果是

假 已定义 Debug = true 开启

结果 2

如果debug="true"compilerOptions="/define:Debug=True" 结果是

是的 已定义调试已开启 已定义 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

假(调试为假) 已定义的调试已打开(但已定义的调试现在正在运行) 已定义 Debug = true 已打开(这也是运行) 测试标志(但定义的额外标志也运行)

MSDN

看MSDN for the /define (Preprocessor Definition)我看那个声明

/define:Debug=True

仅适用于这种代码情况

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

【讨论】:

对不起,我推迟了。我不确定我是否理解#if DEBUG 的使用。除非我更改工具栏上的配置下拉菜单(您可以在其中看到调试、发布等)然后重新构建,否则我无法让它返回 false。另外,#if DEBUG#if DEBUG == true 有什么区别?最后,你最后的反对答案是什么? David Ebbo 的回答指出拥有/define:Debug=Truedebug="true" 相同。你的回答同意还是反驳他的回答? @oscilatingcretin 具有debug="true"/define:debug=true 不同,因为具有更高的优先级并且定义在这里不起作用,我已经制作了一个测试页面并在此处显示结果证明它。现在我在答案中也有#if DEBUG#if DEBUG == true 之间的区别,如果你看到测试你就会理解它们。我不能再在这里写它们了。 @oscilatingcretin 不一样,这里来自msdn的证明是msdn.microsoft.com/en-us/library/6s2x2bzy.aspx,我会再次更新答案 看过那个和 Debug=true 上的 MSDN 文档后,我相信你是正确的。奖励您赏金并回答以结束此问题。 测试页面的完整代码是什么?为生产环境推荐codedom配置【参考方案2】:

您在compilerOptions 中设置的字符串基本上是一段命令行,会添加到所有编译中。

如果您使用 aspx 页面,您也可以在其中设置它,使其仅适用于一页。例如

<%@ Page Language="C#" CompilerOptions="etc..." %>

您是如何在配置中将其设置为“/define:Debug=True”的?有这种情况并不典型。但是要回答您的问题,是的,无论debug 属性的值如何,这都会有效地打开调试。

除非你有充分的理由拥有它,否则我会完全取消它。

【讨论】:

以上是关于system.web.compilation.debug 与 system.codedom.compilers.compiler.compilerOptions /define:Debug=True的主要内容,如果未能解决你的问题,请参考以下文章