zoukankan      html  css  js  c++  java
  • 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并不是旧版本的扩展版本,其大部分相关特性都在根配置文件中配置好了,不需要在项目配置文件中进行配置。

  • 相关阅读:
    Hadoop 学习笔记 (十) hadoop2.2.0 生产环境部署 HDFS HA Federation 含Yarn部署
    hadoop 2.x 安装包目录结构分析
    词聚类
    Hadoop 学习笔记 (十一) MapReduce 求平均成绩
    Hadoop 学习笔记 (十) MapReduce实现排序 全局变量
    Hadoop 学习笔记 (九) hadoop2.2.0 生产环境部署 HDFS HA部署方法
    Visual Studio Code 快捷键大全(Windows)
    Eclipse安装教程 ——史上最详细安装Java &Python教程说明
    jquery操作select(取值,设置选中)
    $.ajax 中的contentType
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/1782981.html
Copyright © 2011-2022 走看看