ASP.NET 的<system.codedom>标签
最近在公司做项目的时候,遇到个小问题,就是公司使用的是VS2008,在项目中我使用了NET 3.5中的简化属性
比如:public string Name {get;set;}
按道理来说是没有问题的,但是在ASP.NET中这个属性老是报错:必须声明主体,因为它未标记为 abstract 或 extern
这个错误很明显是.Net Framework没有识别出这是简化的属性造成的。
我就纳闷了这ASP.NET 明明是在VS2008(.Net 3.5)下开发的,怎么不能用简化属性?检查了下网站的属性上目标 Framework是选的.Net Framework 3.5,在web.config中的<assemblies>标签下也引入了.Net 3.5的程序集。那为什么VS编译器会不识别.Net 3.5的简化属性?
找了半天最后发现公司ASP.NET项目的web.config中少了一个重要的标签<system.codedom>(估计是哪位大哥将项目从2.0升级成3.5后,认为这是升级过程中生成的无用标签,将其删除了)
我把这个标签的全部内容贴出来:
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="OptionInfer" value="true"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
</compilers>
</system.codedom>
这个标签有个至关重要的作用,那就是告诉.Net Framework 该用哪个版本的编译器来编译代码。
其中的子标签
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CSharp.CSharpCodeProvider,System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
是设置C#语言该用什么版本的编译器来编译,可以看到里面的属性name="CompilerVersion"和value="v3.5"指定了编译器版本是3.5的(不信你把这里改成2.0,在代码中使用简化属性时又会报错了)。
另外个子标签
<compiler language="vb;vbs;visualbasic;vbscript" extension=".vb" type="Microsoft.VisualBasic.VBCodeProvider, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" warningLevel="4">
<providerOption name="CompilerVersion" value="v3.5"/>
<providerOption name="OptionInfer" value="true"/>
<providerOption name="WarnAsError" value="false"/>
</compiler>
是设置VB语言该用什么版本的编译器来编译,可以看到也是3.5。
如果web.config中没有<system.codedom>标签的配置,那么.Net Framework 默认使用的是2.0版本的编译器,2.0的编译器当然不能识别诸如简化属性、匿名类等这些3.5才有的语法,所以编译时会报错。这都是因为.Net Framework 3.5是.Net Framework 2.0的扩展版本,不信你可以到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG下查看machine.config和web.config等根配置文件,你会发现其中几乎没有对.Net Framework 3.5的相关特性进行配置,里面的配置大部分还是针对2.0版本的,这是因为.Net 3.5的很多相关特性是在项目中的web.config中扩展的。这一点已在.Net Framework 4.0中得到了改进,因为.Net Framework 4.0并不是旧版本的扩展版本,其大部分相关特性都在根配置文件中配置好了,不需要在项目配置文件中进行配置。