Bagikan melalui


Perubahan dalam .NET Framework 3.5 SP1

Dokumen ini menjelaskan perubahan desain yang mungkin perlu diperhitungkan di aplikasi atau lingkungan Anda saat Anda meningkatkan dari .NET Framework versi 3.5 ke .NET Framework versi 3.5 Paket Layanan 1 (SP1).

Perubahan terjadi karena beberapa alasan termasuk perbaikan untuk masalah produk, kepatuhan standar, umpan balik pelanggan, dan keamanan. Topik ini hanya menjelaskan perubahan penting. Untuk informasi tentang fitur baru, lihat Apa yang Baru di .NET Framework . Untuk memberikan umpan balik, silakan kunjungi Pusat Umpan Balik Produk MSDN.

Bagian berikut menjelaskan perubahan yang dibuat dalam .NET Framework versi 3.5 SP1.

Runtime Bahasa Umum

Peningkatan Performa

Aplikasi sekarang menggunakan Pencegahan Eksekusi Data untuk mencegah upaya menyisipkan dan menjalankan kode dari lokasi memori yang tidak dapat dieksekusi.

Keamanan untuk eksekusi kode terkelola (termasuk rakitan MSIL, gambar NGen, dan kode yang tidak dikelola) di-bolster oleh Address Space Layout Randomization (ASLR).

Rakitan yang ditandatangani dengan nama kuat tidak perlu lagi memeriksa tanda tangan mereka pada waktu pemuatan asalkan mereka sepenuhnya dipercaya dan dimuat ke dalam domain aplikasi yang sepenuhnya tepercaya. Perubahan ini menghilangkan pemeriksaan redundan dan meningkatkan performa startup aplikasi yang telah menandatangani rakitan tetapi tidak diinstal di Global Assembly Cache (GAC).

Aplikasi yang diluncurkan dari berbagi jaringan memiliki perilaku yang sama dengan executable yang tidak dikelola dan beroperasi dengan kepercayaan penuh dibandingkan dengan kepercayaan parsial.

Atribut StringFreezingAttribute sekarang diabaikan. Atribut ini digunakan untuk membuat gambar asli menggunakan Native Image Generator (Ngen.exe).

Inliner kompilator just-in-time (JIT) telah ditingkatkan secara signifikan untuk menghasilkan kode kualitas yang lebih baik. Namun, mengubah inliner berdampak pada aplikasi yang memiliki kelas yang dibuat dengan konstruktor yang menggunakan nilai enumerasi TypeAttributes.BeforeFieldInit. Inisialisasi statis dari jenis ini dijamin terjadi pada satu waktu sebelum salah satu bidang statis diakses, tetapi tidak sebelum metode statis atau konstruktor instans dipanggil. Waktu yang tepat ketika konstruktor kelas dipanggil dapat berbeda dalam .NET Framework versi 3.5 dan 3.5 SP1.

Perubahan kompilator JIT lainnya termasuk perubahan pada kesalahan pembulatan floating-point dan perubahan waktu finalizer.

Tidak diperlukan modifikasi.

ADO.NET

metode CanConvertToString pada kelas Value Serializer

Metode CanConvertToString pada kelas serializer nilai di System.Windows.Converters namespace melempar ArgumentException alih-alih mengembalikan false.

System.Data.SqlClient.SQLDataReader.GetString dan oth er Dapatkan metode melempar InvalidCastException jika data tidak dapat dilemparkan ke jenis yang diminta. Pesan sekarang menyertakan jenisnya, seperti: "Tidak dapat melemparkan objek jenis 'System.Decimal' untuk mengetik 'System.String'".

Tidak diperlukan modifikasi.

SQLDataReader.GetString pada kolom UDT

Memanggil metode SQLDataReader.GetString pada kolom User Defined Type (UDT) sekarang melempar InvalidCastException alih-alih pesan kesalahan "Cast tidak didukung dari Byte[] ke String".

Tidak diperlukan modifikasi.

C#

Kueri melalui koleksi non-generik sekarang menggunakan semantik cast C# standar.

