• 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后,认为这是升级过程中生成的无用标签,将其删除了)

    我把这个标签的全部内容贴出来:

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

     

    原文出处:http://www.cnblogs.com/OpenCoder/archive/2010/07/22/1782981.html

  • 相关阅读:
    alpha冲刺—Day8
    alpha冲刺—Day7
    alpha冲刺—冲刺计划&代码规范
    Linux安装jdk
    chrome插件开发-notification API注意事项
    VSCode远程连接Docker
    Idea发布项目到Docker
    开发环境配置
    Java设计模式之《单例模式》及应用场景
    使用Docker安装jenkins
  • 原文地址:https://www.cnblogs.com/yuananyun/p/2009120.html
Copyright © 2020-2023  润新知