一個被很多人提起過的問題:我應當如何告訴我的 IIS 應用程序或者虛擬目錄使用 ASP.NET 3.5 而不是 ASP.NET 2.0 呢?
人們一般會進入 IIS6 或者 IIS7 並且建立一個應用程序池,然后查看屬性,接着打開下拉列表並期望有 .NET 3.0 和 .NET 3.5 兩個選項在其中,卻發現根本沒有,於是不滿,但是這是理所當然的。
現在給出這個問題的解釋,並希望這不會再使人們覺得迷惑了。
營銷策略
我們都希望每個主要版本的更新都意味着新的 CLR, 但事實上並不如此。
.NET 2.0
.NET 的核心在 %windir%\Microsoft.NET\Framework\v2.0.50727. 這里就是 GAC (Global Assembly Cache) 所有的類庫和編譯器的所在地。當有人問起 .Net 在哪里時我常常從這里開始指出
.NET 3.0
.NET 3.0 並不是新的編譯器以及 CLR。相反,這是三大類庫:WCF (Windows Communication Foundation née Indigo), WPF (Windows Presentation Foundation née Avalon) 以及 Windows Workflow (WF)。
請記住:安裝了 .NET 3.0 並不會像你恐懼的那樣各個方面都大幅改變了你的系統。你的 2.0 程序仍然會在安裝了3.0的系統上好好地運行。.Net 3.0 使用 2.0 的編譯器以及 2.0 的 CLR。
嘗試一下。 如果你進入 Visual Studio 進入 File | New | Project (or Web Site),注意右上方的下拉列表 。
選擇 ".NET Framework 3.0" 並且新建一個 "WCF Service",看看 web.config 文件。注意這是很方便的,並且開起來跟 .NET 2.0 ASP.NET 差不多,只是增加了小部分東西。
基本上,請記住,Framework 版本不等於 CLR 版本。如果你設置 IIS 應用程序池使用 .NET 2.0,你是在說使用 2.0 的 CLR。 WCF 程序使用 .NET 2.0 CLR 但使用 3.0 WCF 類庫。
- .NET Framework 1.x = CLR 1.x
- .NET Framework 2.0 = CLR 2.0
- .NET Framework 3.0 = CLR 2.0
- .NET Framework 3.5 = CLR 2.0 + (C# 3.0 | VB9)
當然,同樣地你也可以使用 3.5 的編譯器以及 3.0 的類庫。
在你新的應用程序的 web.config 文件,有一個 <system.serviceModel> 區域用於定制 WCF,其他地方跟 2.0 相同。
.NET 3.5
.NET Framework 3.5 指另外的一些新東西。 第一,龐大的 LINQ,包含了新的 C# 和 VB 編譯器。第二,REST 支持被添加到 Windows Communication Foundation。第三,ASP.NET AJAX, 相比ASP.Net 2.0,這次不是一個獨立下載的安裝包了。
.NET 3.5 還有其他一些新的東西,像 .NET 2.0 的修正包。要獲知究竟 .NET 3.5 多了一些什么的一種方法就是去看看 c:\windows\assembly。以下是 GAC (全局程序集緩存)中3.5版本的程序集。
同時,從 %windir%\Microsoft.NET\Framework\v3.5 中我們可以看到新的編譯器,MSBuild Target 文件等等。
所以,要回答本文開篇提出的問題,可以做以下實驗:
打開 Visual Studio 並建立一個 .NET 2.0 網站。一旦加載后, 觀察 web.config 文件。接着,右擊項目文件,選屬性,選擇.Net Framework 3.5。
現在,打開 web.config 文件並觀察變化。一些處理器被添加到其中以支持 Ajax,還有一些新的 ASP.NET 特性,但是最重要的是 <system.codedom> 標記還有程序集區域中新增的程序集。
<compilation debug="false">
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</compilation>
<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>
這就是所有的魔術。但是這並不是魔術,一切東西都是可見的。 這些東西就告訴你的網站使用新的編譯器以及引用新增的類庫。
這里就是告訴 ASP.NET 使用 .NET 3.5 的地方,不在 IIS 里面。IIS 應用程序池知道 CLR 的版本,不是 Framework 和編譯器的版本,這些由應用程序決定。
現在,只是我個人觀點,我更願意以以下方式命名和配置我的應用程序池。
轉自:http://diryboy.blog.163.com/blog/static/31884331200832471156387/