.NET Framework 3.5 SP1 の変更点

ここでは、.NET Framework Version 3.5 を .NET Framework Version 3.5 Service Pack 1 (SP1) にアップグレードするときに、アプリケーションまたは環境での考慮が必要になる場合がある設計の変更点について説明します。

変更の必要が発生する状況は、製品の問題、標準への準拠、顧客フィードバックおよびセキュリティの調整においていくつか考えられます。 このトピックでは、主な変更点についてのみ説明します。 新機能の詳細については、.NET Framework の新機能に関するページを参照してください。 フィードバックを提供するには、 MSDN 製品フィードバック センターにアクセスしてください。

次のセクションでは、.NET Framework Version 3.5 SP1 で行われた変更について説明します。

共通言語ランタイム

パフォーマンスの向上

データ実行防止が使用されるようになり、非実行可能メモリの場所からのコードの挿入および実行が行われないようにしています。

マネージド コードを実行するためのセキュリティ (MSIL アセンブリ、NGen イメージ、アンマネージド コードなど) が ASLR (Address Space Layout Randomization) によって強化されています。

厳密な名前の署名されたアセンブリは、完全に信頼されている場合には読み込み時に署名を確認する必要がなくなり、完全に信頼されたアプリケーション ドメインに読み込まれます。 この変更によって、冗長なチェックがなくなり、署名されたアセンブリがあるがグローバル アセンブリ キャッシュ (GAC) にはインストールされていないアプリケーションの起動時のパフォーマンスが向上します。

ネットワーク共有から起動されるアプリケーションは、アンマネージ実行可能ファイルと動作は同じで、部分的な信頼ではなく完全に信頼されて動作します。

StringFreezingAttribute 属性が無視されるようになりました。 この属性は、ネイティブ イメージ ジェネレーター (Ngen.exe) を使用してネイティブ イメージを作成するために使用されていました。

Just-In-Time (JIT) コンパイラのインライナは、より高い品質のコードを生成できるように大幅に改善されました。 ただし、インライン化を変更すると、TypeAttributes.BeforeFieldInit 列挙値を使用するコンストラクターでインスタンス化されたクラスを持つアプリケーションに影響します。 これらの種類の静的な初期化は、静的フィールドにアクセスされる前に発生することは保証されていますが、静的メソッドまたは静的インスタンス コンストラクターが呼び出される前に発生することは保証されていません。 クラス コンストラクターが呼び出される正確な時間は、.NET Framework Version 3.5 と .NET Framework Version 3.5 SP1 では異なる場合があります。

その他の JIT コンパイラの変更には、浮動小数点丸め誤差の変更とファイナライザーのタイミングの変更があります。

変更は必要ありません。

ADO.NET

Value Serializer クラスの CanConvertToString メソッド

System.Windows.Converters 名前空間の値シリアライザー クラスの CanConvertToString メソッドは、false を返す代わりに ArgumentException をスローします。

要求されている型にデータをキャストできない場合、System.Data.SqlClient.SQLDataReader.GetString メソッドと oth er Get メソッドは InvalidCastException をスローします。 次のようなメッセージが含まれるようになりました。"型 'System.Decimal' のオブジェクトを型 'System.String' にキャストできません。"

変更は必要ありません。

UDT 列の SQLDataReader.GetString

ユーザー定義型 (UDT) 列で SQLDataReader.GetString メソッドを呼び出すと、"Cast is not supported from Byte[] to String" というエラー メッセージではなく InvalidCastException がスローされるようになりました。

変更は必要ありません。

C#

非ジェネリック コレクションに対するクエリで、標準の C# キャスト セマンティクスが使用されるようになりました。

System.Collections.ArrayList などの非ジェネリック コレクションに対する LINQ クエリ式では、クエリの from 句がコンパイラによって書き換えられ、Cast<T> 演算子の呼び出しが含まれます。 キャスト<T> は、すべての要素型をクエリの from 句で指定された型に変換します。 さらに、Visual C# 2008 の元のリリース バージョンでは、Cast<T> 演算子は値型変換とユーザー定義変換も実行します。 ただし、これらの変換は、標準の C# セマンティクスではなく System.Convert クラスを使用して実行されます。 また、これらの変換は特定のシナリオでは重大なパフォーマンス上の問題の原因となります。 Visual C# 2008 SP1 では、数値型とユーザー定義変換に対して InvalidCastException をスローするように Cast<T> 演算子が変更されています。 この変更によって、標準ではない 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 統合モード

