Поделиться через


Изменения в .NET Framework 3.5 с пакетом обновления 1 (SP1)

В этом документе описываются изменения структуры, которые могут быть учтены в приложении или среде при обновлении с .NET Framework версии 3.5 до .NET Framework версии 3.5 с пакетом обновления 1 (SP1).

Изменения происходят по нескольким причинам, включая исправления проблем с продуктами, соответствие стандартам, отзывы клиентов и безопасность. В этом разделе описываются только важные изменения. Дополнительные сведения о новых функциях см. в разделе Новые возможности платформы .NET Framework. Чтобы предоставить отзыв, посетите Центре отзывов о продуктах MSDN.

В следующих разделах описаны изменения, внесенные в .NET Framework версии 3.5 с пакетом обновления 1 (SP1).

Среда CLR

улучшения производительности

Теперь приложения используют защиту от выполнения данных, чтобы предотвратить попытку вставки и выполнения кода из не исполняемых расположений памяти.

Безопасность выполнения управляемого кода (включая сборки MSIL, образы NGen и неуправляемый код) усиливается случайным образом макета адресного пространства (ASLR).

Строго именованные, подписанные сборки больше не должны проверять свои подписи во время загрузки, если они полностью доверенны и загружаются в полностью доверенные домены приложений. Это изменение устраняет избыточные проверки и повышает производительность запуска приложений, которые имеют подписанные сборки, но не установлены в глобальном кэше сборок (GAC).

Приложения, запускаемые из сетевых ресурсов, имеют то же поведение, что и неуправляемые исполняемые файлы и работают в полном доверии в отличие от частичного доверия.

Теперь атрибут StringFreezingAttribute игнорируется. Этот атрибут использовался для создания собственных образов с помощью генератора собственных образов (Ngen.exe).

Встроенный код компилятора JIT значительно улучшен для создания более качественного кода. Однако изменение влинчика влияет на приложения, имеющие классы, созданные с помощью конструкторов, использующих значение перечисления TypeAttributes.BeforeFieldInit. Статическая инициализация этих типов гарантируется за раз до получения доступа к любому из статических полей, но не перед вызовом статического метода или конструктора экземпляра. Точное время вызова конструктора класса может отличаться в .NET Framework версии 3.5 и 3.5 с пакетом обновления 1 (SP1).

Другие изменения компилятора JIT включают изменения в ошибки округления с плавающей запятой и изменения времени завершения.

Никаких изменений не требуется.

ADO.NET

методы CanConvertToString для классов Сериализатора значений

Методы CanConvertToString для классов сериализатора значений в пространстве имен System.Windows.Converters вызывают ArgumentException вместо возврата false.

Методы System.Data.SqlClient.SQLDataReader.GetString и oth er Get вызывают InvalidCastException, если данные не могут быть приведены в запрашиваемый тип. Теперь сообщения включают типы, такие как "Не удается привести объект типа System.Decimal" для типа System.String".

Никаких изменений не требуется.

SQLDataReader.GetString в столбцах UDT

Вызов метода SQLDataReader.GetString для столбцов пользовательского типа (UDT) теперь вызывает InvalidCastException вместо сообщения об ошибке "Cast не поддерживается из Byte[] в String.

Никаких изменений не требуется.

C#

запросы по не универсальным коллекциям теперь используют стандартную семантику приведения C#.

В выражениях запроса LINQ через не универсальные коллекции, такие как System.Collections.ArrayList, предложение запроса перезаписывается компилятором, чтобы включить вызов оператора Cast<T>. Приведение<T> преобразует все типы элементов в тип, указанный в предложении from в запросе. Кроме того, в исходной версии Visual C# 2008 оператор Cast<T> также выполняет некоторые преобразования типов значений и пользовательские преобразования. Однако эти преобразования выполняются с помощью класса System.Convert вместо стандартной семантики C#. Эти преобразования также вызывают значительные проблемы с производительностью в определенных сценариях. В Visual C# 2008 с пакетом обновления 1 (SP1) оператор Cast<>> изменяется, чтобы создать исключение 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

