.NET Framework 3.5 SP1 的變更

本檔說明當您從 .NET Framework 3.5 版升級至 .NET Framework 3.5 版 Service Pack 1 (SP1) 時,應用程式或環境中可能需要考慮的設計變更。

由於數個原因而發生變更,包括產品問題的修正、標準合規性、客戶意見反應和安全性。 本主題僅描述值得注意的變更。 如需新功能的相關資訊,請參閱.NET Framework 的新功能。 若要提供意見反應,請造訪 MSDN 產品意見反應中心

下列各節說明.NET Framework 3.5 SP1 版所做的變更。

Common Language Runtime

效能改善

應用程式現在會使用資料執行防止嘗試從非可執行記憶體位置插入和執行程式碼。

Managed 程式碼執行的安全性 (包括 MSIL 元件、NGen 映射和 Unmanaged 程式碼) 受到位址空間配置隨機化 (ASLR) 所支援。

強式名稱、已簽署的元件不再需要在載入時檢查簽章,前提是它們受到完全信任,並載入至完全信任的應用程式域。 這項變更會消除備援檢查,並改善已簽署元件但未安裝在全域組件快取 (GAC) 的應用程式啟動效能。

從網路共用啟動的應用程式的行為與非受控可執行檔相同,並以完全信任方式運作,而不是部分信任。

現在會忽略StringFreezingAttribute屬性。 此屬性用於使用原生映射產生器 (Ngen.exe) 建立原生映射。

Just-In-Time (JIT) 編譯器的內嵌器已大幅改善,以產生更好的品質程式碼。 不過,變更內嵌器會對使用TypeAttributes.BeforeFieldInit列舉值的建構 函式具現化類別的應用程式造成影響。 這些類型的靜態初始化一次保證會在存取任何靜態欄位之前發生,但在叫用靜態方法或實例建構函式之前則不會發生。 在 .NET Framework 3.5 版和 3.5 SP1 中,叫用類別建構函式的確切時間可能不同。

其他 JIT 編譯程式變更包括浮點四捨五入錯誤的變更,以及完成項的時間變更。

不需要修改。

ADO.NET

Value Serializer 類別上的 CanConvertToString 方法

System.Windows.Converters命名空間中值序列化程式類別上的 CanConvertToString方法會擲 ArgumentException,而不是傳回false

如果無法將資料轉換成所要求的類型,System.Data.SqlClient.SQLDataReader.GetString和 oth er Get方法會擲回 InvalidCastException。 訊息現在包含類型,例如:「無法將類型 'System.Decimal' 的物件轉換成類型 'System.String'」。

不需要修改。

UDT 資料行上的 SQLDataReader.GetString

在使用者定義類型上呼叫SQLDataReader.GetString方法, (UDT) 資料行現在會擲回InvalidCastException,而不是錯誤訊息「從 Byte[] 轉換成 String」。

不需要修改。

C#

對非泛型集合的查詢現在使用標準 C# 轉換語意。

在 LINQ 查詢運算式中,非泛型集合,例如 System.Collections.ArrayList ,查詢的 from 子句會由編譯器重寫,以包含對 Cast < T > 運算子的呼叫。 轉換 < T > 會將所有專案類型轉換為查詢中 from 子句中指定的類型。 此外,在 Visual C# 2008 的原始版本版本中,Cast < T > 運算子也會執行一些實數值型別轉換和使用者定義轉換。 不過,這些轉換是使用System.Convert類別來執行, 而不是標準 C# 語意。 這些轉換也會在特定案例中造成顯著的效能問題。 在 Visual C# 2008 SP1 中,轉換 < T > 運算子會修改為針對數數值型別和使用者定義轉換擲回 InvalidCastException。 這項變更可排除非標準 C# 轉換語意和效能問題。 下列範例說明這項變更。

using System;
using System.Linq;

class Program
{
    public struct S { }
    static void Main()
    {
        var floats = new    float[] { 2.7f, 3.1f, 4.5f };
        var ints = from    int i in floats
                   select    i;

        // Visual C# 2008    SP1 throws InvalidCastException.
        foreach (var v in    ints)
               Console.Write("{0} ", v.ToString());

        // The original    release version of Visual C# 2008
        // compiles and    outputs 3 3 4
    }
}

建議的修改:如果您有對非泛型集合執行 LINQ 查詢的程式碼,而且該程式碼現在會擲回例外狀況,請變更查詢運算式的類型,以符合所查詢集合中的專案類型。 如果您需要對元素執行實數值型別或使用者定義轉換,您可以在執行查詢時執行此動作,如下列範例所示:

using System;
using System.Linq;

class Program
{

