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>
这是什么?这样做是否违背了将其从<compilation>
中删除的目的?如果我如上所示删除该属性会发生什么?
【问题讨论】:
【参考方案1】:是否存在违背目的的事实 从
<compilation>
中删除它
来自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=True
与debug="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的主要内容,如果未能解决你的问题,请参考以下文章