В режиме интеграции для служб IIS 7.0 метод HttpServerUtility.TransferRequest неправильно использует метод HTTPResponse.End для остановки родительского запроса. Это приводит к возникновению ThreadAbortException, что может повлиять на производительность для завершения выполнения ответа. В .NET Framework 3.5 с пакетом обновления 1 (SP1) метод TransferRequest теперь завершает родительский запрос с помощью метода HttpApplication.CompleteRequest. Это также завершает текущий запрос корректно путем передачи элемента управления HttpApplication.EndRequest обработчик событий без исключения.

Предлагаемые изменения. Если у вас есть код обработки ошибок, использующий метод TransferRequest, чтобы определить, был ли создан ThreadAbortException, можно удалить этот код из блока catch. (Наконец, блоки будут продолжать выполняться.)

встроенной проверки подлинности Windows

Изменение безопасности влияет на то, как интегрированная проверка подлинности Windows обрабатывается System.Net.HttpWebRequest, System.Net.HttpListener, System.Net.Security.NegotiateStream и связанные классы в пространстве имен System.Net. Это изменение может повлиять на веб-серверы и клиентские приложения, настроенные для использования встроенной проверки подлинности Windows.

Процесс проверки подлинности Microsoft Windows NT LAN Manager (NTLM), используемый с интегрированной проверкой подлинности Windows, включает вызов, выданный конечным компьютером, который отправляется обратно на клиентский компьютер. Когда компьютер получает вызов, который он создал сам, проверка подлинности завершится ошибкой, если подключение не является подключением обратного цикла (например, IPv4-адрес 127.0.0.1). Класс HttpWebRequest теперь используется по умолчанию для указания имени узла, используемого в URL-адресе запроса в имени субъекта-службы (SPN), используемого в процессе проверки подлинности NTLM.

Предлагаемые изменения. Вы можете предоставить пользовательское имя субъекта-службы для использования во время проверки подлинности в словаре строк, индексированных URI. Этот словарь получен с помощью свойства 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 проверка запроса теперь включает проверку левой угловой скобки и последовательности символов вопросительного знака: <?

Su ggested Changes: влияние этого изменения должно быть минимальным, так как обычно не существует причин для включения XML-комментария в строку запроса переменной cookie.

проверки URL-адресов

ASP.NET теперь проверяет части URL-адреса при доступе с ASP.NET страницы. Однако при использовании перезаписи URL-адресов можно получить доступ к старой версии URL-адреса на странице с помощью свойства Request.RawUrl.

Предлагаемые изменения: при необходимости отключите проверку на странице.

состояния сеанса

Ожидается, что поставщики состояний сеансов реализуют все члены, определенные в классе System.Web.SessionStateStoreProviderBase, включая метод createUninitializedItem. Однако этот метод был вызван только в том случае, если состояние сеанса без файлов cookie используется сайтом. Разработчикам, которые не использовали состояние сеанса без файлов cookie, не нужно реализовать CreateUninitializedItem в пользовательском поставщике.

С выпуском .NET Framework 3.5 с пакетом обновления 1 (SP1) метод CreateUninitializedItem теперь может вызываться в определенных обстоятельствах при использовании состояния сеанса cookied.

Предлагаемые изменения. Реализация CreateUninitializedItem в пользовательских поставщиках. Определите, существует ли элемент live для указанного идентификатора сеанса. Если элемент не существует, поставщики должны создать элемент для идентификатора сеанса.

кодировки URL-адресов

ASP.NET теперь расширяет кодировку URL-адресов исходящих заголовков HTTP, чтобы включить символ удаления (7F) и все символы управления ASCII (кроме горизонтальной вкладки).

Предлагаемые изменения. При необходимости можно отключить поведение кодирования заголовков по умолчанию следующим образом:

<httpRuntime enableHeaderChecking="true|false" />

DefaultHTTPHandler в IIS

Хотя класс System.Web.DefaultHTTPHandler для приложений в интегрированном режиме был создан устаревшим модулем в IIS 7.0, его по-прежнему можно использовать. Теперь он создает исключение PlatformNotSupported.

Предложенные изменения. Измените конфигурацию приложения на правильное выполнение в интегрированном режиме.

согласованность сервера и номера клиента

