.NET Framework 3.5 SP1의 변경 내용

이 문서에서는 .NET Framework 버전 3.5에서 .NET Framework 버전 3.5 SP1(서비스 팩 1)으로 업그레이드할 때 애플리케이션 또는 환경에서 고려해야 할 수 있는 디자인 변경 사항에 대해 설명합니다.

제품 문제 수정, 표준 규정 준수, 고객 피드백 및 보안을 비롯한 여러 가지 이유로 변경이 발생합니다. 이 항목에서는 주목할 만한 변경 내용에 대해서만 설명합니다. 새 기능에 대한 자세한 내용은 .NET Framework 의 새로운 기능을 참조하세요. 피드백을 제공하려면 MSDN 제품 피드백 센터를 방문하세요.

다음 섹션에서는 .NET Framework 버전 3.5 SP1의 변경 내용에 대해 설명합니다.

공용 언어 런타임

성능 향상

이제 애플리케이션은 데이터 실행 방지를 사용하여 실행 불가능한 메모리 위치에서 코드를 삽입하고 실행하려는 시도를 방지합니다.

관리 코드 실행(MSIL 어셈블리, NGen 이미지 및 관리되지 않는 코드 포함)에 대한 보안은 ASLR(주소 공간 레이아웃 임의화)에 의해 강화됩니다.

강력한 이름의 서명된 어셈블리는 완전히 신뢰할 수 있고 완전히 신뢰할 수 있는 애플리케이션 도메인에 로드되는 경우 로드 시 서명을 더 이상 검사할 필요가 없습니다. 이렇게 변경하면 중복 검사가 제거되고 서명된 어셈블리가 있지만 GAC(전역 어셈블리 캐시)에 설치되지 않은 애플리케이션의 시작 성능이 향상됩니다.

네트워크 공유에서 시작된 애플리케이션은 관리되지 않는 실행 파일과 동일한 동작을 가지며 부분 신뢰가 아닌 완전 신뢰로 작동합니다.

이제 StringFreezingAttribute 특성이 무시됩니다. 이 특성은 네이티브 이미지 생성기(Ngen.exe)를 사용하여 네이티브 이미지를 만드는 데 사용되었습니다.

JIT(Just-In-Time) 컴파일러의 인라이너가 훨씬 개선되어 더 나은 품질 코드를 생성합니다. 그러나 인라이너를 변경하면 TypeAttributes.BeforeFieldInit 열거형 값을 사용하는 생성자로 인스턴스화된 클래스가 있는 애플리케이션에 영향을 줍니다. 이러한 형식의 정적 초기화는 정적 필드에 액세스하기 전에 한 번에 발생하지만 정적 메서드 또는 instance 생성자가 호출되기 전에는 발생하지 않습니다. 클래스 생성자가 호출되는 정확한 시간은 .NET Framework 버전 3.5 및 3.5 SP1에서 다를 수 있습니다.

다른 JIT 컴파일러 변경 내용에는 부동 소수점 반올림 오류에 대한 변경 내용과 종료자 타이밍 변경이 포함됩니다.

수정이 필요하지 않습니다.

ADO.NET

Value Serializer 클래스의 CanConvertToString 메서드

System.Windows.Converters 네임스페이스의 값 serializer 클래스에 있는 CanConvertToString 메서드는 false를 반환하는 대신 ArgumentException을 throw 합니다.

데이터를 요청되는 형식으로 캐스팅할 수 없는 경우 System.Data.SqlClient.SQLDataReader.GetString 및 oth er Get 메서드는 InvalidCastException을 throw 합니다. 이제 메시지에는 "'System.Decimal' 형식의 개체를 'System.String' 형식으로 캐스팅할 수 없습니다."와 같은 형식이 포함됩니다.

수정이 필요하지 않습니다.

UDT 열의 SQLDataReader.GetString