Dalam ekspresi kueri LINQ atas koleksi non-generik seperti System.Collections.ArrayList , klausul dari kueri ditulis ulang oleh pengkompilasi untuk menyertakan panggilan ke operator Cast<T>. Cast<T> mengonversi semua jenis elemen ke jenis yang ditentukan dalam klausa from dalam kueri. Selain itu, dalam versi rilis asli Visual C# 2008, operator Cast<T> juga melakukan beberapa konversi jenis nilai dan konversi yang ditentukan pengguna. Namun, konversi ini dilakukan dengan menggunakan kelas System.Convert alih-alih semantik C# standar. Konversi ini juga menyebabkan masalah performa yang signifikan dalam skenario tertentu. Di Visual C# 2008 SP1, operator Cast<T> dimodifikasi untuk melempar InvalidCastException untuk jenis nilai numerik dan konversi yang ditentukan pengguna. Perubahan ini menghilangkan semantik pemeran C# non-standar dan masalah performa. Perubahan ini diilustrasikan dalam contoh berikut.

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
    }
}

Modifikasi yang disarankan: Jika Anda memiliki kode yang melakukan kueri LINQ melalui koleksi non-generik, dan kode tersebut sekarang melemparkan pengecualian, ubah jenis ekspresi kueri agar sesuai dengan jenis elemen dalam koleksi yang Anda kueri. Jika Anda perlu melakukan konversi jenis nilai atau yang ditentukan pengguna pada elemen, Anda dapat melakukan ini saat menjalankan kueri, seperti yang ditunjukkan dalam contoh berikut:

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

Mode Terintegrasi IIS

Pada mode Integrasi untuk Internet Information Services (IIS) 7.0, metode HttpServerUtility.TransferRequest salah menggunakan metode HTTPResponse.End untuk menghentikan permintaan induk. Ini menghasilkan ThreadAbortException , yang dapat memengaruhi performa untuk mengakhiri eksekusi respons. Dalam .NET Framework 3.5 SP1, metode TransferRequest sekarang mengakhiri permintaan induk dengan menggunakan metode HttpApplication.CompleteRequest. Ini juga mengakhiri permintaan saat ini dengan baik dengan mentransfer kontrol ke HttpApplication.EndRequest penanganan aktivitas tanpa melemparkan pengecualian.

Modifikasi yang disarankan: Jika Anda memiliki kode penanganan kesalahan yang menggunakan metode TransferRequest untuk menentukan apakah threadAbortException dilemparkan, Anda dapat menghapus kode tersebut dari blok tangkapan. (Akhirnya blok akan terus berjalan.)

autentikasi Windows Terintegrasi

Perubahan keamanan memengaruhi bagaimana autentikasi Windows terintegrasi ditangani oleh System.Net.HttpWebRequest , System.Net.HttpListener , System.Net.Security.NegotiateStream , dan kelas terkait di namespace System.Net. Perubahan ini dapat memengaruhi server Web dan aplikasi klien yang dikonfigurasi untuk menggunakan autentikasi Windows terintegrasi.

Proses autentikasi Microsoft Windows NT LAN Manager (NTLM) yang digunakan dengan autentikasi Windows terintegrasi mencakup tantangan yang dikeluarkan oleh komputer tujuan yang dikirim kembali ke komputer klien. Ketika komputer menerima tantangan yang dihasilkannya sendiri, autentikasi akan gagal kecuali koneksi adalah koneksi loop back (misalnya, alamat IPv4 127.0.0.1). Kelas HttpWebRequest sekarang default untuk menentukan Nama host yang digunakan dalam URL permintaan di Nama Prinsipal Layanan (SPN) yang digunakan dalam proses autentikasi NTLM.

Modifikasi yang Disarankan: Anda dapat menyediakan SPN kustom untuk digunakan selama autentikasi ke kamus string yang diindeks oleh URI. Kamus ini diperoleh dengan properti System.Net.AuthenticationManager.CustomTargetNameDictionary. Anda juga dapat menambahkan pengaturan registri berikut untuk memetakan nama ke koneksi loop back:

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

CDOSYS

Kelas di namespace System.Web.Mail mengandalkan Objek Data Kolaborasi untuk komponen Windows 2000, yang tidak akan tersedia di versi Windows berikutnya (Windows 7). Akibatnya, menggunakan kelas-kelas ini di Windows 7 akan melempar PlatformNotSupportedException .