Поведение форматирования функции Number.localeFormat (запуск на клиенте) теперь соответствует методу String.Format (запуск на сервере). Например, следующий код возвращает 1000.00% :

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

Перед .NET Framework 3.5 с пакетом обновления 1 (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, и его производные классы (BevelBitmapEffect, BitmapEffectGroup, BlurBitmapEffect, DropShadowBitmapEffect, EmbossBitmapEffectи OuterGlowBitmapEffect), устарели.

Предложенные изменения. Отмена использования устаревших BitmapEffect и производных классов, а также использование новых классов, производных от Эффект:BlurEffect, DropShadowEffectи ShaderEffect.

 Вы также можете создавать собственные эффекты, исходя из ШейдерEffect.

изменение имени сборки

Сборка, содержащая основной слой отрисовки WPF, была переименована из milcore.dll в wpfgfx_v0300.dll. Эта сборка никогда не имела общедоступных API.

Никаких изменений не требуется.

поведение гиперссылки

Если значение свойства Гиперссылка.NavigateUri изменяется между временем, когда пользователь наведите указатель мыши на гиперссылку и время, когда пользователь щелкает гиперссылку, навигация будет выполняться с помощью URI, полученного при наведении курсора на гиперссылку.

Никаких изменений не требуется.

Internet Explorer в защищенном режиме в Windows Vista

Если Internet Explorer находится в защищенном режиме в Windows Vista, модальные диалоги из оповещений DHTML () функции и элементов ActiveX, размещенных в HTML, блокируются, а не отображаются. Кроме того, если элемент управления WebBrowser или элемент управления Frame, на котором размещен HTML, находится в приложении браузера XMAL (XBAP), а XBAP загружается на HTML-странице, создается исключение.

Никаких изменений не требуется.

методы CanConvertToString для классов сериализатора значений

Методы CanConvertToString для классов сериализатора значений в System.Windows.Media.Converters и System.Windows.Media.Media3D.Converters вызывают ArgumentException вместо возврата false.

Никаких изменений не требуется.

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

сопоставление схемы

Схема сопоставления схем, используемая UriTemplate и классами UriTemplateTable, была расслаблена для принятия базовых адресов с схемами, отличными от HTTP. Теперь ни в некоторых из этих классов не используется схема или номер порта при сопоставлении URI кандидатов с шаблонами. Добавлена поддержка конечных косой черты и значений по умолчанию.

Никаких изменений не требуется.

улучшения безопасности для проверки подлинности

Если служба выполняется под учетной записью пользователя с безопасностью в смешанном режиме, EndPointIdentity должна иметь удостоверение субъекта-пользователя (UPN). Это не было необходимо с более ранними версиями WCF.

Предлагаемые изменения. Если клиент настроен на использование параметра SecurityMode.TransportWithMessageCredential (с помощью проверки подлинности Windows, проверки подлинности имени участника-пользователя или проверки отпечатка), создайте экземпляр класса EndPointAddress с удостоверением участника-пользователя и предоставьте пользовательский код для обработки проверки отпечатков.

поддержка частичного доверия для ведения журнала событий

Частичное доверие теперь поддерживает ограниченное ведение журнала событий. В журнал событий регистрируются только ошибки активации службы, ошибки трассировки и журналы. Чтобы избежать записи чрезмерных сообщений в журнал событий, максимальное количество событий, которые могут быть зарегистрированы процессом, равно 5.

Никаких изменений не требуется.

доступность RemoteEndpointMessageProperty

Доступ к экземпляру класса RemoteEndpointMessageProperty при использовании HTTP, размещенного в СЛУЖБАх IIS, зависит от наличия активного запроса в данный момент.  Поэтому его нельзя получить после завершения запроса (например, при выполнении односторонного получения).

Никаких изменений не требуется.

Примечание. Для решения проблем, критически важных для некоторых приложений, корпорация Майкрософт планирует предоставить обновление net Framework 3.5 с пакетом обновления 1 (SP1), которое может быть включено в важное обновление Windows. Дополнительные сведения об этом обновлении будут доступны на странице скачивания .NET Framework 3.5 с пакетом обновления 1 (SP1) в Центре загрузки Майкрософт.

См. также

сведения о версии и сборке .NET Framework