이제 UDT(사용자 정의 형식) 열에서 SQLDataReader.GetString 메서드를 호출하면 "Cast는 Byte[]에서 String으로 지원되지 않습니다."라는 오류 메시지 대신 InvalidCastException이 throw됩니다.

수정이 필요하지 않습니다.

C#

제네릭이 아닌 컬렉션에 대한 쿼리는 이제 표준 C# 캐스트 의미 체계를 사용합니다.

System.Collections.ArrayList와 같은 제네릭이 아닌 컬렉션에 대한 LINQ 쿼리 식에서 쿼리의 from 절은 Cast<T> 연산자에 대한 호출을 포함하도록 컴파일러에 의해 다시 작성됩니다. Cast<T> 는 모든 요소 형식을 쿼리의 from 절에 지정된 형식으로 변환합니다. 또한 Visual C# 2008의 원래 릴리스 버전에서 Cast<T> 연산자는 일부 값 형식 변환 및 사용자 정의 변환도 수행합니다. 그러나 이러한 변환은 표준 C# 의미 체계 대신 System.Convert 클래스를 사용하여 수행됩니다. 또한 이러한 변환은 특정 시나리오에서 중요한 성능 문제를 일으킵니다. Visual C# 2008 SP1에서 Cast<T> 연산자는 숫자 값 형식 및 사용자 정의 변환에 대한 InvalidCastException을 throw하도록 수정됩니다. 이 변경으로 비표준 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 쿼리를 수행하는 코드가 있고 해당 코드가 예외를 throw하는 경우 쿼리하는 컬렉션의 요소 형식과 일치하도록 쿼리 식의 형식을 변경합니다. 요소에서 값 형식 또는 사용자 정의 변환을 수행해야 하는 경우 다음 예제와 같이 쿼리를 실행할 때 이 작업을 수행할 수 있습니다.

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 가 throw 되어 응답 실행을 종료하는 성능에 영향을 줄 수 있습니다. .NET Framework 3.5 SP1에서 TransferRequest 메서드는 이제 HttpApplication.CompleteRequest 메서드를 사용하여 부모 요청을 종료합니다. 또한 예외를 throw하지 않고 HttpApplication.EndRequest 이벤트 처리기에 제어 를 전송하여 현재 요청을 정상적으로 종료합니다.

제안된 수정 사항: TransferRequest 메서드를 사용하여 ThreadAbortException 이 throw되었는지 여부를 확인하는 오류 처리 코드가 있는 경우 catch 블록에서 해당 코드를 제거할 수 있습니다. (마지막으로 블록은 계속 실행됩니다.)

Windows 통합 인증

보안 변경은 System.Net.HttpWebRequest, System.Net.HttpListener, System.Net.Security.NegotiateStream 및 System.Net 네임스페이스의 관련 클래스에서 통합 Windows 인증 처리하는 방법에 영향을 줍니다. 이 변경 내용은 통합 Windows 인증 사용하도록 구성된 웹 서버 및 클라이언트 애플리케이션에 영향을 미칠 수 있습니다.