Modifikasi yang disarankan: System.Web.Mail tidak digunakan lagi dalam .NET Framework versi 2.0. Gunakan dukungan email di namespace System.Net.Mail sebagai gantinya.

validasi permintaan ASP.NET

ASP.NET validasi permintaan sekarang mencakup pemeriksaan tanda kurung sudut kiri dan urutan karakter tanda tanya: <?

Modifikasi su ggested: Dampak perubahan ini harus minimal karena biasanya tidak ada alasan untuk komentar XML disertakan dalam string kueri variabel cookie.

validasi URL

ASP.NET sekarang memvalidasi bagian URL saat diakses dari halaman ASP.NET. Namun, ketika penulisan ulang URL digunakan, dimungkinkan untuk mengakses url versi lama di halaman dengan properti Request.RawUrl .

Modifikasi yang Disarankan: Nonaktifkan validasi pada halaman, jika perlu.

status Sesi

Penyedia status sesi diharapkan untuk mengimplementasikan semua anggota yang ditentukan pada kelas System.Web.SessionState.SessionStateStoreProviderBase , termasuk metode CreateUninitializedItem. Namun, metode ini hanya dipanggil ketika status sesi tanpa cookie sedang digunakan oleh situs. Pengembang yang tidak menggunakan status sesi tanpa cookie tidak perlu menerapkan CreateUninitializedItem di penyedia kustom.

Dengan rilis .NET Framework 3.5 SP1, metode CreateUninitializedItem sekarang juga dapat dipanggil dalam keadaan tertentu ketika status sesi cookie sedang digunakan.

Modifikasi yang disarankan: Terapkan CreateUninitializedItem di penyedia kustom. Tentukan apakah item "langsung" sudah ada untuk ID sesi yang ditentukan. Jika item tidak ada, penyedia harus membuat item untuk ID sesi.

pengodean URL

ASP.NET sekarang memperluas pengodean URL header HTTP keluar untuk menyertakan karakter hapus (7F) dan semua karakter kontrol ASCII (kecuali tab horizontal).

Modifikasi yang Disarankan: Jika diperlukan, Anda dapat menonaktifkan perilaku pengodean header default sebagai berikut:

<httpRuntime enableHeaderChecking="true|false" />

DefaultHTTPHandler di IIS

Meskipun kelas System.Web.DefaultHTTPHandler untuk aplikasi mode terintegrasi dibuat sebagai modul usang di IIS 7.0, masih mungkin digunakan. Sekarang memberikan pengecualian PlatformNotSupported.

Modifikasi yang Disarankan: Ubah konfigurasi aplikasi agar berfungsi dengan baik dalam mode Terintegrasi.

Server dan konsistensi pemformatan nomor klien

Perilaku pemformatan fungsi Number.localeFormat (berjalan pada klien) sekarang sesuai dengan metode String.Format (berjalan di server). Misalnya, kode berikut mengembalikan 1000.00% :

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

Sebelum .NET Framework 3.5 SP1, kode berikut akan mengembalikan 10.00% :

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

Sekarang, localeFormat mengembalikan 1000.00% .

Tidak diperlukan modifikasi.

ASP.NET bidang tersembunyi

Bidang ASP.NET tersembunyi, sepertiVIEWSTATE , sekarang dirender di bagian atas sebelum merender kontrol apa pun.

Modifikasi yang disarankan: Saya perlu, Anda dapat menonaktifkan perilaku ini dengan mengatur atribut baru renderAllHiddenFieldsAtTopOfForm ke false:

  <pages renderAllHiddenFieldsAtTopOfForm="false" />

Nilai defaultnya adalah true.

Windows Presentation Foundation (WPF)

kelas BitmapEffect usang

Kelas System.Windows.Media.Effects.BitmapEffect, dan kelas turunannya (BevelBitmapEffect, BitmapEffectGroup, BlurBitmapEffect, DropShadowBitmapEffect, EmbossBitmapEffect, dan OuterGlowBitmapEffect), sekarang usang.