インターネット インフォメーション サービス (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.HttpWebRequest、System.Net.HttpListenerSystem.Net.Security.NegotiateStreamおよび System.Net 名前空間の関連クラスによって統合されたWindows 認証がどのように処理されるかに影響します。 この変更は、統合 Windows 認証を使用するように構成されている Web サーバーおよびクライアント アプリケーションに影響を与える可能性があります。

統合 Windows 認証で使用される Microsoft Windows NTLM (NT LAN Manager) 認証プロセスには、クライアント コンピューターに送り返される、ターゲット コンピューターによって発行されるチャレンジが含まれています。 コンピューター自体が生成したチャレンジをコンピューターが受け取った場合、接続がループ バック接続 (たとえば、IPv4 アドレス 127.0.0.1) でない限り、認証は失敗します。 HttpWebRequest クラスは、NTLM 認証プロセスで使用されるサービス プリンシパル名 (SPN) の要求 URL で使用されるホスト名を既定で指定するようになりました。

推奨される変更: URI でインデックス付けされている文字列のディクショナリに対する認証中に使用するカスタム SPN を指定できます。 このディクショナリは、System.Net.AuthenticationManager.CustomTargetNameDictionary プロパティを使用して取得されます。 また、次のレジストリ設定を追加して、名前をループ バック接続にマップできます。

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

Cdosys

System.Web.Mail 名前空間のクラスは、Windows 2000 コンポーネントのコラボレーション データ オブジェクトに依存します。これは、次のバージョンの Windows (Windows 7) では使用できません。 その結果、Windows 7 でこれらのクラスを使用すると、 PlatformNotSupportedException がスローされます。

推奨される変更: System.Web.Mail は、.NET Framework バージョン 2.0 では非推奨となりました。 代わりに、System.Net.Mail 名前空間のメール サポートを使用してください。

ASP.NET 要求の検証

ASP.NET 要求の検証に、左山かっこと疑問符の文字シーケンスのチェックが含まれるようになりました。 <?

推奨される変更: 通常、XML コメントがクッキー変数のクエリ文字列に含まれる理由はないため、この変更の影響は最小限になります。

URL の検証

ASP.NET は ASP.NET ページからアクセスされた場合、URL の一部を検証するようになりました。 ただし、URL の書き換えを使用する場合は、Request.RawUrl プロパティを使用して、ページ上の古いバージョンの URL にアクセスできます。

推奨される変更: 必要に応じて、ページの検証を無効にします。

セッションの状態

セッション状態プロバイダーは、CreateUninitializedItem メソッドを含め、System.Web.SessionState.SessionStateStoreProviderBase クラスで定義されているすべてのメンバーを実装する必要があります。 ただし、このメソッドは、サイトでクッキーなしのセッション状態が使用中である場合にのみ呼び出されました。 Cookie レス セッション状態を使用しなかった開発者は、 CreateUninitializedItem をカスタム プロバイダーに実装する必要はありませんでした。

.NET Framework 3.5 SP1 のリリースでは、Cookie セッション状態が使用されている特定の状況でも CreateUninitializedItem メソッドを呼び出すようになりました。

推奨される変更: カスタム プロバイダーに CreateUninitializedItem を 実装します。 指定したセッション ID に対して "ライブ" 項目が既に存在するかどうかを確認します。 項目が存在しない場合は、プロバイダーによってセッション ID の項目が作成される必要があります。

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)

3.5 SP1 .NET Framework前に、次のコードは を返 10.00% します。

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

次に、 localeFormat は を返します 1000.00%

変更は必要ありません。

非表示フィールドの ASP.NET

VIEWSTATE などの非表示の ASP.NET フィールドは、コントロールをレンダリングする前に、 <form /> の上部にレンダリングされるようになりました。

推奨される変更: 必要に応じて、新しい renderAllHiddenFieldsAtTopOfForm 属性を false に設定することで、この動作をオフにすることができます。

  <pages renderAllHiddenFieldsAtTopOfForm="false" />

