陈斌彬的技术博客

Stay foolish,stay hungry

ASP.NET 的标签

<system.codedom>
    <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.configweb.config等根配置文件,你会发现其中几乎没有对.Net Framework 3.5的相关特性进行配置,里面的配置大部分还是针对2.0版本的,这是因为.Net 3.5的很多相关特性是在项目中的web.config中扩展的。这一点已在.Net Framework 4.0中得到了改进,因为.Net Framework 4.0并不是旧版本的扩展版本,其大部分相关特性都在根配置文件中配置好了,不需要在项目配置文件中进行配置。

Resource Reference