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

  • 相关阅读:
    SQL-W3School-高级:SQL LIKE 操作符
    SQLW3School-高级:SQL TOP 子句
    SQL-W3School-基础:SQL DELETE 语句
    SQL-W3School-基础:SQL UPDATE 语句
    SQL-W3School-基础:SQL INSERT INTO 语句
    SQL-W3School-基础:SQL ORDER BY 子句
    SQL-W3School-基础:SQL AND & OR 运算符
    SQL-W3School-基础:SQL WHERE 语句
    SQL-W3School-基础:SQL DISTINCT 语句
    SQL-W3School-基础:SQL SELECT 语句
  • 原文地址:https://www.cnblogs.com/OpenCoder/p/1782981.html
Copyright © 2020-2023  润新知