    static void    Main(string[] args)
    {
        ArrayList floats =    new ArrayList();

        floats.Add(2.7f);
        floats.Add(3.1f);
        floats.Add(4.5f);

        var query = from    float f in floats
                    where    f > 3.0f
                    select    f;

        foreach (int i in    floats)
        {
            // Perform the    conversion as you
            // execute the    query.
            int num =    Convert.ToInt32(i);
               Console.Write("{0} ", num.ToString());
        }

           Console.ReadLine(); // output is 3 4
    }
}

ASP.NET、IIS

IIS 整合模式

在 Internet Information Services (IIS) (7.0 的整合模式上, HttpServerUtility.TransferRequest方法會錯誤地使用 HTTPResponse.End方法來停止父要求。 這會導致擲回 ThreadAbortException ,這可能會影響終止回應執行的效能。 在 .NET Framework 3.5 SP1 中,TransferRequest方法現在會使用 HttpApplication.CompleteRequest方法結束父要求。 這也會透過將控制權傳送至 HttpApplication.EndRequest事件處理常式,而不擲回例外狀況,以正常方式終止目前的要求。

建議的修改:如果您有使用 TransferRequest 方法的錯誤處理常式代碼來判斷是否擲回 ThreadAbortException ,您可以從 catch 區塊中移除該程式碼。 (Finally 區塊會繼續執行。)

整合式 Windows 驗證

安全性變更會影響System.Net.HttpWebRequestSystem.Net.HttpListenerSystem.Net.Security.NegotiateStream和 System.Net 命名空間中相關類別 處理 整合式Windows 驗證的方式。 這項變更可能會影響設定為使用整合式Windows 驗證的 Web 服務器和用戶端應用程式。

與整合式Windows 驗證搭配使用的 Microsoft Windows NT LAN Manager (NTLM) 驗證程式,包含目的地電腦發出的挑戰,該電腦會傳回用戶端電腦。 當電腦收到它本身所產生的挑戰時,除非連線是回送連線 (例如 IPv4 位址 127.0.0.1) ,否則驗證將會失敗。 HttpWebRequest類別現在預設為指定在 NTLM 驗證程式中使用的服務主體名稱 (SPN) 要求 URL 中使用的主機名稱。

建議的修改:您可以提供自訂 SPN,以在驗證期間使用 URI 所編制索引的字串字典。 此字典是使用 System.Net.AuthenticationManager.CustomTargetNameDictionary屬性取得。 您也可以新增下列登錄設定,以將名稱對應至回送連線:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0\BackConnectionHostNames

CDOSYS

System.Web.Mail命名空間中的 類別依賴共同作業資料物件 for Windows 2000 元件,在下一版的 Windows (Windows 7) 中將無法使用。 因此,在 Windows 7 中使用這些類別將會擲回 PlatformNotSupportedException

建議的修改:.NET Framework 2.0 版中已淘汰 System.Web.Mail。 請改用System.Net.Mail命名空間中的 郵件支援。

ASP.NET 要求驗證

ASP.NET 要求驗證現在包含檢查左角括弧和問號字元序列: <?

Su ggested Modifications:此變更的影回應該很小,因為通常沒有理由將 XML 批註包含在 Cookie 變數的查詢字串中。

URL 驗證

ASP.NET 現在會從 ASP.NET 網頁存取時驗證 URL 的部分。 不過,使用 URL 重寫時,可以使用Request.RawUrl屬性存取頁面上 舊版的 URL。

建議的修改:視需要停用頁面上的驗證。

會話狀態

會話狀態提供者應該實作System.Web.SessionState.SessionStateStoreProviderBase類別上 定義的所有成員,包括 CreateUninitializedItem方法。 不過,只有在網站正在使用無 Cookie 會話狀態時,才會呼叫這個方法。 未使用無 Cookie 會話狀態的開發人員不需要在自訂提供者中實作 CreateUninitializedItem

隨著 .NET Framework 3.5 SP1 的發行,使用 Cookie 會話狀態時,現在也可以呼叫CreateUninitializedItem方法。

建議的修改:在自訂提供者中實作 CreateUninitializedItem 。 判斷指定的會話識別碼是否已存在「即時」專案。 如果專案不存在,提供者應該為會話識別碼建立專案。

URL 編碼

ASP.NET 現在會展開輸出 HTTP 標頭的 URL 編碼,以包含刪除字元 (7F) ,以及除了水準索引標籤 () 以外的所有 ASCII 控制字元。

建議的修改:如有需要,您可以關閉預設標頭編碼行為,如下所示:

<httpRuntime enableHeaderChecking="true|false" />

IIS 上的 DefaultHTTPHandler

雖然整合模式應用程式的System.Web.DefaultHTTPHandler類別在 IIS 7.0 中已過時,但仍可使用。 它現在會擲回 PlatformNotSupported 例外狀況

建議的修改:變更應用程式組態,以在整合模式中正常運作。

伺服器和用戶端編號格式一致性

Number.localeFormat函式 (在用戶端上執行的格式行為 ,) 現在符合 在伺服器) 上執行的String.Format方法 (。 例如,下列程式碼會傳 1000.00% 回 :

String.Format("{0:p2}", 10)

在 .NET Framework 3.5 SP1 之前,下列程式碼會傳回 10.00%

String.localeFormat("{0:p2}", 10)

現在, localeFormat 會傳 1000.00% 回 。

不需要修改。

ASP.NET 隱藏欄位

隱藏的 ASP.NET 欄位,例如 VIEWSTATE,現在會在轉譯任何控制項之前轉譯在 頂 <form /> 端。

建議的修改:我需要,您可以將新的 renderAllHiddenFieldsAtTopOfForm 屬性設定為 false 來關閉此行為:

  <pages renderAllHiddenFieldsAtTopOfForm="false" />

預設值為 true。

Windows Presentation Foundation (WPF)

BitmapEffect 類別已過時

System.Windows.Media.Effects.BitmapEffect類別及其衍生類別 (BevelBitmapEffectBitmapEffectGroupBlurBitmapEffectDropShadowBitmapEffectEmbossBitmapEffectOuterGlowBitmapEffect) 現在已過時。

建議的修改:停止使用舊版BitmapEffect和衍生類別,並改用衍生自 EffectBlurEffectDropShadowEffectShaderEffect的新類別。

 您也可以從 ShaderEffect衍生來建立自己的效果。

元件名稱變更

包含 WPF 核心轉譯層的元件已從 milcore.dll 重新命名為 wpfgfx_v0300.dll。 此元件從未有任何公用 API。

不需要修改。

超連結行為

如果使用者將滑鼠游標停留在超連結上,以及使用者按一下該超連結的時間之間,Hyperlink.NavigateUri屬性的值 變更,則會使用游標停留在超連結上時取得的 URI 進行流覽。

不需要修改。

Windows Vista 上處於受保護模式的 Internet Explorer

當 Internet Explorer 在 Windows Vista 上處於受保護模式時,會封鎖來自 DHTML 警示 () 函式的強制回應對話方塊和 HTML 中裝載的 ActiveX 控制項,而不是顯示。 此外,當裝載 HTML 的 WebBrowser控制項或 框架控制項位於 XMAL Browser 應用程式 (XBAP) ,而且 XBAP 會在 HTML 頁面中跨網域載入時,就會擲回例外狀況。

不需要修改。

Value Serializer 類別上的 CanConvertToString 方法

System.Windows.Media.ConvertersSystem.Windows.Media.Media3D.Converters命名空間中值序列化程式類別上的 CanConvertToString方法會擲 ArgumentException,而不是傳回false

不需要修改。

Windows Communication Foundation (WCF) 和 Windows Workflow Foundation (WF)

架構比對

UriTemplateUriTemplateTable類別所使用的 架構比對配置已寬鬆,可接受具有 HTTP 以外配置的基底位址。 現在,當候選 URI 與範本相符時,這些類別都未使用配置或埠號碼。 已新增尾端斜線和預設值的範本支援。

不需要修改。

驗證的安全性改善

當服務在具有混合模式安全性的使用者帳戶下執行時, EndPointIdentity必須具有使用者主體名稱, (UPN) 身分識別。 這在舊版 WCF 中並非必要。

建議的修改:當用戶端設定為使用 SecurityMode.TransportWithMessageCredential設定 (使用 Windows 驗證、UPN 驗證或指紋驗證) 時,請使用 UPN 身分識別建立EndPointAddress類別的 實例,並提供自訂程式碼來處理任何指紋驗證。

事件記錄的部分信任支援

部分信任現在支援有限的事件記錄。 只會將服務啟用錯誤、追蹤失敗和記錄失敗記錄到事件記錄檔。 為了避免將過多訊息寫入事件記錄檔,進程可以記錄的事件數目上限為 5。

不需要修改。

RemoteEndpointMessageProperty 可用性

使用裝載于 IIS 中的 HTTP 時,存取RemoteEndpointMessageProperty類別的 實例取決於目前使用中的要求。  因此,執行單向接收) 時,無法在要求完成 (之後取得。

不需要修改。

注意:為了解決對某些應用程式而言非常重要的晚期中斷問題,Microsoft 計畫提供可能包含在重要Windows Update的 NET Framework 3.5 SP1 更新。 如需此更新的詳細資訊,請參閱 Microsoft 下載中心的.NET Framework 3.5 SP1下載頁面。

另請參閱

.NET Framework 版本和組件資訊