既定値は、true です。

Windows Presentation Foundation (WPF)

BitmapEffect クラスは廃止されました

System.Windows.Media.Effects.BitmapEffect クラスとその派生クラス (BevelBitmapEffectBitmapEffectGroupBlurBitmapEffectDropShadowBitmapEffectEmbossBitmapEffectOuterGlowBitmapEffect) は廃止されました。

推奨される変更: 従来の BitmapEffect クラスと派生クラスの使用を中止し、代わりに Effect:BlurEffectDropShadowEffectShaderEffect から派生した新しいクラスを使用します。

 ShaderEffect から派生して独自の効果を作成することもできます。

アセンブリ名の変更

WPF のコア レンダリング レイヤーを含むアセンブリの名前が milcore.dll から wpfgfx_v0300.dll に変更されました。 このアセンブリにはパブリック API がありません。

変更は必要ありません。

ハイパーリンクの動作

Hyperlink.NavigateUri プロパティの値が、ユーザーがハイパーリンクの上にマウス カーソルを置いたときと、ユーザーがそのハイパーリンクをクリックした時刻の間に変更された場合、カーソルがハイパーリンクの上にカーソルを置いたときに取得された URI を使用してナビゲーションが行われます。

変更は必要ありません。

Windows Vista の保護モードでのインターネット エクスプローラー

Windows Vista でインターネット エクスプローラーが保護モードの場合、DHTML アラート () 関数と HTML でホストされている ActiveX コントロールからのモーダル ダイアログは、表示されるのではなくブロックされます。 さらに、HTML をホストする WebBrowser コントロールまたは Frame コントロールが XMAL ブラウザー アプリケーション (XBAP) にあり、XBAP が HTML ページにクロスドメインで読み込まれると、例外がスローされます。

変更は必要ありません。

Value Serializer クラスの CanConvertToString メソッド

System.Windows.Media.Converters 名前空間と System.Windows.Media.Media3D.Converters 名前空間の値シリアライザー クラスの CanConvertToString メソッドは、false を返す代わりに ArgumentException をスローします。

変更は必要ありません。

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

スキーマの一致

UriTemplate クラスとUriTemplateTable クラスで使用されるスキーマ 一致スキームは、HTTP 以外のスキームでベース アドレスを受け入れるように緩和されています。 現在は、候補となる URI をテンプレートと照合する場合、これらのクラスのどちらもスキームやポート番号を使用しません。 末尾のスラッシュと既定値のテンプレート サポートが追加されました。

変更は必要ありません。

認証のセキュリティの強化

混合モードのセキュリティを持つユーザー アカウントでサービスが実行されている場合、 EndPointIdentity にはユーザー プリンシパル名 (UPN) ID が必要です。 これは以前のバージョンの WCF では不要でした。

推奨される変更: クライアントが SecurityMode.TransportWithMessageCredential 設定 (Windows 認証、UPN 認証、または拇印認証を使用) を使用するように設定されている場合は、UPN ID を使用して EndPointAddress クラスのインスタンスを作成し、拇印検証を処理するカスタム コードを提供します。

イベント ログの部分信頼のサポート

部分信頼は限定されたイベント ログをサポートするようになりました。 イベント ログには、サービス アクティベーション エラー、トレース エラー、およびログ エラーのみが記録されます。 イベント ログに過剰なメッセージが書き込まれないようにするため、プロセスでログに記録できるイベントの最大数は 5 つです。

変更は必要ありません。

RemoteEndpointMessageProperty の可用性

IIS でホストされている HTTP を使用する場合に RemoteEndpointMessageProperty クラスのインスタンスにアクセスすることは、現在アクティブな要求があることによって異なります。  したがって、要求が完了した後 (たとえば、一方向の受信を実行する場合) は取得できません。

変更は必要ありません。

メモ:一部のアプリケーションで重要だった遅延の問題に対処するために、Microsoft は重要なWindows Updateに含まれる可能性がある NET Framework 3.5 SP1 の更新プログラムを提供する予定です。 この更新プログラムの詳細については、Microsoft ダウンロード センターの .NET Framework 3.5 SP1 ダウンロード ページを参照してください。

参照

.NET Framework のバージョンとアセンブリ情報