Modifikasi yang disarankan: Hentikan penggunaan bitmapEffect warisan dan kelas turunan dan sebaliknya gunakan kelas baru yang berasal dariEfek :BlurEffect, DropShadowEffect, dan ShaderEffect.

 Anda juga dapat membuat efek Anda sendiri dengan berasal dari ShaderEffect.

perubahan nama Rakitan

Rakitan yang berisi lapisan penyajian inti WPF telah diganti namanya dari milcore.dll menjadi wpfgfx_v0300.dll. Rakitan ini belum pernah memiliki API publik.

Tidak diperlukan modifikasi.

perilaku Hyperlink

Jika nilai properti Hyperlink.NavigateUri berubah antara waktu saat pengguna mengarahkan kursor mouse ke hyperlink dan waktu saat pengguna mengklik hyperlink tersebut, navigasi akan terjadi menggunakan URI yang diperoleh saat kursor mengarahkan kursor ke hyperlink.

Tidak diperlukan modifikasi.

Internet Explorer dalam Mode Terlindungi di Windows Vista

Ketika Internet Explorer dalam Mode Terproteksi pada Windows Vista, dialog modal dari fungsi DHTML () fungsi dan kontrol ActiveX yang dihosting dalam HTML diblokir daripada ditampilkan. Selain itu, ketika kontrol WebBrowser atau kontrol Frame menghosting HTML ada di Aplikasi Browser XMAL (XBAP), dan XBAP dimuat lintas domain di halaman HTML, pengecualian dilemparkan.

Tidak diperlukan modifikasi.

metode CanConvertToString pada kelas Value Serializer

Metode CanConvertToString pada kelas serializer nilai di System.Windows.Media.Converters dan System.Windows.Media.Media3D.Converters namespace melemparkan ArgumentException alih-alih mengembalikanpalsu .

Tidak diperlukan modifikasi.

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

pencocokan Skema

Skema pencocokan skema yang digunakan oleh kelas UriTemplate dan UriTemplateTable telah dilonggarkan untuk menerima alamat dasar dengan skema selain HTTP. Sekarang tidak satu pun dari kelas ini menggunakan skema atau nomor port saat mencocokkan URI kandidat dengan templat. Dukungan templat untuk garis miring berikutnya dan nilai default telah ditambahkan.

Tidak diperlukan modifikasi.

Peningkatan keamanan untuk autentikasi

Saat layanan berjalan di bawah akun pengguna dengan keamanan mode campuran, EndPointIdentity harus memiliki identitas nama prinsipal pengguna (UPN). Ini tidak diperlukan dengan versi WCF yang lebih lama.

Modifikasi yang disarankan: Saat klien diatur untuk menggunakan pengaturan SecurityMode.TransportWithMessageCredential (menggunakan autentikasi Windows, autentikasi UPN, atau autentikasi thumbprint), buat instans kelas EndPointAddress dengan identitas UPN dan berikan kode kustom untuk menangani verifikasi thumbprint apa pun.

Dukungan kepercayaan parsial untuk pengelogan peristiwa

Kepercayaan parsial sekarang mendukung pengelogan peristiwa terbatas. Hanya kesalahan aktivasi layanan, kegagalan pelacakan, dan kegagalan pengelogan yang dicatat ke Log Peristiwa. Untuk menghindari penulisan pesan berlebihan ke Log Peristiwa, jumlah maksimum peristiwa yang dapat dicatat oleh proses adalah 5.

Tidak diperlukan modifikasi.

ketersediaan RemoteEndpointMessageProperty

Mengakses instans kelas RemoteEndpointMessageProperty saat menggunakan HTTP yang dihosting di IIS bergantung pada permintaan yang saat ini aktif.  Oleh karena itu, permintaan tidak dapat diperoleh setelah permintaan selesai (misalnya, saat melakukan penerimaan satu arah).

Tidak diperlukan modifikasi.

Catatan: Untuk mengatasi masalah akhir yang sangat penting bagi beberapa aplikasi, Microsoft berencana untuk memberikan pembaruan ke NET Framework 3.5 SP1 yang mungkin disertakan dalam Windows Update penting. Informasi selengkapnya tentang pembaruan ini akan tersedia di halaman unduhan .NET Framework 3.5 SP1 di Pusat Unduhan Microsoft.

Lihat Juga

versi .NET Framework dan Informasi Assembly