통합 Windows 인증 사용하는 Microsoft NTLM(Windows NT LAN Manager) 인증 프로세스에는 클라이언트 컴퓨터로 다시 전송되는 대상 컴퓨터에서 발급한 문제가 포함됩니다. 컴퓨터가 자체적으로 생성한 챌린지를 받으면 연결이 루프 백 연결(예: 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 네임스페이스의 클래스는 다음 버전의 Windows(Windows 7)에서 사용할 수 없는 Windows 2000 구성 요소에 대한 협업 데이터 개체를 사용합니다. 따라서 Windows 7에서 이러한 클래스를 사용하면 PlatformNotSupportedException 가 throw 됩니다.

제안된 수정 사항: System.Web.Mail은 .NET Framework 버전 2.0에서 더 이상 사용되지 않습니다. 대신 System.Net.Mail 네임스페이 스에서 메일 지원을 사용합니다.

ASP.NET 요청 유효성 검사

ASP.NET 요청 유효성 검사에는 이제 왼쪽 꺾쇠 괄호 및 물음표 문자 시퀀스에 대한 확인이 포함됩니다. <?

Su ggested 수정: 일반적으로 XML 주석이 쿠키 변수의 쿼리 문자열에 포함될 이유가 없으므로 이 변경의 영향을 최소화해야 합니다.

URL 유효성 검사

이제 ASP.NET ASP.NET 페이지에서 액세스할 때 URL의 일부의 유효성을 검사합니다. 그러나 URL 다시 쓰기를 사용하는 경우 Request.RawUrl 속성을 사용하여 페이지의 이전 버전의 URL에 액세스할 수 있습니다.

제안된 수정 사항: 필요한 경우 페이지에서 유효성 검사를 사용하지 않도록 설정합니다.

세션 상태

세션 상태 공급자는 CreateUninitializedItem 메서드를 포함하여 System.Web.SessionState.SessionStateStoreProviderBase 클래스에 정의된 모든 멤버를 구현해야 합니다. 그러나 이 메서드는 사이트에서 쿠키 없는 세션 상태를 사용하는 경우에만 호출되었습니다. 쿠키 없는 세션 상태를 사용하지 않은 개발자는 사용자 지정 공급자에서 CreateUninitializedItem 을 구현할 필요가 없었습니다.

.NET Framework 3.5 SP1이 릴리스되면 이제 쿠키 세션 상태가 사용되는 특정 상황에서 CreateUninitializedItem 메서드를 호출할 수도 있습니다.

제안된 수정 사항: 사용자 지정 공급자에서 CreateUninitializedItem 을 구현합니다. 지정된 세션 ID에 대한 "라이브" 항목이 이미 있는지 확인합니다. 항목이 없는 경우 공급자는 세션 ID에 대한 항목을 만들어야 합니다.

URL 인코딩

이제 ASP.NET 삭제 문자(7F) 및 모든 ASCII 컨트롤 문자(가로 탭 제외)를 포함하도록 아웃바운드 HTTP 헤더의 URL 인코딩을 확장합니다.

제안된 수정 사항: 필요한 경우 다음과 같이 기본 헤더 인코딩 동작을 해제할 수 있습니다.

<httpRuntime enableHeaderChecking="true|false" />

IIS의 기본HTTPHandler

통합 모드 애플리케이션에 대한 System.Web.DefaultHTTPHandler 클래스가 IIS 7.0에서 사용되지 않는 모듈로 만들어졌지만 여전히 사용할 수 있었습니다. 이제 PlatformNotSupported 예외가 throw됩니다 .

제안된 수정 사항: 통합 모드에서 제대로 작동하도록 애플리케이션 구성을 변경합니다.

서버 및 클라이언트 번호 서식 일관성

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입니다.

WPF(Windows Presentation Foundation)

BitmapEffect 클래스는 사용되지 않습니다.

System.Windows.Media.Effects.BitmapEffect 클래스 및 파생 클래스(BevelBitmapEffect, BitmapEffectGroup, BlurBitmapEffect, DropShadowBitmapEffect, EmbossBitmapEffectOuterGlowBitmapEffect)는 이제 사용되지 않습니다.

제안된 수정: 레거시 BitmapEffect 및 파생 클래스 사용을 중단하고 대신 Effect:BlurEffect, DropShadowEffectShaderEffect에서 파생된 새 클래스를 사용합니다.

 ShaderEffect에서 파생하여 고유한 효과를 만들 수도 있습니다.

어셈블리 이름 변경

WPF의 핵심 렌더링 계층을 포함하는 어셈블리의 이름이 milcore.dll wpfgfx_v0300.dll 바뀌었습니다. 이 어셈블리에는 공용 API가 없었습니다.

수정이 필요하지 않습니다.

하이퍼링크 동작

Hyperlink.NavigateUri 속성의 값이 사용자가 하이퍼링크를 통해 마우스 커서를 가져간 시간과 사용자가 하이퍼링크를 클릭하는 시간 사이에 변경되는 경우 커서가 하이퍼링크를 마우스로 가리킨 경우 가져온 URI를 사용하여 탐색이 발생합니다.

수정이 필요하지 않습니다.

Windows Vista의 보호 모드에서 인터넷 Explorer

Windows Vista에서 인터넷 Explorer 보호 모드에 있는 경우 DHTML 경고() 함수 및 HTML에서 호스트되는 ActiveX 컨트롤의 모달 대화 상자가 표시되지 않고 차단됩니다. 또한 HTML을 호스트하는 WebBrowser 컨트롤 또는 프레임 컨트롤이 XBAP(XMAL 브라우저 애플리케이션)에 있고 XBAP가 HTML 페이지에서 도메인 간 로드되면 예외가 throw됩니다.

수정이 필요하지 않습니다.

Value Serializer 클래스의 CanConvertToString 메서드

System.Windows.Media.Converters 및 System.Windows.Media.Media3D.Converters 네임스페이스의 값 직렬 변환기 클래스 에 대한 CanConvertToString 메서드는 false를 반환하는 대신 ArgumentException을 throw 합니다.

수정이 필요하지 않습니다.

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

스키마 일치

UriTemplateUriTemplateTable 클래스에서 사용하는 스키마 일치 체계는 HTTP 이외의 스키마를 사용하여 기본 주소를 허용하도록 완화되었습니다. 이제 후보 URI를 템플릿에 일치시키는 경우 이러한 클래스 중 어느 것도 스키마 또는 포트 번호를 사용하지 않습니다. 후행 슬래시 및 기본값에 대한 템플릿 지원이 추가되었습니다.

수정이 필요하지 않습니다.

인증에 대한 보안 개선 사항

서비스가 혼합 모드 보안 이 있는 사용자 계정으로 실행되는 경우 EndPointIdentity에는 UPN(사용자 계정 이름) ID가 있어야 합니다. 이전 버전의 WCF에서는 필요하지 않았습니다.

제안된 수정 사항: 클라이언트가 SecurityMode.TransportWithMessageCredential 설정(Windows 인증, UPN 인증 또는 지문 인증 사용)을 사용하도록 설정된 경우 UPN ID를 사용하여 EndPointAddress 클래스의 instance 만들고 지문 확인을 처리하는 사용자 지정 코드를 제공합니다.

이벤트 로깅에 대한 부분 신뢰 지원

부분 신뢰는 이제 제한된 이벤트 로깅을 지원합니다. 서비스 활성화 오류, 추적 오류 및 로깅 오류만 이벤트 로그에 기록됩니다. 이벤트 로그에 과도한 메시지를 쓰지 않도록 하려면 프로세스에서 기록할 수 있는 최대 이벤트 수는 5개입니다.

수정이 필요하지 않습니다.

RemoteEndpointMessageProperty 가용성

IIS에서 호스트되는 HTTP를 사용할 때 RemoteEndpointMessageProperty 클래스의 instance 액세스하는 것은 현재 활성 요청이 있는 것에 따라 달라집니다.  따라서 요청이 완료된 후에는 가져올 수 없습니다(예: 단방향 수신을 수행할 때).

수정이 필요하지 않습니다.

참고: 일부 애플리케이션에 중요한 지연 문제를 해결하기 위해 Microsoft는 중요한 Windows 업데이트 포함될 수 있는 NET Framework 3.5 SP1 업데이트를 제공할 계획입니다. 이 업데이트에 대한 자세한 내용은 Microsoft 다운로드 센터의 .NET Framework 3.5 SP1 다운로드 페이지에서 확인할 수 있습니다.

참고 항목

.NET Framework 버전 및 어셈블리 정보