最近在公司做項目的時候,遇到個小問題,就是公司使用的是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並不是舊版本的擴充版本,其大部分相關特性都在根設定檔中配置好了,不需要在項目設定檔中進行配置。