一個被很多人提起過的問題:我應當如何告訴我的 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/