다음을 통해 공유


.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 열거형 값을 사용하는 생성자로 클래스가 인스턴스화된 애플리케이션에 영향을 줍니다. 이러한 형식의 정적 초기화는 정적 필드에 액세스하기 전에 한 번에 발생하지만 정적 메서드 또는 인스턴스 생성자가 호출되기 전에는 발생하지 않습니다. 클래스 생성자가 호출되는 정확한 시간은 .NET Framework 버전 3.5 및 3.5 SP1에서 다를 수 있습니다.

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

수정할 필요가 없습니다.

ADO.NET

Value Serializer 클래스의 CanConvertToString 메서드

System.Windows.Converters 네임스페이스의 값 직렬 변환기 클래스에 대한 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.NegotiateStreamSystem.Net 네임스페이스의 관련 클래스에서 Windows 통합 인증을 처리하는 방법에 영향을 줍니다. 이러한 변경은 Windows 통합 인증을 사용하도록 구성된 웹 서버 및 클라이언트 애플리케이션에 영향을 미칠 수 있습니다.

Windows 통합 인증과 함께 사용되는 Microsoft Windows NTLM(NTLM) 인증 프로세스에는 클라이언트 컴퓨터로 다시 전송되는 대상 컴퓨터에서 발급한 문제가 포함됩니다. 컴퓨터가 자체 생성한 챌린지를 받으면 연결이 루프 백 연결(예: 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(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.SessionState.SessionStateStoreProviderBase 클래스에 정의된 모든 멤버를 구현해야 합니다. 그러나 이 메서드는 사이트에서 쿠키 없는 세션 상태를 사용 중인 경우에만 호출되었습니다. 쿠키 없는 세션 상태를 사용하지 않은 개발자는 사용자 지정 공급자에서 createUninitializedItem 구현할 필요가 없었습니다.

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

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

URL 인코딩

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

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

<httpRuntime enableHeaderChecking="true|false" />

IIS DefaultHTTPHandler

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

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

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

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

이제 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 및 파생 클래스를 사용하지 않고 대신 효과파생된 새 클래스인BlurEffect, DropShadowEffectShaderEffect사용합니다.

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

어셈블리 이름 변경

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

수정할 필요가 없습니다.

하이퍼링크 동작

Hyperlink.NavigateUri 속성의 값이 사용자가 하이퍼링크 위로 마우스 커서를 가져가는 시간과 사용자가 하이퍼링크를 클릭하는 시간 사이에 변경되는 경우 커서가 하이퍼링크를 마우스로 가리킬 때 가져온 URI를 사용하여 탐색이 수행됩니다.

수정할 필요가 없습니다.

Windows Vista 보호 모드에서 Internet Explorer

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

수정할 필요가 없습니다.

Value Serializer 클래스 CanConvertToString 메서드

CanConvertToString은 System.Windows.Media.ConvertersSystem.Windows.Media.Media3D.Converters 네임스페이스의 값 직렬 변환기 클래스에 대한 메서드를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 클래스의 인스턴스를 만들고 지문 확인을 처리하는 사용자 지정 코드를 제공합니다.

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

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

수정할 필요가 없습니다.

remoteEndpointMessageProperty 가용성

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

수정할 필요가 없습니다.

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

참고 항목

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