Новые возможности .NET Framework

Примечание

.NET Framework 4.8 — это последняя версия .NET Framework. Платформа .NET Framework изменяется ежемесячно с устранением ошибок, связанных с безопасностью и надежностью. Платформа .NET Framework будет по-прежнему включена в состав Windows. Исключать ее не планируется. Переносить приложения .NET Framework не требуется, однако для новых разработок следует использовать платформу .NET 5 или более поздних версий.

В этой статье кратко рассматриваются основные новые возможности и усовершенствования в следующих версиях .NET Framework:

Данная статья не содержит исчерпывающей информации обо всех новых возможностях и может быть изменена. Общие сведения о .NET Framework см. в разделе Начало работы с .NET Framework. Поддерживаемые платформы см. в разделе Требования к системе. Ссылки для загрузки и инструкции по установке см. в разделе Руководство по установке.

Примечание

Команда .NET Framework также выпускает компоненты в виде внештатных выпусков с использованием NuGet для расширения поддержки и введения новых возможностей (таких как неизменяемые коллекции и векторные типы с поддержкой SIMD). Дополнительные сведения см. в разделах Дополнительные библиотеки классов и интерфейсы API и .NET Framework и внештатные выпуски. См. полный список пакетов NuGet для .NET Framework.

Знакомство с платформой .NET Framework 4.8

Версия .NET Framework 4.8 основана на предыдущих выпусках .NET Framework 4.x. Она включает много исправлений и несколько новых функций, а также характеризуется очень стабильной работой.

Загрузка и установка .NET Framework 4.8

Ссылки для скачивания .NET Framework 4.8:

.NET Framework 4.8 можно установить на платформах Windows 10, Windows 8.1 и Windows 7 с пакетом обновления 1 (SP1), а также на соответствующих серверных платформах, начиная с Windows Server 2008 R2 с пакетом обновления 1 (SP1). .NET Framework 4.8 можно установить с помощью веб-установщика или автономного установщика. Для большинства пользователей рекомендуется использовать веб-установщик.

Вы можете использовать .NET Framework 4.8 как целевую платформу в Visual Studio 2012 (или более поздних версиях), установив .NET Framework 4.8 Developer Pack.

Новые возможности .NET Framework 4.8

.NET Framework 4.8 включает новые функции в следующих областях:

Основной акцент в .NET Framework 4.8, как и прежде, сделан на улучшении специальных возможностей, что позволяет приложению предоставлять соответствующие функции целевой аудитории. См. подробнее об улучшениях специальных возможностей в .NET Framework 4.8.

базовых классов;

Ослабление влияния FIPS на шифрование. В предыдущих версиях .NET Framework управляемые классы поставщиков служб шифрования, такие как SHA256Managed, выдавали исключение CryptographicException во время настройки системных библиотек шифрования в режиме FIPS. Это происходит из-за того, что, в отличие от системных библиотек шифрования, сертификация FIPS 140-2 не выполнялась для управляемых версий классов поставщиков служб шифрования. Некоторые разработчики используют виртуальные машины разработки в режиме FIPS, поэтому такие исключения обычно выдаются в рабочих системах.

По умолчанию в приложениях, работающих с .NET Framework 4.8, следующие управляемые криптографические классы больше не вызывают исключение CryptographicException в этом случае:

Вместо этого такие классы перенацеливают криптографические операции на системную библиотеку шифрования. Это изменение эффективно устраняет возможное заблуждение относительно различий между средами разработки и рабочими средами, применяя к собственным и управляемым компонентам одну и ту же политику шифрования. Прежнее поведение приложений, работа которых зависит от этих исключений, можно восстановить, установив для параметра AppContext Switch.System.Security.Cryptography.UseLegacyFipsThrow значение true. См. подробнее об управляемых криптографических классах, которые не вызывают исключение CryptographyException в режиме FIPS.

Использование обновленной версии ZLib

Начиная с .NET Framework 4.5, сборка clrcompression.dll использует ZLib — собственную внешнюю библиотеку для сжатия данных, предоставляя реализацию для алгоритма deflate. В версии .NET Framework 4.8 сборка clrcompression.dll обновлена для поддержки ZLib версии 1.2.11 c несколькими ключевыми улучшениями и исправлениями.

Windows Communication Foundation (WCF)

Знакомство с ServiceHealthBehavior

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

ServiceHealthBehavior — это поведение службы WCF, которое расширяет IServiceBehavior. При добавлении в коллекцию ServiceDescription.Behaviors поведение службы отвечает за следующие действия:

  • Возвращает состояние работоспособности службы с кодами откликов HTTP. Эти коды можно указать в строке запроса для проверки работоспособности HTTP/GET.

  • Публикует сведения о работоспособности службы. Это сведения о службе, включая данные о состоянии службы и емкости, а также счетчики регулирования, можно отобразить с помощью запроса HTTP/GET в строке запроса ?health. Простота доступа к такой информации необходима при устранении неполадок с неправильным поведением службы WCF.

Есть два способа, чтобы предоставить конечную точку работоспособности и опубликовать сведения о работоспособности службы WCF:

  • С помощью кода. Пример:

    ServiceHost host = new ServiceHost(typeof(Service1),
                       new Uri("http://contoso:81/Service1"));
    ServiceHealthBehavior healthBehavior =
        host.Description.Behaviors.Find<ServiceHealthBehavior>();
    healthBehavior ??= new ServiceHealthBehavior();
    host.Description.Behaviors.Add(healthBehavior);
    
    Dim host As New ServiceHost(GetType(Service1),
                New Uri("http://contoso:81/Service1"))
    Dim healthBehavior As ServiceHealthBehavior =
       host.Description.Behaviors.Find(Of ServiceHealthBehavior)()
    If healthBehavior Is Nothing Then
       healthBehavior = New ServiceHealthBehavior()
    End If
    host.Description.Behaviors.Add(healthBehavior)
    
  • С помощью файла конфигурации. Пример:

    <behaviors>
      <serviceBehaviors>
        <behavior name="DefaultBehavior">
          <serviceHealth httpsGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    

Состояние работоспособности службы можно запросить, используя такие параметры запроса, как OnServiceFailure, OnDispatcherFailure, OnListenerFailure, OnThrottlePercentExceeded. При этом код отклика HTTP можно указать для каждого параметра запроса. Если для параметра запроса не указан код отклика HTTP, по умолчанию используется код HTTP 503. Пример:

  • OnServiceFailure: https://contoso:81/Service1?health&OnServiceFailure=450

    Код состояния отклика HTTP 450 возвращается, если значение ServiceHost.State больше чем CommunicationState.Opened.

Параметры запроса и примеры:

  • OnDispatcherFailure: https://contoso:81/Service1?health&OnDispatcherFailure=455

    Код состояния отклика HTTP 455 возвращается, если состояние любого из диспетчеров каналов больше чем CommunicationState.Opened.

  • OnListenerFailure: https://contoso:81/Service1?health&OnListenerFailure=465

    Код состояния отклика HTTP 465 возвращается, если состояние любого из прослушивателей каналов больше чем CommunicationState.Opened.

  • OnThrottlePercentExceeded: https://contoso:81/Service1?health&OnThrottlePercentExceeded= 70:350,95:500

    Указывает процент (1–100), который активирует отклик и соответствующий код отклика HTTP (200–599). В этом примере:

    • Если процент больше чем 95, возвращается код отклика HTTP 500.

    • Если процент находится в диапазоне от 70 до 95, возвращается код 350.

    • В противном случае возвращается код отклика 200.

Состояние работоспособности службы может отображаться в формате HTML (если указана такая строка запроса, как https://contoso:81/Service1?health) или в формате XML (если указана такая строка запроса, как https://contoso:81/Service1?health&Xml). Такая строка запроса, как https://contoso:81/Service1?health&NoContent, возвращает пустую HTML-страницу.

Windows Presentation Foundation (WPF)

Улучшения высокого разрешения

В .NET Framework 4.8 WPF добавлена поддержка DPI для каждого монитора версии 2 и масштабирование DPI в смешанном режиме. См. подробнее о разработке классических приложений с поддержкой высокого разрешения в Windows.

В .NET Framework 4.8 улучшена поддержка взаимодействия между размещенными HWND и Windows Forms в приложениях WPF с поддержкой высокого разрешения на платформах, которые поддерживают масштабирование DPI в смешанном режиме (начиная с обновления Windows 10 за апрель 2018 г.). Элементы управления размещенных HWND или Windows Forms, создаваемые в качестве окон с масштабированием DPI в смешанном режиме путем вызова SetThreadDpiHostingBehavior и SetThreadDpiAwarenessContext, могут размещаться в приложении WPF с поддержкой DPI для каждого монитора версии 2 с правильными размером и масштабом. Такое размещенное содержимое не отображается в собственном высоком разрешении. Вместо этого операционная система масштабирует размещенное содержимое до соответствующего размера. Поддержка режима определения DPI для каждого монитора версии 2 также позволяет размещать элементы управления WPF внутри собственного окна (в качестве дочерних) в приложении с высоким разрешением.

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

<runtime>
   <AppContextSwitchOverrides value = "Switch.System.Windows.DoNotScaleForDpiChanges=false; Switch.System.Windows.DoNotUsePresentationDpiCapabilityTier2OrGreater=false"/>
</runtime>

Среда CLR

Среда выполнения в .NET Framework 4.8 включает следующие новые функции и улучшения:

Улучшения JIT-компилятора. Компилятор Just-in-time (JIT) в .NET Framework 4.8 основан на JIT-компиляторе .NET Core 2.1. Многие оптимизации и все исправления, внесенные в JIT-компилятор .NET Core 2.1, включены в JIT-компилятор .NET Framework 4.8.

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

Сканирование на наличие вредоносных программ для всех сборок. В предыдущих версиях .NET Framework среда выполнения просматривает все сборки, загруженные с диска, с помощью Защитника Windows или стороннего антивредоносного ПО. При этом сборки, загруженные из других источников, например с помощью метода Assembly.Load(Byte[]), не просматриваются, следовательно, они могут содержать не обнаруженное вредоносное ПО. Начиная с .NET Framework 4.8, при выполнении в Windows 10 среда выполнения запускает сканирование с помощью решений для защиты от вредоносных программ, которые реализуют интерфейс сканирования антивредоносного ПО (AMSI).

Новые возможности .NET Framework 4.7.2

.NET Framework 4.7.2 включает новые функции в следующих областях:

Основной акцент в .NET Framework 4.7.2, как и прежде, сделан на улучшении специальных возможностей, что позволяет приложению предоставлять соответствующие функции целевой аудитории. См. подробнее об улучшениях специальных возможностей в .NET Framework 4.7.2.

базовых классов;

В .NET Framework 4.7.2 значительно усовершенствовано шифрование, улучшена поддержка распаковки ZIP-архивов и включена дополнительная коллекция API.

Новые перегрузки RSA.Create и DSA.Create

С помощью методов DSA.Create(DSAParameters) и RSA.Create(RSAParameters) вы можете указывать параметры ключа при создании экземпляра ключа DSA или RSA. Они позволяют заменить код, подобный этому:

// Before .NET Framework 4.7.2
using (RSA rsa = RSA.Create())
{
   rsa.ImportParameters(rsaParameters);
   // Other code to execute using the RSA instance.
}
' Before .NET Framework 4.7.2
Using rsa = RSA.Create()
   rsa.ImportParameters(rsaParameters)
   ' Other code to execute using the rsa instance.
End Using

на код, подобный этому:

// Starting with .NET Framework 4.7.2
using (RSA rsa = RSA.Create(rsaParameters))
{
   // Other code to execute using the rsa instance.
}
' Starting with .NET Framework 4.7.2
Using rsa = RSA.Create(rsaParameters)
   ' Other code to execute using the rsa instance.
End Using

Методы DSA.Create(Int32) и RSA.Create(Int32) позволяют создавать новые ключи DSA или RSA с указанным размером. Пример:

using (DSA dsa = DSA.Create(2048))
{
   // Other code to execute using the dsa instance.
}
Using dsa = DSA.Create(2048)
   ' Other code to execute using the dsa instance.
End Using

Конструкторы Rfc2898DeriveBytes принимают имя хэш-алгоритма

Класс Rfc2898DeriveBytes содержит три новых конструктора с параметром HashAlgorithmName, который определяет алгоритм HMAC для использования при создании производных ключей. Вместо SHA-1 разработчикам следует использовать HMAC на основе SHA-2, например SHA-256, как показано в следующем примере:

private static byte[] DeriveKey(string password, out int iterations, out byte[] salt,
                                out HashAlgorithmName algorithm)
{
   iterations = 100000;
   algorithm = HashAlgorithmName.SHA256;

   const int SaltSize = 32;
   const int DerivedValueSize = 32;

   using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, SaltSize,
                                                             iterations, algorithm))
   {
      salt = pbkdf2.Salt;
      return pbkdf2.GetBytes(DerivedValueSize);
   }
}
Private Shared Function DeriveKey(password As String, ByRef iterations As Integer,
                                  ByRef salt AS Byte(), ByRef algorithm As HashAlgorithmName) As Byte()
   iterations = 100000
   algorithm = HashAlgorithmName.SHA256

   Const SaltSize As Integer = 32
   Const  DerivedValueSize As Integer = 32

   Using pbkdf2 = New Rfc2898DeriveBytes(password, SaltSize, iterations, algorithm)
      salt = pbkdf2.Salt
      Return pbkdf2.GetBytes(DerivedValueSize)
   End Using
End Function

Поддержка временных ключей

При импорте PFX-файла можно загрузить закрытые ключи непосредственно из памяти, минуя жесткий диск.  Если в конструкторе X509Certificate2 или в одной из перегрузок метода X509Certificate2.Import указан новый флаг X509KeyStorageFlags.EphemeralKeySet, закрытые ключи будут загружены в качестве временных ключей. Благодаря этому ключи невидимы на диске. Но:

  • поскольку ключи не сохраняются на диске, сертификаты, загруженные с этим флагом, не являются подходящими кандидатами для добавления в X509Store.

  • Ключи, загруженные таким образом, почти всегда загружаются через Windows CNG. Поэтому вызывающие объекты должны получить закрытый ключ путем вызова методов расширения, таких как cert.GetRSAPrivateKey(). Свойство X509Certificate2.PrivateKey не работает.

  • Поскольку свойство X509Certificate2.PrivateKey из прежних версий не работает с сертификатами, разработчики должны выполнить тщательное тестирование перед переключением на временные ключи.

Программное создание запросов подписи сертификата PKCS#10 и сертификатов открытого ключа X.509

Начиная с версии .NET Framework 4.7.2, рабочие нагрузки могут создавать запросы подписи сертификата (CSR), чтобы запросы на сертификат можно было создавать в существующих средствах. Это бывает удобно при тестировании.

Дополнительные сведения и примеры кода см. в разделе "Программное создание запросов подписи сертификата PKCS#10 и сертификатов открытого ключа X.509" в блоге .NET.

Новые элементы SignerInfo

Начиная с .NET Framework 4.7.2, класс SignerInfo предоставляет дополнительные сведения о подписи. Вы можете извлечь значение свойства System.Security.Cryptography.Pkcs.SignerInfo.SignatureAlgorithm, чтобы определить алгоритм подписи, который использовался подписывающим объектом. Вы можете вызвать SignerInfo.GetSignature, чтобы получить копию криптографической подписи для этого подписывающего объекта.

Упакованный поток остается открытым после удаления CryptoStream

Начиная с .NET Framework 4.7.2, класс CryptoStream имеет дополнительный конструктор, благодаря которому Dispose не закрывает упакованный поток.  Чтобы оставить упакованный поток открытым после удаления экземпляра CryptoStream, вызовите новый конструктор CryptoStream следующим образом:

var cStream = new CryptoStream(stream, transform, mode, leaveOpen: true);
Dim cStream = New CryptoStream(stream, transform, mode, leaveOpen:=true)

Изменения распаковки в DeflateStream

Начиная с .NET Framework 4.7.2, реализация операций распаковки в классе DeflateStream была изменена и теперь использует собственные API Windows по умолчанию. Как правило, это приводит к значительному повышению производительности.

Поддержка распаковки с помощью API Windows включена по умолчанию для приложений, нацеленных на .NET Framework 4.7.2. Для приложений, которые предназначены для более ранних версий .NET Framework, но выполняются в .NET Framework 4.7.2, новое поведение можно активировать отдельно, добавив следующий переключатель AppContext в файл конфигурации приложений:

<AppContextSwitchOverrides value="Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression=false" />

Дополнительные коллекции API

В .NET Framework 4.7.2 добавлено несколько новых API для типов SortedSet<T> и HashSet<T>. Сюда входит следующее.

Класс ConcurrentDictionary<TKey,TValue> включает новые перегрузки методов AddOrUpdate и GetOrAdd, чтобы извлечь значение из словаря или добавить его, если оно не найдено, а также добавить значение в словарь или обновить его, если оно уже существует.

public TValue AddOrUpdate<TArg>(TKey key, Func<TKey, TArg, TValue> addValueFactory, Func<TKey, TValue, TArg, TValue> updateValueFactory, TArg factoryArgument)

public TValue GetOrAdd<TArg>(TKey key, Func<TKey, TArg, TValue> valueFactory, TArg factoryArgument)
Public AddOrUpdate(Of TArg)(key As TKey, addValueFactory As Func(Of TKey, TArg, TValue), updateValueFactory As Func(Of TKey, TValue, TArg, TValue), factoryArgument As TArg) As TValue

Public GetOrAdd(Of TArg)(key As TKey, valueFactory As Func(Of TKey, TArg, TValue), factoryArgument As TArg) As TValue

ASP.NET

Поддержка внедрения зависимостей в веб-формах

Внедрение зависимостей (DI) разрывает связь объектов и их зависимостей, чтобы код объекта не пришлось менять только потому, что изменилась зависимость. При разработке приложений ASP.NET, предназначенных для использования с .NET Framework 4.7.2, вы можете:

Поддержка файлов cookie SameSite

SameSite запрещает браузеру отправлять файл cookie вместе с межсайтовым запросом. В .NET Framework 4.7.2 добавлено свойство HttpCookie.SameSite, значение которого является членом перечисления System.Web.SameSiteMode. Если его значение равно SameSiteMode.Strict или SameSiteMode.Lax, ASP.NET добавляет атрибут SameSite в заголовок set-cookie. Поддержка SameSite действует для объектов HttpCookie, а также для файлов cookie FormsAuthentication и System.Web.SessionState.

Вы можете задать SameSite для объекта HttpCookie следующим образом:

var c = new HttpCookie("secureCookie", "same origin");
c.SameSite = SameSiteMode.Lax;
Dim c As New HttpCookie("secureCookie", "same origin")
c.SameSite = SameSiteMode.Lax

Файлы cookie SameSite также можно настроить на уровне приложения, изменив файл web.config:

<system.web>
   <httpCookies sameSite="Strict" />
</system.web>

Вы можете добавить SameSite для файлов cookie FormsAuthentication и System.Web.SessionState, изменив файл веб-конфигурации:

<system.web>
   <authentication mode="Forms">
      <forms cookieSameSite="Lax">
         <!-- ...   -->
      </forms>
   </authentication>
   <sessionState cookieSameSite="Lax"></sessionState>
</system.web>

Сети

Реализация свойств HttpClientHandler

В .NET Framework 4.7.1 добавлены восемь свойств класса System.Net.Http.HttpClientHandler. Но два из них вызывали исключение PlatformNotSupportedException. Платформа .NET Framework 4.7.2 теперь предоставляет реализацию этих свойств. Это следующие свойства:

SQLClient

Поддержка универсальной и многофакторной проверки подлинности Azure Active Directory

Из-за все более строгих требований к соответствию и безопасности многие клиенты должны использовать многофакторную проверку подлинности (MFA). Кроме того, в настоящее время не рекомендуется включать пароли пользователей непосредственно в строки подключения. В связи с этими изменениями в .NET Framework 4.7.2 строки подключения SQLClient теперь имеют новое значение Active Directory Interactive для существующего ключевого слова "Проверка подлинности", чтобы обеспечить MFA и аутентификацию Azure AD. Новый интерактивный метод поддерживает собственных и федеративных пользователей Azure AD, а также гостевых пользователей Azure AD. При использовании этого метода многофакторная проверка подлинности, требуемая Azure AD, поддерживается для баз данных SQL. Кроме того, процесс проверки подлинности запрашивает у пользователя пароль в соответствии с рекомендациями по обеспечению безопасности.

В предыдущих версиях платформы .NET Framework подключение SQL поддерживало только параметры SqlAuthenticationMethod.ActiveDirectoryPassword и SqlAuthenticationMethod.ActiveDirectoryIntegrated. Оба параметра входят в неинтерактивный протокол ADAL, который не поддерживает многофакторную проверку подлинности. С новым параметром SqlAuthenticationMethod.ActiveDirectoryInteractive подключение SQL поддерживает многофакторную проверку подлинности, а также существующие методы проверки подлинности (пароль и встроенная проверка подлинности), что позволяет пользователям вводить пароли в интерактивном режиме без их сохранения в строке подключения.

Дополнительные сведения и пример см. в разделе "SQL – Azure AD Universal and Multi-factor Authentication Support" (SQL: поддержка универсальной и многофакторной проверки подлинности Azure AD) в блоге по .NET.

Поддержка Always Encrypted версии 2

В NET Framework 4.7.2 добавлена поддержка Always Encrypted на основе анклава. Исходная версия Always Encrypted — это технология шифрования на стороне клиента, в рамках которой ключи шифрования никогда не покидали клиента. В Always Encrypted на основе анклава клиент может при необходимости отправлять ключи шифрования в безопасный анклав, который является защищенным вычислительным объектом и может считаться частью SQL Server, но код SQL Server не может его изменить. Чтобы обеспечить поддержку Always Encrypted на основе анклава, в .NET Framework 4.7.2 добавлены следующие типы и члены для пространства имен System.Data.SqlClient:

  • SqlConnectionStringBuilder.EnclaveAttestationUrl — указывает URI для Always Encrypted на основе анклава.

  • SqlColumnEncryptionEnclaveProvider — абстрактный класс, из которого происходят все поставщики анклавов.

  • SqlEnclaveSession — инкапсулирует состояние определенного сеанса анклава.

  • SqlEnclaveAttestationParameters — предоставляет параметры подтверждения, используемые SQL Server для получения сведений, необходимых для выполнения определенного протокола подтверждения.

Файл конфигурации приложения указывает конкретную реализацию абстрактного класса System.Data.SqlClient.SqlColumnEncryptionEnclaveProvider, который предоставляет функциональные возможности для поставщика анклава. Пример:

<configuration>
  <configSections>
    <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection,System.Data,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"/>
  </configSections>
  <SqlColumnEncryptionEnclaveProviders>
    <providers>
      <add name="Azure" type="Microsoft.SqlServer.Management.AlwaysEncrypted.AzureEnclaveProvider,MyApp"/>
      <add name="HGS" type="Microsoft.SqlServer.Management.AlwaysEncrypted.HGSEnclaveProvider,MyApp" />
    </providers>
  </SqlColumnEncryptionEnclaveProviders >
</configuration>

Базовый поток Always Encrypted на основе анклава:

  1. Пользователь создает подключение AlwaysEncrypted к SQL Server с поддержкой Always Encrypted на основе анклава. Драйвер обращается в службу аттестации, чтобы обеспечить подключение к нужному анклаву.

  2. После аттестации анклава драйвер устанавливает защищенный канал с безопасным анклавом, размещенным на SQL Server.

  3. Драйвер использует ключи шифрования, авторизованные клиентом, совместно с безопасным анклавом в течение всего соединения SQL.

Windows Presentation Foundation

Поиск ResourceDictionary по источнику

Начиная с .NET Framework 4.7.2, помощник по диагностике может находить словари ResourceDictionaries, созданные из указанного URI источника.  (Эта функция предназначена для использования помощником по диагностике, а не приложением в производственной среде.) Помощник по диагностике, например средство "Изменить и продолжить" в Visual Studio, позволяет пользователям редактировать ResourceDictionary с целью применить изменения к запущенному приложению. Шагом к достижению этого является поиск всех ResourceDictionary, созданных запущенным приложением из редактируемого словаря. Например, приложение может объявить ResourceDictionary, содержимое которого копируется из определенного источника URI:

<ResourceDictionary Source="MyRD.xaml" />

Помощник по диагностике, который изменяет исходную разметку в MyRD.xaml, может использовать новую функцию для поиска словаря.  Эта функция реализуется новым статическим методом ResourceDictionaryDiagnostics.GetResourceDictionariesForSource. Помощник по диагностике вызывает новый метод с помощью абсолютного URI, который определяет исходную разметку, как показано в следующем примере кода:

IEnumerable<ResourceDictionary> dictionaries = ResourceDictionaryDiagnostics.GetResourceDictionariesForSource(new Uri("pack://application:,,,/MyApp;component/MyRD.xaml"));
Dim dictionaries As IEnumerable(Of ResourceDictionary) = ResourceDictionaryDiagnostics.GetResourceDictionariesForSource(New Uri("pack://application:,,,/MyApp;component/MyRD.xaml"))

Метод возвращает пустое перечисляемое значение, если не включен VisualDiagnostics и не указана переменная среды ENABLE_XAML_DIAGNOSTICS_SOURCE_INFO.

Поиск владельцев ResourceDictionary

Начиная с .NET Framework 4.7.2, помощник по диагностике может находить владельцев определенного словаря ResourceDictionary.  (Эта функция предназначена для помощников по диагностике, а не приложений в производственной среде.) При каждом изменении ResourceDictionary WPF автоматически обнаруживает все ссылки DynamicResource, на которые может повлиять изменение.

Помощник по диагностике, например средство "Изменить и продолжить" в Visual Studio, может в том числе обрабатывать ссылки StaticResource. Первым этапом этого процесса является поиск владельцев словаря; то есть поиск всех объектов, свойство Resources которых ссылается на словарь (напрямую или косвенно через свойство ResourceDictionary.MergedDictionaries). В поддержку этого этапа в классе System.Windows.Diagnostics.ResourceDictionaryDiagnostics реализовано три новых статических метода, по одному для каждого базового типа со свойством Resources:

Эти методы возвращают пустое перечисляемое значение, если не включен VisualDiagnostics и не указана переменная среды ENABLE_XAML_DIAGNOSTICS_SOURCE_INFO.

Поиск ссылок StaticResource

Помощник по диагностике теперь может получать уведомление при разрешении ссылки StaticResource.  (Эта функция предназначена для помощников по диагностике, а не приложений в производственной среде.) Помощник по диагностике, например средство "Изменить и продолжить" в Visual Studio, может обновить все случаи использования ресурса, когда его значение в ResourceDictionary меняется. WPF выполняет это автоматически для ссылок DynamicResource, но специально не делает этого для ссылок StaticResource. Начиная с .NET Framework 4.7.2, помощник по диагностике может использовать эти уведомления для поиска случаев использования статического ресурса.

Уведомление реализуется новым событием ResourceDictionaryDiagnostics.StaticResourceResolved:

public static event EventHandler<StaticResourceResolvedEventArgs> StaticResourceResolved;
Public Shared Event StaticResourceResolved As EventHandler(Of StaticResourceResolvedEventArgs)

Это событие возникает каждый раз, когда среда выполнения разрешает ссылку StaticResource. Аргумент StaticResourceResolvedEventArgs описывает разрешение и указывает объект и свойство, где размещена ссылка StaticResource и ключ ResourceDictionary, используемый для разрешения:

public class StaticResourceResolvedEventArgs : EventArgs
{
   public Object TargetObject { get; }

   public Object TargetProperty { get; }

   public ResourceDictionary ResourceDictionary { get; }

   public object ResourceKey { get; }
}
Public Class StaticResourceResolvedEventArgs : Inherits EventArgs
   Public ReadOnly Property TargetObject As Object
   Public ReadOnly Property TargetProperty As Object
   Public ReadOnly Property ResourceDictionary As ResourceDictionary
   Public ReadOnly Property ResourceKey As Object
End Class

Событие не происходит (и метод доступа add игнорируется), если не включен VisualDiagnostics и не задана переменная среды ENABLE_XAML_DIAGNOSTICS_SOURCE_INFO.

ClickOnce

Приложения, совместимые с HDPI, для Windows Forms, Windows Presentation Foundation (WPF) и Visual Studio Tools для Office (VSTO) можно развернуть с помощью ClickOnce. Если в манифесте приложения обнаружена следующая запись, развертывание в .NET Framework 4.7.2 будет успешным:

<windowsSettings>
   <dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>

Для приложения Windows Forms использовавшийся ранее обходной путь установки поддержки определения DPI в файле конфигурации приложения вместо манифеста приложения больше не требуется для успешного развертывания ClickOnce.

Новые возможности .NET Framework 4.7.1

.NET Framework 4.7.1 включает новые функции в следующих областях:

Основной акцент в .NET Framework 4.7.1, как и прежде, сделан на улучшении специальных возможностей, что позволяет приложению предоставлять соответствующие функции целевой аудитории. См. подробнее об улучшениях специальных возможностей в .NET Framework 4.7.1.

базовых классов;

Поддержка .NET Standard 2.0

.NET Standard определяет набор интерфейсов API, которые должны быть доступны в каждой реализации .NET, поддерживающей эту версию стандарта. .NET Framework 4.7.1 полностью поддерживает .NET Standard 2.0 и предлагает около 200 API, которые определены в .NET Standard 2.0 и отсутствуют в .NET Framework версий 4.6.1, 4.6.2 и 4.7. (Обратите внимание, что эти версии .NET Framework поддерживают .NET Standard 2.0 только в том случае, если дополнительные файлы поддержки .NET Standard также развертываются в целевой системе.) Дополнительные сведения см. в разделе о поддержке .NET Standard 2.0 в записи блога .NET Framework 4.7.1 Runtime and Compiler Features (Возможности среды выполнения .NET Framework 4.7.1 и компилятора).

Поддержка построителей конфигурации

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

Чтобы создать пользовательский построитель конфигурации, следует наследовать построитель от абстрактного класса ConfigurationBuilder и переопределить его ConfigurationBuilder.ProcessConfigurationSection и ConfigurationBuilder.ProcessRawXml. Кроме того, построители можно определить в файле конфигурации. Дополнительные сведения см. в разделе о построителях конфигурации в записи блога .NET Framework 4.7.1 ASP.NET and Configuration Features (Возможности .NET Framework 4.7.1 ASP.NET и конфигурации).

Обнаружение функций во время выполнения

Класс System.Runtime.CompilerServices.RuntimeFeature предоставляет механизм, позволяющий определить, поддерживается ли предопределенная функция в данной реализации .NET во время компиляции или во время выполнения. Во время компиляции компилятор может проверить наличие указанного поля, чтобы определить, поддерживается ли эта функция. Если да, он может вывести код, использующий эту функцию. Во время выполнения приложение может вызвать метод RuntimeFeature.IsSupported до создания кода. Дополнительные сведения см. в статье Добавление вспомогательного метода для описания функций, поддерживаемых средой выполнения.

Типы кортежей значений являются сериализуемыми

Начиная с .NET Framework 4.7.1, System.ValueTuple и связанные универсальные типы помечаются как сериализуемые, что обеспечивает двоичную сериализацию. Эта возможность должна упростить миграцию типов кортежей, таких как Tuple<T1,T2,T3> и Tuple<T1,T2,T3,T4>, в типы кортежей значений. Дополнительные сведения см. в разделе о сериализации ValueTuple в записи блога .NET Framework 4.7.1 Runtime and Compiler Features (Возможности среды выполнения .NET Framework 4.7.1 и компилятора).

Поддержка ссылок только для чтения

.NET Framework 4.7.1 включает System.Runtime.CompilerServices.IsReadOnlyAttribute. Этот атрибут используется компиляторами языка для пометки членов, имеющих типы возвращаемые ссылочные значения (или параметры) только для чтения. Дополнительные сведения см. в разделе о поддержке ReadOnlyReferences в записи блога .NET Framework 4.7.1 Runtime and Compiler Features (Возможности среды выполнения .NET Framework 4.7.1 и компилятора). Сведения о возвращаемых ссылочных значениях см. в разделах Возвращаемые ссылочные значения и ссылочные локальные переменные (справочник по C#) и Возвращаемые ссылочные значения (Visual Basic).

Среда CLR

Повышение производительности сборки мусора

Изменения функции сборки мусора (GC) в .NET Framework 4.7.1 повышают общую производительность, особенно для распределений кучи больших объектов (LOH). В .NET Framework 4.7.1 для распределений куч больших (LOH) и малых (SOH) объектов используются отдельные блокировки, что позволяет выполнять распределение кучи больших объектов, когда фоновый сборщик мусора очищает кучу малых объектов. В результате в приложениях с большим количеством операций выделения LOH сократится число конфликтов при блокировках выделений и улучшится производительность. Дополнительные сведения см. в разделе о повышении производительности сборки мусора в записи блога .NET Framework 4.7.1 Runtime and Compiler Features (Возможности среды выполнения .NET Framework 4.7.1 и компилятора).

Сети

Поддержка SHA-2 Message.HashAlgorithm

В .NET Framework 4.7 и более ранних версиях свойство Message.HashAlgorithm поддерживало только значения HashAlgorithm.Md5 и HashAlgorithm.Sha. Начиная с .NET Framework 4.7.1, также поддерживаются значения HashAlgorithm.Sha256, HashAlgorithm.Sha384 и HashAlgorithm.Sha512. Будет ли это значение использоваться на самом деле, зависит от MSMQ, поскольку сам экземпляр Message не выполняет хэширование, а просто передает значения в MSMQ. Дополнительные сведения см. в разделе поддержке о SHA-2 для Message.HashAlgorithm в записи блога .NET Framework 4.7.1 ASP.NET and Configuration features (Возможности .NET Framework 4.7.1 ASP.NET и конфигурации).

ASP.NET

Действия выполнения в приложениях ASP.NET

ASP.NET обрабатывает запросы в предопределенном конвейере, который содержит 23 события. ASP.NET выполняет каждый обработчик событий как действие выполнения. В версиях ASP.NET до .NET Framework 4.7 платформа ASP.NET не может использовать контекст выполнения из-за переключений между собственным и управляемым потоками. Вместо этого ASP.NET выборочно выполняет только HttpContext. Начиная с .NET Framework 4.7.1, метод HttpApplication.OnExecuteRequestStep(Action<HttpContextBase,Action>) также позволяет использовать модули для восстановления внешних данных. Эта функция предназначена для библиотек, связанных с трассировкой, профилированием, диагностикой или транзакциями, например для тех, которые учитывают поток работы приложения. Дополнительные сведения см. в разделе о действии выполнения ASP.NET в записи блога .NET Framework 4.7.1 ASP.NET and Configuration Features (Возможности .NET Framework 4.7.1 ASP.NET и конфигурации).

Синтаксический анализ HttpCookie ASP.NET

В .NET Framework 4.7.1 добавлен новый метод HttpCookie.TryParse, который обеспечивает стандартный способ создания объекта HttpCookie из строки и позволяет точно назначать значения cookie, такие как дата окончания срока действия и путь. Дополнительные сведения см. в разделе о синтаксическом анализе HttpCookie ASP.NET в записи блога .NET Framework 4.7.1 ASP.NET and Configuration Features (Возможности .NET Framework 4.7.1 ASP.NET и конфигурации).

Функции хэширования SHA-2 для учетных данных проверки подлинности форм ASP.NET

В .NET Framework 4.7 и более ранних версиях разработчики ASP.NET могли хранить учетные данные пользователей с паролями, хэшированными с помощью MD5 или SHA1, в файлах конфигурации. Начиная с .NET Framework 4.7.1, ASP.NET также поддерживает новые безопасные функции алгоритма SHA-2, такие как SHA256, SHA384 и SHA512. SHA1 остается алгоритмом по умолчанию, а нестандартный хэш-алгоритм можно определить в файле веб-конфигурации. Пример:

<system.web>
    <authentication mode="Forms">
        <forms loginUrl="~/login.aspx">
          <credentials passwordFormat="SHA512">
            <user name="jdoe" password="6D003E98EA1C7F04ABF8FCB375388907B7F3EE06F278DB966BE960E7CBBD103DF30CA6D61F7E7FD981B2E4E3A64D43C836A4BEDCA165C33B163E6BCDC538A664" />
          </credentials>
        </forms>
    </authentication>
</system.web>

Новые возможности .NET Framework 4.7

.NET Framework 4.7 включает новые функции в следующих областях:

См. подробнее об изменениях списка API в .NET Framework 4.7 на сайте GitHub. См. подробнее об улучшенных функциях и исправленных ошибках в .NET Framework 4.7 на сайте GitHub. Дополнительные сведения см. в записи блога .NET, посвященной объявлению о выпуске .NET Framework 4.7.

базовых классов;

.NET Framework 4.7 улучшает сериализацию, используя DataContractJsonSerializer:

Дополнительные функциональные возможности на основе эллиптической криптографии (ECC)*

В .NET Framework 4.7 добавлены методы ImportParameters(ECParameters) в классы ECDsa и ECDiffieHellman, которые позволяют объекту представлять уже установленный ключ. Также добавлен метод ExportParameters(Boolean) для экспорта ключа с явными параметрами кривой.

В .NET Framework 4.7 также добавлена поддержка дополнительных кривых (включая пакет кривых Brainpool) и стандартные определения для упрощения создания с помощью новых фабричных методов Create и Create.

На GitHub вы найдете пример криптографических улучшений в .NET Framework 4.7.

Улучшенная поддержка управляющих символов для DataContractJsonSerializer

В .NET Framework 4.7 класс DataContractJsonSerializer сериализует управляющие символы в соответствии со стандартом ECMAScript 6. Если приложение предназначено для .NET Framework 4.7, класс будет работать так по умолчанию. Если же приложение выполняется на базе .NET Framework 4.7, но предназначено для предыдущих версий этой платформы, такое поведение класса нужно включить отдельно. Дополнительные сведения см. в разделе Совместимость приложений.

Сети

В .NET Framework 4.7 добавлена следующая сетевая функция:

Поддержка операционной системы по умолчанию для протоколов TLS*

Стек TLS, который используется в System.Net.Security.SslStream и других компонентах, расположенных в стеке над ним (например, HTTP, FTP и SMTP), позволяет разработчикам использовать протоколы TLS по умолчанию, поддерживаемые операционной системой. Разработчики теперь не обязаны жестко указывать версию TLS.

ASP.NET

В ASP.NET в .NET Framework 4.7 добавлены следующие новые функции:

Расширяемость кэша объектов

Начиная с .NET Framework 4.7 в ASP.NET добавлен новый набор API, которые позволяют разработчикам заменить стандартные реализации ASP.NET для кэширования объектов в памяти и мониторинга использования памяти. Разработчики могут переопределить любой из следующих трех компонентов, если их не устраивает стандартная реализация ASP.NET.

  • Хранилище кэша объектов. В новом разделе конфигурации поставщиков кэша разработчик может подключить новую реализацию кэша объектов для приложения ASP.NET с помощью нового интерфейса ICacheStoreProvider.

  • Мониторинг памяти. Стандартный монитор памяти ASP.NET уведомляет приложения о том, что они приближаются к настроенному для процесса лимиту байтов исключительного пользования, а также о нехватке общей доступной физической памяти на компьютере. Уведомление срабатывает незадолго до достижения ограничения. Для некоторых приложений эти уведомления поступают слишком поздно и не позволяют предпринять никаких разумных действий. Разработчики могут использовать собственные мониторы памяти, чтобы заменить значение по умолчанию с помощью свойства ApplicationMonitors.MemoryMonitor.

  • Реакции на достижение лимита памяти. По умолчанию ASP.NET пытается обрезать кэш объектов, периодически вызывая функцию GC.Collect при приближении к лимиту байтов исключительного пользования для процесса. Для некоторых приложений частота вызовов GC.Collect или размер кэша после обрезки не позволяют обеспечить эффективность работы. Теперь разработчик может изменить или дополнить поведение по умолчанию, назначив собственную реализацию IObserver в качестве монитора памяти для приложения.

Windows Communication Foundation (WCF)

В Windows Communication Foundation (WCF) добавлены следующие функции и изменения:

Возможность настраивать параметры безопасности сообщений по умолчанию для TLS 1.1 или TLS 1.2

Начиная с .NET Framework 4.7, WCF позволяет настраивать в качестве протокола безопасности сообщений по умолчанию протоколы TSL 1.1 и TLS 1.2, а не только SSL 3.0 и TSL 1.0. Эту возможность нужно дополнительно активировать, добавив следующую запись в файл конфигурации приложения:

<runtime>
   <AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols=false;Switch.System.Net.DontEnableSchUseStrongCrypto=false" />
</runtime>

Повышенная надежность приложений WCF и сериализации WCF

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

  • Улучшение поддержки для совместного использования асинхронного и синхронного кода в вызовах SocketConnection.BeginRead и SocketConnection.Read.
  • Повышение надежности при разрыве подключения с SharedConnectionListener и DuplexChannelBinder.
  • Повышение надежности операций сериализации при вызове метода FormatterServices.GetSerializableMembers(Type).
  • Повышение надежности при удалении обслуживающего потока путем вызова метода ChannelSynchronizer.RemoveWaiter.

Windows Forms

В .NET Framework 4.7 для Windows Forms улучшена поддержка мониторов с высоким разрешением.

Поддержка высокого разрешения

Начиная с приложений, предназначенных для использования с .NET Framework 4.7, в .NET Framework поддерживается высокое разрешение и динамическое разрешение для приложений Windows Forms. Поддержка высокого разрешения улучшает расположение и внешний вид форм и элементов управления на мониторах с высокой плотностью точек на дюйм. Функция динамического разрешения изменяет расположение и внешний вид формы и элементов управления, когда пользователь изменяет разрешение монитора или масштаб отображения при запущенном приложении.

Поддержка высокого DPI — это функция, которая настраивается путем определения < System. Windows. Forms. ConfigurationSection > в файле конфигурации приложения. Дополнительные сведения об активации поддержки высокого разрешения и динамического разрешения для приложений Windows Forms вы можете найти в статье Поддержка высокого DPI в Windows Forms.

Windows Presentation Foundation (WPF)

В .NET Framework 4.7 добавлены следующие улучшения WPF:

Поддержка стека для управления касанием или пером, основанного на сообщениях Windows WM_POINTER

Теперь вы можете использовать стек управления касанием или пером на основе сообщений WM_POINTER вместо платформы служб рукописного ввода Windows (WISP). Эта функция в .NET Framework является опциональной. Дополнительные сведения см. в разделе Совместимость приложений.

Новая реализация интерфейсов API WPF для печати

API-интерфейсы WPF для печати в классе System.Printing.PrintQueue вызывают API пакета печати документа Windows вместо устаревших API печати XPS. См. раздел Совместимость приложений, чтобы узнать, как это изменение может на нее повлиять.

Новые возможности .NET Framework 4.6.2

.NET Framework 4.6.2 включает новые функции в следующих областях:

См. подробнее об изменениях списка API в .NET Framework 4.6.2 на сайте GitHub. См. подробнее об улучшенных функциях и исправленных ошибках в .NET Framework 4.6.2 на сайте GitHub. Дополнительные сведения см. в записи блога .NET, посвященной объявлению о выпуске .NET Framework 4.6.2.

ASP.NET

в платформа .NET Framework 4.6.2 ASP.NET включает следующие улучшения.

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

Модули проверки заметок к данным позволяют выполнять проверки путем добавления одного или нескольких атрибутов к свойству класса. Элемент ValidationAttribute.ErrorMessage атрибута определяет текст сообщения об ошибке, если проверка не пройдена. Начиная с .NET Framework 4.6.2 в ASP.NET упрощена локализация сообщений об ошибках. Локализация сообщений об ошибках происходит в указанных далее случаях.

  1. В атрибуте проверки указан ValidationAttribute.ErrorMessage.

  2. Файл ресурсов хранится в папке App_LocalResources.

  3. Имя локализованного файла ресурсов имеет форму DataAnnotation.Localization.{имя}.resx, где имя — это имя языка и региональных параметров в формате languageCode-country/regionCode или languageCode.

  4. Имя ключа ресурса — это строка, назначенная ValidationAttribute.ErrorMessage атрибуту, а ее значение — локализованное сообщение об ошибке.

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

public class RatingInfo
{
   [Required(ErrorMessage = "The rating must be between 1 and 10.")]
   [Display(Name = "Your Rating")]
   public int Rating { get; set; }
}
Public Class RatingInfo
   <Required(ErrorMessage = "The rating must be between 1 and 10.")>
   <Display(Name = "Your Rating")>
   Public Property Rating As Integer = 1
End Class

Затем можно создать файл ресурсов DataAnnotation.Localization.fr.resx, ключом в котором является строка сообщения об ошибке, а значением — локализованное сообщение об ошибке. Этот файл должен находиться в папке App.LocalResources. Например, ниже приведен ключ и его значение в сообщении об ошибке, локализованном в рамках французского языка и региональных параметров (French (fr)).

name Значение
The rating must be between 1 and 10. La note doit être comprise entre 1 et 10.

Кроме того, локализация заметок к данным является расширяемой. Разработчики могут подключить собственный поставщик локализатора строк путем реализации интерфейса IStringLocalizerProvider для хранения строки локализации в месте, отличном от файла ресурсов.

Поддержка асинхронного выполнения с поставщиками хранилищ состояния сеансов

Теперь ASP.NET позволяет использовать методы, возвращающие задачи, с поставщиками хранилища состояния сеанса, тем самым разрешая приложениям ASP.NET реализовывать преимущества масштабируемости асинхронных операций. Для поддержки асинхронных операций с использованием поставщиков хранения состояния сеанса ASP.NET включает новый интерфейс System.Web.SessionState.ISessionStateModule, который наследует от IHttpModule и позволяет разработчикам реализовать собственный модуль состояния сеанса и собственные поставщики хранения асинхронных сеансов. Интерфейс определяется следующим образом:

public interface ISessionStateModule : IHttpModule {
    void ReleaseSessionState(HttpContext context);
    Task ReleaseSessionStateAsync(HttpContext context);
}
Public Interface ISessionStateModule : Inherits IHttpModule
   Sub ReleaseSessionState(context As HttpContext)
   Function ReleaseSessionStateAsync(context As HttpContext) As Task
End Interface

Кроме того, класс SessionStateUtility включает два новых метода (IsSessionStateReadOnly и IsSessionStateRequired), которые можно использоваться для поддержки асинхронных операций.

Поддержка асинхронного выполнения поставщиков кэша вывода

Начиная с .NET Framework 4.6.2, с поставщиками кэша вывода можно использовать методы, возвращающие задачи, чтобы воспользоваться преимуществами асинхронных операций по масштабируемости. Поставщики, реализующие эти методы, сокращают вероятность блокировок потоков на веб-сервере и улучшают масштабируемость службы ASP.NET.

Для поддержки поставщиков кэша асинхронного вывода были добавлены следующие API:

Категории символов

Символы в .NET Framework 4.6.2 классифицируются на основе стандарта Юникод версии 8.0.0. В .NET Framework 4.6 и .NET Framework 4.6.1 символы классифицировались на основе категорий символов Юникода 6.3.

Поддержка Юникода 8.0 ограничена классификацией символов по классу CharUnicodeInfo и связанными типами и методами. К ним относятся класс StringInfo, перегруженный метод Char.GetUnicodeCategory и классы символов, распознаваемые обработчиком регулярных выражений .NET Framework. Это изменение не влияет на сравнение и сортировку символов и строк. Они по-прежнему зависят от базовой операционной системы или, в системах Windows 7, от символьных данных, предоставляемых .NET Framework.

Сведения об изменениях в категориях символов Юникода 6.0–7.0 см. в статье The Unicode Standard, Version 7.0.0 на веб-сайте консорциума Юникода. Сведения об изменениях в категориях символов Юникода 7.0–8.0 см. в статье The Unicode Standard, Version 8.0.0 на веб-сайте Консорциума Юникода.

Шифрование

Поддержка сертификатов X509, содержащих FIPS 186-3 DSA

В .NET Framework 4.6.2 добавлена поддержка сертификатов X509 с алгоритмом DSA, ключи которых превышают 1024-разрядное ограничение FIPS 186-2.

В дополнение к поддержке ключей FIPS 186-3 больших размеров, .NET Framework 4.6.2 позволяет вычислять подписи с использованием семейства алгоритмов хэширования SHA-2 (SHA256, SHA384 и SHA512). Поддержка FIPS 186 3 осуществляется с помощью нового класса System.Security.Cryptography.DSACng.

Чтобы обеспечить соответствие последним изменениям в классе RSA в .NET Framework 4.6 и классе ECDsa в .NET Framework 4.6.1, абстрактный базовый класс DSA в .NET Framework 4.6.2 включает дополнительные методы, позволяющие вызывающим сторонам использовать эту функцию без приведения. Можно вызвать метод расширения DSACertificateExtensions.GetDSAPrivateKey для подписывания данных, как показано в следующем примере.

public static byte[] SignDataDsaSha384(byte[] data, X509Certificate2 cert)
{
    using (DSA dsa = cert.GetDSAPrivateKey())
    {
        return dsa.SignData(data, HashAlgorithmName.SHA384);
    }
}
Public Shared Function SignDataDsaSha384(data As Byte(), cert As X509Certificate2) As Byte()
    Using DSA As DSA = cert.GetDSAPrivateKey()
        Return DSA.SignData(data, HashAlgorithmName.SHA384)
    End Using
End Function

Можно также вызвать метод расширения DSACertificateExtensions.GetDSAPublicKey для проверки подписанных данных, как показано в следующем примере.

public static bool VerifyDataDsaSha384(byte[] data, byte[] signature, X509Certificate2 cert)
{
    using (DSA dsa = cert.GetDSAPublicKey())
    {
        return dsa.VerifyData(data, signature, HashAlgorithmName.SHA384);
    }
}
 Public Shared Function VerifyDataDsaSha384(data As Byte(), signature As Byte(), cert As X509Certificate2) As Boolean
    Using dsa As DSA = cert.GetDSAPublicKey()
        Return dsa.VerifyData(data, signature, HashAlgorithmName.SHA384)
    End Using
End Function

Повышенная четкость входных данных для процедур формирования ключа ECDiffieHellman

В .NET Framework 3.5 добавлена поддержка соглашения о ключах Диффи — Хелмана на эллиптических кривых с тремя разными процедурами формирования ключа. Входные данные для процедур и сами процедуры настраивались с помощью свойств объекта ECDiffieHellmanCng. Однако поскольку не все процедуры правильно считывали каждое входное свойство, часто возникала путаница.

чтобы устранить эту проблему в платформа .NET Framework 4.6.2, в базовый класс были добавлены ECDiffieHellman следующие три метода, чтобы более четко представить эти подпрограммы подпрограмм и их входные данные:

Метод ECDiffieHellman Описание
DeriveKeyFromHash(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[], Byte[]) Получает материал ключа с помощью формулы

HASH (Секретпрепенд | | x | | Секретаппенд)

HASH(secretPrepend OrElse x OrElse secretAppend)

здесь x является вычисляемым результатом алгоритма Диффи-Хелмана на эллиптических кривых.
DeriveKeyFromHmac(ECDiffieHellmanPublicKey, HashAlgorithmName, Byte[], Byte[], Byte[]) Получает материал ключа с помощью формулы

HMAC (Хмаккэй, Секретпрепенд | | x | | Секретаппенд)

HMAC(hmacKey, secretPrepend OrElse x OrElse secretAppend)

здесь x является вычисляемым результатом алгоритма Диффи-Хелмана на эллиптических кривых.
DeriveKeyTls(ECDiffieHellmanPublicKey, Byte[], Byte[]) Получает материал ключа с помощью алгоритма наследования псевдослучайной функции (PRF) TLS.

Поддержка симметричного шифрования с помощью постоянного ключа

В библиотеку шифрования Windows (CNG) добавлена поддержка хранения постоянных симметричных ключей и использования хранящихся в оборудовании симметричных ключей. Разработчики могут применять эти возможности, начиная с версии .NET Framework 4.6.2. Поскольку понятие имен ключей и поставщиков ключей зависит от реализации, для применения этой функции требуется использовать конструктор конкретных типов реализации, а не предпочтительный метод (например, вызов Aes.Create).

Поддержка симметричного шифрования с помощью постоянных ключей доступна для алгоритмов AES (AesCng) и 3DES (TripleDESCng). Пример:

public static byte[] EncryptDataWithPersistedKey(byte[] data, byte[] iv)
{
    using (Aes aes = new AesCng("AesDemoKey", CngProvider.MicrosoftSoftwareKeyStorageProvider))
    {
        aes.IV = iv;

        // Using the zero-argument overload is required to make use of the persisted key
        using (ICryptoTransform encryptor = aes.CreateEncryptor())
        {
            if (!encryptor.CanTransformMultipleBlocks)
            {
                throw new InvalidOperationException("This is a sample, this case wasn't handled...");
            }

            return encryptor.TransformFinalBlock(data, 0, data.Length);
        }
    }
}
Public Shared Function EncryptDataWithPersistedKey(data As Byte(), iv As Byte()) As Byte()
    Using Aes As Aes = New AesCng("AesDemoKey", CngProvider.MicrosoftSoftwareKeyStorageProvider)
        Aes.IV = iv

        ' Using the zero-argument overload Is required to make use of the persisted key
        Using encryptor As ICryptoTransform = Aes.CreateEncryptor()
            If Not encryptor.CanTransformMultipleBlocks Then
                Throw New InvalidOperationException("This is a sample, this case wasn't handled...")
            End If
            Return encryptor.TransformFinalBlock(data, 0, data.Length)
        End Using
    End Using
End Function

Поддержка SignedXml для хэширования SHA-2

платформа .NET Framework 4.6.2 добавляет поддержку в SignedXml класс для методов подписи rsa-SHA256, rsa-SHA384 и rsa-SHA512 PKCS # 1, а также алгоритмы дайджест-шифрования для SHA256, SHA384 и SHA512.

Константы URI представлены в SignedXml:

Поле SignedXml Константа
XmlDsigSHA256Url "http://www.w3.org/2001/04/xmlenc#sha256"
XmlDsigRSASHA256Url "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"
XmlDsigSHA384Url "http://www.w3.org/2001/04/xmldsig-more#sha384"
XmlDsigRSASHA384Url "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"
XmlDsigSHA512Url "http://www.w3.org/2001/04/xmlenc#sha512"
XmlDsigRSASHA512Url "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"

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

SqlClient

Поставщик данных .NET Framework для SQL Server (System.Data.SqlClient) предлагает следующие новые возможности в .NET Framework 4.6.2:

Объединение подключений в пул и использование времени ожидания в базах данных SQL Azure

Если включено объединение подключений в пул и наступает время ожидания или возникает другая ошибка входа, происходит кэширование исключения. При последующих попытках подключения в следующий период от 5 секунд до 1 минуты создается кэшированное исключение. Дополнительные сведения см. в разделе Пулы подключений SQL Server (ADO.NET).

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

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

Auto

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

  • .database.windows.net

  • .database.chinacloudapi.cn

  • .database.usgovcloudapi.net

  • .database.cloudapi.de

AlwaysBlock

Период блокировки пула подключений всегда включен.

NeverBlock

Период блокировки пула подключений всегда отключен.

Усовершенствования функции Always Encrypted

В SQLClient представлены два усовершенствования для функции Always Encrypted.

  • Для повышения производительности параметризованных запросов к зашифрованным столбцам базы данных выполняется кэширование метаданных шифрования для параметров запроса. Если свойству SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled задано значение true (это значение по умолчанию) и один и тот же запрос вызывается несколько раз, клиент получает метаданные параметров с сервера только один раз.

  • Теперь записи ключей шифрования столбцов в кэше ключа вытесняются по истечении интервала времени, настроенного с помощью свойства SqlConnection.ColumnEncryptionKeyCacheTtl.

Windows Communication Foundation

В.NET Framework 4.6.2 Windows Communication Foundation получила ряд улучшений в следующих областях:

Поддержка безопасности транспорта WCF для сертификатов, сохраненных с помощью CNG

Безопасность транспорта WCF поддерживает сертификаты, сохраненные с использованием библиотеки шифрования Windows (CNG). В .NET Framework 4.6.2 эта поддержка ограничивается использованием сертификатов с открытым ключом, длина экспоненты которого не превышает 32 бита. Если приложение предназначено для .NET Framework 4.6.2, эта функция включена по умолчанию.

для приложений, предназначенных для платформа .NET Framework 4.6.1 и более ранних версий, но работающих на платформа .NET Framework 4.6.2, эту функцию можно включить, добавив следующую строку в < раздел runtime > файла app.config или web.config.

<AppContextSwitchOverrides
    value="Switch.System.IdentityModel.DisableCngCertificates=false"
/>

Это также можно сделать программно с помощью следующего кода:

private const string DisableCngCertificates = @"Switch.System.IdentityModel.DisableCngCertificates";
AppContext.SetSwitch(disableCngCertificates, false);
Const DisableCngCertificates As String = "Switch.System.IdentityModel.DisableCngCertificates"
AppContext.SetSwitch(disableCngCertificates, False)

Улучшенная поддержка нескольких правил коррекции летнего времени с помощью класса DataContractJsonSerializer

Клиенты могут использовать параметр конфигурации приложения для определения того, поддерживает ли класс DataContractJsonSerializer несколько правил коррекции для одного часового пояса. Это функция, включаемая пользователем. Чтобы ее включить, добавьте следующий параметр в файл app.config:

<runtime>
     <AppContextSwitchOverrides value="Switch.System.Runtime.Serialization.DoNotUseTimeZoneInfo=false" />
</runtime>

Если эта возможность включена, объект DataContractJsonSerializer использует тип TimeZoneInfo вместо типа TimeZone для десериализации данных даты и времени. TimeZoneInfo поддерживает несколько правил коррекции, что дает возможность работать с историческими данными часовых поясов; TimeZone не имеет.

Дополнительные сведения о структуре TimeZoneInfo и коррекциях часового пояса см. в статье Общие сведения о часовых поясах.

Наилучшее соответствие NetNamedPipeBinding

В WCF представлен новый параметр приложения, который может быть задан в клиентских приложениях для их постоянного подключения к службе, прослушивающей URI, наилучшим образом соответствующий запрошенному. Если этот параметр приложения имеет значение false (по умолчанию), клиенты могут использовать NetNamedPipeBinding для подключения к службе, прослушивающей URI, который является подстрокой запрошенного URI.

Например, клиент пытается подключиться к службе, прослушивающей net.pipe://localhost/Service1, но другая служба на этом компьютере, запущенная с правами администратора, прослушивает net.pipe://localhost. Если этому параметру приложения задать значение false, клиент будет пытаться подключиться не к той службе. После установки значения true для параметра приложения клиент будет всегда подключаться к наиболее подходящей службе.

Примечание

Клиенты, использующие NetNamedPipeBinding, находят службы на основе их базового адреса (если он существует), а не на основе полного адреса конечной точки. Чтобы обеспечить постоянную работу этого параметра, служба должна использовать уникальный базовый адрес.

Для активации этого изменения добавьте следующий параметр в файл App.config или Web.config клиентского приложения:

<configuration>
    <appSettings>
        <add key="wcf:useBestMatchNamedPipeUri" value="true" />
    </appSettings>
</configuration>

SSL 3.0 не является протоколом по умолчанию

При использовании NetTcp для обеспечения безопасности транспорта и применении типа учетных данных сертификата SSL 3.0 больше не является протоколом по умолчанию для согласования безопасного соединения. В большинстве случаев существующие приложения не должны затрагиваться, поскольку TLS 1.0 входит в список протоколов для NetTcp. Все существующие клиенты должны иметь возможность согласовывать подключение с помощью хотя бы TLS 1.0. Если требуется Ssl3, воспользуйтесь одним из указанных ниже механизмов конфигурации и добавьте его в список установленных протоколов.

Windows Presentation Foundation (WPF)

В.NET Framework 4.6.2 Windows Presentation Foundation получила ряд улучшений в следующих областях:

Сортировка групп

Приложение, использующее CollectionView объект для группировки данных, теперь может явно объявлять порядок сортировки групп. Явная сортировка позволяет решить проблему неочевидного упорядочивания, которая возникает, когда приложение динамически добавляет или удаляет группы или когда оно изменяет значения свойств элементов, участвующих в группировании. Она также может повысить производительность процесса создания группы путем перемещения сравнений свойств группирования из сортировки полной коллекции в сортировку групп.

Для поддержки сортировки групп новые свойства GroupDescription.SortDescriptions и GroupDescription.CustomSort описывают способ сортировки коллекции групп, созданной объектом GroupDescription. Эта процедура аналогична способу, которым свойства ListCollectionView с аналогичными именами описывают принцип сортировки элементов данных.

Для наиболее распространенных случаев можно использовать два новых статических свойства PropertyGroupDescription класса, CompareNameAscending и CompareNameDescending .

Например, следующий XAML группирует данные по возрасту, сортирует возрастные группы в порядке возрастания и группирует элементы в каждой возрастной группе по фамилии.

<GroupDescriptions>
     <PropertyGroupDescription
         PropertyName="Age"
         CustomSort=
              "{x:Static PropertyGroupDescription.CompareNamesAscending}"/>
     </PropertyGroupDescription>
</GroupDescriptions>

<SortDescriptions>
     <SortDescription PropertyName="LastName"/>
</SortDescriptions>

Поддержка сенсорной клавиатуры

Поддержка сенсорной клавиатуры позволяет отслеживать фокус в приложениях WPF путем автоматического вызова и отклонения сенсорной клавиатуры в Windows 10 при получении элементом управления, который может принимать текстовые входные данные, сигнала о сенсорном вводе.

В предыдущих версиях платформы .NET Framework приложения WPF не использовали отслеживание фокуса без отключения поддержки пера и сенсорного ввода WPF. В результате приложения WPF должны выбрать между полной поддержкой сенсорного ввода WPF или использованием мыши Windows.

DPI для каждого монитора

Для поддержки современных сред с высоким и смешанным разрешением платформа WPF в .NET Framework 4.6.2 включает для приложений WPF поддержку DPI для каждого монитора. Дополнительные сведения о включении в приложении WPF поддержки DPI для каждого монитора см. в примерах и в руководстве разработчика на сайте GitHub.

В предыдущих версиях платформы .NET Framework приложения WPF поддерживают DPI на уровне системы. Другими словами, ОС соответствующим образом масштабирует пользовательский интерфейс приложения в зависимости от разрешения экрана монитора, на котором отображается приложение.

для приложений, выполняемых под платформа .NET Framework 4.6.2, можно отключить изменения DPI для каждого монитора в приложениях WPF, добавив инструкцию конфигурации в < раздел runtime > файла конфигурации приложения следующим образом:

<runtime>
   <AppContextSwitchOverrides value="Switch.System.Windows.DoNotScaleForDpiChanges=false"/>
</runtime>

Windows Workflow Foundation (WF)

В .NET Framework 4.6.2 Windows Workflow Foundation содержит ряд улучшений в следующих областях:

Поддержка выражений C# и IntelliSense в повторно размещаемом конструкторе WF

Начиная с .NET Framework 4.5 WF поддерживает выражения C# в конструкторе Visual Studio и рабочих процессах кода. Повторно размещаемый конструктор рабочих процессов является ключевой возможностью WF, позволяющей размещать конструкторы рабочих процессов в приложении вне среды Visual Studio (например, в WPF). Windows Workflow Foundation поддерживает выражения C# и IntelliSense в повторно размещаемом конструкторе рабочих процессов. Дополнительные сведения см. в блоге по Windows Workflow Foundation.

Availability of IntelliSense when a customer rebuilds a workflow project from Visual Studio. В версиях .NET Framework до 4.6.2 при перестройке проекта рабочего процесса из Visual Studio происходит нарушение работы IntelliSense в конструкторе WF. Несмотря на успешное построение проекта, типы рабочих процессов отсутствуют в конструкторе, и в окне Список ошибок отображаются предупреждения из IntelliSense о недостающих типах рабочего процесса. В .NET Framework 4.6.2 эта проблема решена и IntelliSense работает.

Приложения Workflow версии 1 с функцией отслеживания рабочего процесса теперь работают в режиме FIPS

Теперь на компьютерах с включенным режимом поддержки стандарта FIPS можно успешно запускать приложение Workflow версии 1 с функцией отслеживания рабочих процессов. Чтобы реализовать этот сценарий, необходимо внести следующее изменение в файл app.config:

<add key="microsoft:WorkflowRuntime:FIPSRequired" value="true" />

Если этот сценарий не реализован, запущенное приложение продолжает создавать исключение с сообщением "Данная реализация не является частью протестированных криптографических алгоритмов Windows Platform FIPS".

Усовершенствования рабочего процесса при использовании динамического обновления с конструктором рабочих процессов Visual Studio

Конструктор активности конструктор рабочих процессов, блок-схем и другие конструкторы действий рабочих процессов теперь успешно загружают и отображают рабочие процессы, сохраненные после вызова DynamicUpdateServices.PrepareForUpdate метода. В версиях .NET Framework, предшествующих .NET Framework 4.6.2, загрузка XAML-файла в Visual Studio для рабочего процесса, который был сохранен после вызова метода DynamicUpdateServices.PrepareForUpdate, может вызвать следующие проблемы:

  • Конструктор рабочих процессов не может правильно загрузить XAML-файл (если ViewStateData.Id находится в конце строки).

  • Конструктор действия FlowChart или другие конструкторы действий рабочих процессов могут отображать все объекты в их расположениях по умолчанию в отличие от значений вложенных свойств.

ClickOnce

Технология ClickOnce была обновлена для поддержки протоколов TLS 1.1 и TLS 1.2 наряду с уже поддерживаемой версией 1.0. ClickOnce автоматически определяет необходимый протокол. Для включения поддержки протоколов TLS 1.1 и 1.2 в приложении ClickOnce не требуется выполнять дополнительные действия.

Преобразование приложений Windows Forms и приложений WPF в приложения UWP

Теперь Windows предоставляет возможности переноса существующих классических приложений Windows, включая приложения WPF и Windows Forms, на универсальную платформу Windows (UWP). Эта технология играет роль моста, позволяя постепенно переносить существующую базу кода на платформу UWP, переводя, тем самым, приложения на все устройства Windows 10.

Преобразованное классическое приложение получает удостоверение, аналогичное удостоверению приложения платформы UWP, которое делает доступными интерфейсы API UWP для включения функций, таких как динамические плитки и уведомления. Приложение продолжает работать как раньше и функционирует как приложение полного доверия. После преобразования приложения к существующему процессу полного доверия можно добавить процесс контейнера приложения для подключения адаптивного пользовательского интерфейса. При перемещении всех функциональных возможностей в процесс контейнера приложения можно удалить процесс полного доверия и сделать новое приложение UWP доступным для всех устройств Windows 10.

Усовершенствования отладки

API неуправляемой отладки был усовершенствован в .NET Framework 4.6.2 для выполнения дополнительного анализа при возникновении NullReferenceException, чтобы определить, какая переменная в одной строке исходного кода является null. Для поддержки этого сценария в неуправляемый API отладки были добавлены следующие API.

  • Интерфейсы ICorDebugCode4, ICorDebugVariableHome и ICorDebugVariableHomeEnum, предоставляющие собственные начальные расположения управляемых переменных. Это позволяет отладчикам выполнять анализ потока кода при NullReferenceException возникновении и работать в обратном порядке, чтобы определить управляемую переменную, которая соответствует собственному расположению null .

  • Метод ICorDebugType2::GetTypeID обеспечивает сопоставление ICorDebugType с COR_TYPEID, что позволяет отладчику получить COR_TYPEID без экземпляра ICorDebugType. Существующие API в COR_TYPEID можно использовать для определения макета класса типа.

Новые возможности .NET Framework 4.6.1

.NET Framework 4.6.1 включает новые функции в следующих областях:

Дополнительные сведения о версии .NET Framework 4.6.1 приведены в следующих статьях:

Криптография: Поддержка сертификатов X509, содержащих ECDSA

В .NET Framework 4.6 добавлена поддержка RSACng сертификатов X509. В .NET Framework 4.6.1 добавлена поддержка сертификатов X509 с алгоритмом ECDSA (цифровых подписей на основе эллиптических кривых).

ECDSA обеспечивает более высокую производительность и является более безопасным алгоритмом шифрования, чем RSA, предоставляя лучший выбор, когда производительность и масштабируемость TLS представляет собой проблему. Реализация .NET Framework создает оболочку для вызовов существующих функциональных возможностей Windows.

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

using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

public class Net461Code
{
    public static byte[] SignECDsaSha512(byte[] data, X509Certificate2 cert)
    {
        using (ECDsa privateKey = cert.GetECDsaPrivateKey())
        {
            return privateKey.SignData(data, HashAlgorithmName.SHA512);
        }
    }

    public static byte[] SignECDsaSha512(byte[] data, ECDsa privateKey)
    {
        return privateKey.SignData(data, HashAlgorithmName.SHA512);
    }
}
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates

Public Class Net461Code
    Public Shared Function SignECDsaSha512(data As Byte(), cert As X509Certificate2) As Byte()
        Using privateKey As ECDsa = cert.GetECDsaPrivateKey()
            Return privateKey.SignData(data, HashAlgorithmName.SHA512)
        End Using
    End Function

    Public Shared Function SignECDsaSha512(data As Byte, privateKey As ECDsa) As Byte()
        Return privateKey.SignData(data, HashAlgorithmName.SHA512)
    End Function
End Class

Это обеспечивает заметное отличие от кода, необходимого для создания подписи в .NET Framework 4.6.

using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

public class Net46Code
{
    public static byte[] SignECDsaSha512(byte[] data, X509Certificate2 cert)
    {
        // This would require using cert.Handle and a series of p/invokes to get at the
        // underlying key, then passing that to a CngKey object, and passing that to
        // new ECDsa(CngKey).  It's a lot of work.
        throw new Exception("That's a lot of work...");
    }

    public static byte[] SignECDsaSha512(byte[] data, ECDsa privateKey)
    {
        // This way works, but SignData probably better matches what you want.
        using (SHA512 hasher = SHA512.Create())
        {
            byte[] signature1 = privateKey.SignHash(hasher.ComputeHash(data));
        }

        // This might not be the ECDsa you got!
        ECDsaCng ecDsaCng = (ECDsaCng)privateKey;
        ecDsaCng.HashAlgorithm = CngAlgorithm.Sha512;
        return ecDsaCng.SignData(data);
    }
}
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates

Public Class Net46Code
    Public Shared Function SignECDsaSha512(data As Byte(), cert As X509Certificate2) As Byte()
        ' This would require using cert.Handle and a series of p/invokes to get at the
        ' underlying key, then passing that to a CngKey object, and passing that to
        ' new ECDsa(CngKey).  It's a lot of work.
        Throw New Exception("That's a lot of work...")
    End Function

    Public Shared Function SignECDsaSha512(data As Byte(), privateKey As ECDsa) As Byte()
        ' This way works, but SignData probably better matches what you want.
        Using hasher As SHA512 = SHA512.Create()
            Dim signature1 As Byte() = privateKey.SignHash(hasher.ComputeHash(data))
        End Using

        ' This might not be the ECDsa you got!
        Dim ecDsaCng As ECDsaCng = CType(privateKey, ECDsaCng)
        ecDsaCng.HashAlgorithm = CngAlgorithm.Sha512
        Return ecDsaCng.SignData(data)
    End Function
End Class

ADO.NET

В ADO.NET добавлены следующие возможности.

Поддержка Always Encrypted (постоянного шифрования) для аппаратно защищенных ключей

Теперь ADO.NET поддерживает хранение главных ключей столбца Always Encrypted непосредственно в аппаратных модулях безопасности (HSM). Благодаря этому клиенты могут использовать асимметричные ключи, хранящиеся в аппаратных модулях безопасности, без необходимости написания специальных поставщиков хранилища главных ключей и их регистрации в приложениях.

Для доступа к данным Always Encrypted, защищенным с помощью главных ключей столбца, хранящихся в аппаратном модуле безопасности, клиенты должны установить на серверах приложений или клиентских компьютерах предоставленный производителем аппаратного модуля безопасности поставщик служб шифрования или поставщики хранилища ключей CNG.

Улучшенное поведение при подключении MultiSubnetFailover для AlwaysOn

SqlClient теперь автоматически обеспечивает более быстрое подключение к группе доступности (AG) AlwaysOn. Он прозрачно определяет, подключается ли ваше приложение к группе доступности AlwaysOn в другой подсети, и быстро обнаруживает текущий активный сервер и обеспечивает подключение к этому серверу. В предыдущих версиях строка подключения приложения должна была включать "MultisubnetFailover=true" для указания, что это приложение подключается к группе доступности AlwaysOn. При подключении приложения к группе доступности AlwaysOn без установки значения true для этого ключевого слова подключения время ожидания может быть превышено. В этом выпуске больше не требуется, чтобы приложение устанавливало MultiSubnetFailover в значение true. Дополнительные сведения о поддержке SqlClient для групп доступности Always On см. в разделе Поддержка SqlClient для высокого уровня доступности и аварийного восстановления.

Windows Presentation Foundation (WPF)

Windows Presentation Foundation содержит ряд улучшений и изменений.

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

В .NET Framework 4.6.1 была исправлена задержка при срабатывании событий касания. Кроме того, ввод в элементе управления RichTextBox больше не препятствует обрабатывающему потоку при быстром вводе данных.

Улучшения проверки орфографии

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

Как и в предыдущих версиях .NET Framework, язык элемента управления TextBox или блока RichTextBox определяется поиском сведений в следующем порядке:

  • xml:lang, если имеется;

  • текущий язык ввода;

  • текущие язык и региональные параметры.

Дополнительные сведения о языковой поддержке в WPF см. в публикации в блоге WPF, посвященной компонентам .NET Framework 4.6.1.

Дополнительная поддержка индивидуально настраиваемых словарей

В .NET Framework 4.6.1 WPF распознает настраиваемые словари, зарегистрированные глобально. Эта возможность доступна наряду с возможностью их регистрации на уровне элемента управления.

В предыдущих версиях WPF настраиваемые словари не распознавали исключенные слова и списки автозамены. Эти возможности поддерживаются в Windows 8.1 и Windows 10 благодаря использованию файлов, которые могут быть помещены в каталог %AppData%\Microsoft\Spelling\<language tag>. К этим файлам применяются следующие правила.

  • Файлы должны иметь расширения DIC (для добавленных слов), EXC (для исключенных слов) или ACL (для автозамены).

  • Файлы должны представлять собой открытый текст в кодировке UTF-16 LE, который начинается с метки порядка байтов (BOM).

  • Каждая строка должна состоять из слова (в списках добавленных и исключенных слов) или пары автозамены с словами, разделенными вертикальной чертой ("|") (в списке слов автозамены).

  • Эти файлы считаются доступными только для чтения и не изменяются системой.

Примечание

Эти новые форматы файлов не поддерживаются непосредственно API-интерфейсами проверки орфографии WPF, и настраиваемые словари, передаваемые в WPF в приложениях, должны продолжать использовать LEX-файлы.

Примеры

Ряд примеров для WPF доступен в GitHub-репозитории Microsoft/WPF-Samples. Помогите нам улучшить наши примеры, отправив нам запрос на включение внесенных изменений или открыв вопрос GitHub.

Расширения DirectX

WPF включает пакет NuGet, предоставляющий новые реализации D3DImage, которые упрощают взаимодействие с содержимым DX10 и Dx11. Код для этого пакета открыт и доступен на GitHub.

Windows Workflow Foundation: Транзакции

Метод Transaction.EnlistPromotableSinglePhase теперь может использовать для повышения уровня транзакции диспетчер распределенных транзакций, отличный от MSDTC. Для этого нужно указать идентификатор GUID транзакции в новой Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification, Guid) перегрузке. В случае успешного выполнения операции на возможности транзакции накладываются определенные ограничения. После прикрепления отличного от MSDTC диспетчера транзакций следующие методы вызывают исключение TransactionPromotionException, так как эти методы требуют повышения до MSDTC.

После прикрепления отличного от MSDTC диспетчера транзакций он должен использоваться для будущих долговременных прикреплений с использованием протоколов, которые он задает. Идентификатор Guid диспетчера транзакций можно получить с помощью свойства PromoterType. Когда выполняется повышение уровня транзакции, диспетчер транзакций предоставляет массив Byte, представляющий токен повышенного уровня. Приложение может получить этот токен повышенного уровня для транзакции, уровень которой повышается отличным от MSDTC диспетчером транзакций, с помощью метода GetPromotedToken.

Пользователи новой перегрузки Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification, Guid) должны придерживаться определенной последовательности вызовов для успешного завершения операции повышения уровня. Эти правила описаны в документации по данному методу.

Профилирование

В API-интерфейс неуправляемого профилирования внесены следующие изменения.

  • Улучшена поддержка доступа к PDB-файлам в интерфейсе ICorProfilerInfo7.

    В ASP.NET Core сборки все чаще компилируются в памяти с использованием Roslyn. Для разработчиков средств профилирования это означает, что PDB-файлы, которые ранее были сериализованы на диске, могут больше не присутствовать. Средства профилирования часто используют PDB-файлы для сопоставления кода с исходными строками для таких задач, как анализ покрытия кода или построковый анализ производительности. Интерфейс ICorProfilerInfo7 теперь включает два новых метода, ICorProfilerInfo7::GetInMemorySymbolsLength и ICorProfilerInfo7::ReadInMemorySymbols, для предоставления этим средствам профилирования доступа к данным PDB-файлов в памяти. С помощью новых API профилировщик может получить содержимое PDB-файлов в памяти в виде массива байтов, а затем обработать его или сериализовать на диск.

  • Улучшено инструментирование с использованием интерфейса ICorProfiler.

    Профилировщики, использующие функциональность ReJit API ICorProfiler для динамического инструментирования, теперь могут изменять некоторые метаданные. Ранее такие средства могли инструментировать IL в любое время, но метаданные могли изменяться только во время загрузки модуля. Поскольку IL ссылается на метаданные, это ограничивает типы инструментирования, которое может выполняться. Мы отменили некоторые из этих ограничений, добавив метод ICorProfilerInfo7::ApplyMetaData для поддержки подмножества правок метаданных после загрузки модуля, в частности путем добавления новых записей AssemblyRef, TypeRef, TypeSpec, MemberRef, MemberSpec и UserString. Это изменение существенно расширяет спектр возможного динамического инструментирования.

PDB-файлы генератора образов в машинном коде (NGEN)

Трассировка событий между компьютерами позволяет клиентам профилировать программу на компьютере А и просматривать данные профилирования с сопоставлением исходных строк на компьютере Б. Используя предыдущие версии .NET Framework, пользователь может копировать все модули и образы в машинном коде из профилируемого компьютера на компьютер анализа, содержащий PDB-файл IL, для создания сопоставления "источник-машинный код". Хотя этот процесс может хорошо работать в том случае, если файлы относительно невелики, например для телефонных приложений, на настольных системах эти файлы могут быть очень большими, и на их копирование потребуется значительное время.

С помощью PDB-файлов Ngen NGen может создать PDB-файл, содержащий сопоставления "IL-машинный код" без зависимости от PDB-файла IL. В нашем сценарии трассировки событий между компьютерами все, что требуется, — это скопировать PDB-файл образа в машинном коде, созданный на компьютере А, на компьютер Б, а затем использовать API доступа к интерфейсу отладки для чтения сопоставления "машинный код-IL" PDB-файла IL и сопоставления "IL-машинный код" PDB-файла образа в машинном коде. Объединение обоих сопоставлений обеспечивает сопоставление "источник-машинный код". Поскольку PDB-файл образа в машинном коде PDB намного меньше, чем все модули и образы в машинном коде, процесс копирования с компьютера А на компьютер Б выполняется гораздо быстрее.

Новые возможности .NET 2015

.NET 2015 включает .NET Framework 4.6 и .NET Core. Некоторые функции применяются к обеим версиям, а некоторые только к .NET Framework 4.6 или .NET Core.

  • ASP.NET Core

    .NET 2015 включает ASP.NET Core — экономичную реализацию .NET для создания современных облачных приложений. Платформа ASP.NET Core является модульной, поэтому вы можете включить только те функции, которые нужны в вашем приложении. Она может быть размещена в IIS или резидентно в пользовательском процессе, и вы можете запустить приложения с разными версиями .NET Framework на одном сервере. В нее входит новая система конфигурации среды, предназначенная для развертывания облака.

    MVC, веб-API и веб-страницы объединены в одну платформу, которая называется MVC 6. Сборка приложений ASP.NET Core выполняется с помощью инструментов Visual Studio 2015 или более поздних версий. Уже существующие приложения будут работать на новой платформе .NET Framework, однако для сборки приложения, использующего MVC 6 или SignalR 3, необходима система проектов Visual Studio 2015 и последующих выпусков.

    См. дополнительные сведения об ASP.NET Core.

  • Обновления ASP.NET

    • API на основе задач для асинхронной очистки ответов

      ASP.NET теперь предоставляет простой API на основе задач для асинхронной очистки ответов, HttpResponse.FlushAsync, который позволяет асинхронно сбрасывать ответы, используя поддержку операторов async/await языка программирования.

    • Привязка модели поддерживает методы, возвращающие задачи

      В версии .NET Framework 4.5 в ASP.NET добавлена функция привязки модели, которая обеспечивает расширяемый, ориентированный на код подход к операциям с данными CRUD на страницах веб-форм и пользовательских элементов управления. Система привязки модели теперь поддерживает возвращающие Task методы привязки модели. Эта функция позволяет разработчикам веб-форм сочетать преимущества масштабируемости асинхронного программирования с простотой системы привязки данных при использовании более новых версий моделей ORM, включая Entity Framework.

      Асинхронная привязка модели управляется параметром конфигурации aspnet:EnableAsyncModelBinding.

      <appSettings>
          <add key=" aspnet:EnableAsyncModelBinding" value="true|false" />
      </appSettings>
      

      Для приложений, предназначенных для .NET Framework 4.6, по умолчанию используется значение true. Для приложений, выполняющихся в .NET Framework 4.6, но предназначенных для более ранних версий .NET Framework, по умолчанию используется значение false. Включить этот режим можно, задав для параметра конфигурации значение true.

    • Поддержка HTTP/2 (Windows 10)

      HTTP/2 — это новая версия протокола HTTP, которая обеспечивает более эффективное подключение (меньшее число круговых путей между клиентом и сервером) и уменьшение задержки при загрузке веб-страницы для пользователей. HTTP/2 обеспечивает максимальное преимущество для веб-страниц (по сравнению со службами), так как оптимизирует запрос различных артефактов в ходе одной операции. В .NET Framework 4.6 добавлена поддержка HTTP/2 в ASP.NET. Так как сетевые функции существуют на нескольких уровнях, для новых компонентов в Windows, IIS и ASP.NET потребовалось включить HTTP/2. Для использования HTTP/2 с ASP.NET приложение должно выполняться в Windows 10.

      Протокол HTTP/2 также поддерживается и включен по умолчанию для приложений универсальной платформы Windows (UWP) для Windows 10, использующих API System.Net.Http.HttpClient.

      Чтобы обеспечить способ использования компонента PUSH_PROMISE в приложениях ASP.NET, в класс HttpResponse добавлен новый метод с двумя перегрузками, PushPromise(String) и PushPromise(String, String, NameValueCollection).

      Примечание

      Хотя ASP.NET Core поддерживает HTTP/2, поддержка функции PUSH PROMISE пока не добавлена.

      Всю работу выполняют браузер и веб-сервер (IIS в Windows). Нет необходимости перекладывать нагрузку на пользователей.

      Большинство основных браузеров поддерживает HTTP/2, поэтому вполне вероятно, что пользователи смогут воспользоваться преимуществами протокола HTTP/2, если его поддерживает ваш сервер.

    • Поддержка протокола привязки токенов

      Корпорация Майкрософт и Google совместно работают над созданием нового подхода к проверке подлинности, называемого протоколом привязки токенов, или Token Binding Protocol. Предполагается, что токены проверки подлинности (в кэше браузера) могут быть украдены и использованы злоумышленниками для получения доступа к защищенным в иных обстоятельствах ресурсам (например, к вашему банковскому счету) без помощи пароля или других конфиденциальных сведений. Новый протокол предназначен для устранения этой проблемы.

      Протокол привязки токенов будет реализован в Windows 10 в качестве компонента браузера. Приложения ASP.NET будут участвовать в протоколе для подтверждения действительности токенов проверки подлинности. Реализации клиента и сервера будут обеспечивать комплексную защиту, заданную этим протоколом.

    • Алгоритм случайного хэширования строк

      В .NET Framework 4.5 добавлен алгоритм случайного хэширования строк. Однако он не поддерживается ASP.NET, так как некоторые компоненты ASP.NET зависят от стабильного хэш-кода. В .NET Framework 4.6 теперь поддерживаются алгоритмы случайного хэширования строк. Чтобы включить эту функцию, используйте параметр конфигурации aspnet:UseRandomizedStringHashAlgorithm.

      <appSettings>
          <add key="aspnet:UseRandomizedStringHashAlgorithm" value="true|false" />
      </appSettings>
      
  • ADO.NET

    ADO .NET теперь поддерживает функцию Always Encrypted, которая доступна в SQL Server 2016. Благодаря функции Always Encrypted SQL Server может выполнять операции с зашифрованными данными, и, что важнее всего, ключ шифрования хранится в самом приложении в доверенной среде клиента, а не на сервере. Функция «Всегда зашифровано» защищает данные клиента, поэтому администраторы базы данных не имеют доступа к данным в формате обычного текста. Шифрование и расшифровка данных происходит прозрачно на уровне драйвера, что сводит к минимуму изменения, которые должны быть выполнены для существующих приложений. Дополнительные сведения см. в разделах Always Encrypted (ядро СУБД) и Постоянное шифрование (разработка клиентских приложений).

  • 64-разрядный компилятор JIT для управляемого кода

    В .NET Framework 4.6 представлена новая версия 64-разрядного JIT-компилятора (исходное кодовое имя — RyuJIT). Новый 64-разрядный компилятор имеет значительно большую производительность, чем предыдущий 64-разрядный JIT-компилятор. Новый 64-разрядный компилятор включен для 64-разрядных процессов, выполняющихся на основе .NET Framework 4.6. Приложение будет работать в 64-разрядном процессе, если оно скомпилировано как 64-разрядное или AnyCPU и выполняется в 64-разрядной операционной системе. Хотя приняты все необходимые меры, чтобы обеспечить как можно более прозрачный переход на новый компилятор, возможны изменения в поведении.

    Новый 64-разрядный JIT-компилятор также включает функции аппаратного ускорения SIMD при работе с типами с поддержкой SIMD в пространстве имен System.Numerics, что может обеспечить неплохое повышение производительности.

  • Усовершенствования загрузчика сборок

    Загрузчик сборок теперь более эффективно использует память благодаря выгрузке сборок IL после загрузки соответствующего образа NGEN. Это изменение снижает использование виртуальной памяти, что особенно полезно для больших 32-разрядных приложений (например, Visual Studio); кроме того, оно обеспечивает экономию физической памяти.

  • Изменения библиотеки с базовым классом

    В .NET Framework 4.6 были добавлены многие новые API для поддержки важных сценариев. Внесены следующие изменения и дополнения.

    • Реализации IReadOnlyCollection < T >

      Дополнительные коллекции реализуют IReadOnlyCollection<T>, например Queue<T> и Stack<T>.

    • CultureInfo.CurrentCulture и CultureInfo.CurrentUICulture

      Свойства CultureInfo.CurrentCulture и CultureInfo.CurrentUICulture теперь доступны для чтения и записи, а не только для чтения. При назначении нового объекта CultureInfo этим свойствам язык и региональные параметры текущего потока, определенные свойством Thread.CurrentThread.CurrentCulture, и язык и региональные параметры текущего потока пользовательского интерфейса, определенные свойствами Thread.CurrentThread.CurrentUICulture, также изменяются.

    • Усовершенствования сборки мусора

      Класс GC теперь включает методы TryStartNoGCRegion и EndNoGCRegion, которые позволяют запретить сбор мусора во время выполнения критического пути.

      Новая перегрузка метода GC.Collect(Int32, GCCollectionMode, Boolean, Boolean) позволяет контролировать, выполняется ли очистка и сжатие кучи мелких объектов и кучи больших объектов или только очистка.

    • Типы с поддержкой SIMD

      Пространство имен System.Numerics теперь включает различные типы с поддержкой SIMD, например Matrix3x2, Matrix4x4, Plane, Quaternion, Vector2, Vector3 и Vector4.

      Поскольку новый 64-разрядный JIT-компилятор также включает функции аппаратного ускорения SIMD, особенно значительное повышение производительности обеспечивается при использовании типов с поддержкой SIMD с новым 64-разрядным JIT-компилятором.

    • Обновления шифрования

      API System.Security.Cryptography обновляется для поддержки API шифрования CNG Windows. Предыдущие версии .NET Framework полностью зависели от более ранних версий API шифрования Windows для реализации System.Security.Cryptography. Мы получали много запросов на реализацию поддержки API CNG, так как он поддерживает современные алгоритмы шифрования, что очень важно для некоторых категорий приложений.

      В .NET Framework 4.6 добавлены следующие новые улучшения для поддержки API шифрования CNG Windows:

      • Набор методов расширения для сертификатов X509, System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPublicKey(System.Security.Cryptography.X509Certificates.X509Certificate2) и System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPrivateKey(System.Security.Cryptography.X509Certificates.X509Certificate2), которые возвращают реализацию на основе CNG, а не реализацию на основе CAPI (по возможности). (Некоторые смарт-карты и т. д. по-прежнему требуют CAPI, и API-интерфейсы обрабатывают резервный вариант.)

      • Класс System.Security.Cryptography.RSACng, который обеспечивает реализацию CNG алгоритма RSA.

      • Улучшения API RSA, позволяющие отказаться от обязательного приведения общих действий. Например, для шифрования данных с помощью объекта X509Certificate2 в предыдущих версиях платформы .NET Framework требуется код, аналогичный следующему.

        RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey;
        byte[] oaepEncrypted = rsa.Encrypt(data, true);
        byte[] pkcs1Encrypted = rsa.Encrypt(data, false);
        
        Dim rsa As RSACryptoServiceProvider = CType(cert.PrivateKey, RSACryptoServiceProvider)
        Dim oaepEncrypted() As Byte = rsa.Encrypt(data, True)
        Dim pkcs1Encrypted() As Byte = rsa.Encrypt(data, False)
        

        Код, использующий новые API шифрования в .NET Framework 4.6, можно переписать следующим образом, чтобы избежать приведения.

        RSA rsa = cert.GetRSAPrivateKey();
        if (rsa == null)
           throw new InvalidOperationException("An RSA certificate was expected");
        
        byte[] oaepEncrypted = rsa.Encrypt(data, RSAEncryptionPadding.OaepSHA1);
        byte[] pkcs1Encrypted = rsa.Encrypt(data, RSAEncryptionPadding.Pkcs1);
        
        Dim rsa As RSA = cert.GetRSAPrivateKey()
        If rsa Is Nothing Then
            Throw New InvalidOperationException("An RSA certificate was expected")
        End If
        
        Dim oaepEncrypted() As Byte = rsa.Encrypt(data, RSAEncryptionPadding.OaepSHA1)
        Dim pkcs1Encrypted() As Byte = rsa.Encrypt(data, RSAEncryptionPadding.Pkcs1)
        
    • Поддержка преобразования даты и времени в формат времени Unix и обратно

      Следующие новые методы были добавлены в структуру DateTimeOffset для поддержки преобразования значений даты и времени в формат Unix или из него.

    • Параметры совместимости

      Класс AppContext добавляет новый компонент совместимости, который позволяет авторам библиотек предоставлять согласованный механизм явного отказа для новых функциональных возможностей. Он устанавливает слабо связанный контракт между компонентами для передачи запроса на явный отказ. Эта возможность обычно важна при внесении изменений в существующие функции. В свою очередь, режим неявного согласия для новых функциональных возможностей уже существует.

      В AppContext библиотеки определяют и предоставляют параметры совместимости, а код, который от них зависит, может устанавливать эти параметры для влияния на поведение библиотек. По умолчанию библиотеки предоставляют новые функции и изменяют их (то есть предоставляют прежние функции) только в том случае, если установлен параметр.

      Приложение (или библиотека) может объявить значение параметра (который всегда имеет значение Boolean), определяемое зависимой библиотекой. Параметр всегда имеет неявное значение false. Установка значения true для параметра включает его. Явно задание значения false для параметра определяет новое поведение.

      AppContext.SetSwitch("Switch.AmazingLib.ThrowOnException", true);
      
      AppContext.SetSwitch("Switch.AmazingLib.ThrowOnException", True)
      

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

      if (!AppContext.TryGetSwitch("Switch.AmazingLib.ThrowOnException", out shouldThrow))
      {
          // This is the case where the switch value was not set by the application.
          // The library can choose to get the value of shouldThrow by other means.
          // If no overrides nor default values are specified, the value should be 'false'.
          // A false value implies the latest behavior.
      }
      
      // The library can use the value of shouldThrow to throw exceptions or not.
      if (shouldThrow)
      {
          // old code
      }
      else
      {
          // new code
      }
      
      If Not AppContext.TryGetSwitch("Switch.AmazingLib.ThrowOnException", shouldThrow) Then
          ' This is the case where the switch value was not set by the application.
          ' The library can choose to get the value of shouldThrow by other means.
          ' If no overrides nor default values are specified, the value should be 'false'.
          ' A false value implies the latest behavior.
      End If
      
      ' The library can use the value of shouldThrow to throw exceptions or not.
      If shouldThrow Then
          ' old code
      Else
          ' new code
      End If
      

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

      • параметр. пространство_именимя_параметра

      • параметр.библиотека.имя_параметра

    • Изменения асинхронной модели на основе задач

      Для приложений, предназначенных для .NET Framework 4.6, объекты Task и Task<TResult> наследуют язык и региональные параметры, а также язык и региональные параметры интерфейса пользователя вызывающего потока. Поведение приложений на предыдущих версиях платформы .NET Framework или без определенной версии .NET Framework не затрагивается. Дополнительные сведения см. в подразделе "Язык и региональные параметры в асинхронных операциях на основе задач" раздела, посвященного классу CultureInfo.

      Класс System.Threading.AsyncLocal<T> позволяет представлять внешние данные, локальные для данного асинхронного потока управления, такие как метод async. Его можно использовать для сохранения данных в разных потоках. Кроме того, можно определить метод обратного вызова, который получает уведомление при каждом изменении внешних данных из-за явного изменения свойства AsyncLocal<T>.Value или из-за перехода контекста в потоке.

      Три удобных метода, Task.CompletedTask, Task.FromCanceled и Task.FromException, добавлены в асинхронную модель на основе задач (TAP) для возврата завершенных задач в определенном состоянии.

      Теперь класс NamedPipeClientStream поддерживает асинхронное взаимодействие с новым методом ConnectAsync. метод.

    • EventSource теперь поддерживает запись в журнал событий

      Теперь класс EventSource можно использовать для регистрации в журнале событий административных сообщений или рабочих сообщений в дополнение ко всем существующим сеансам трассировки событий Windows, созданным на компьютере. Раньше для обеспечения этих функций приходилось использовать пакет Microsoft.Diagnostics.Tracing.EventSource NuGet. Эта функция теперь встроена в .NET Framework 4.6.

      Обновления пакета NuGet и .NET Framework 4.6 включают следующие функции:

      • Динамические события

        Возможность определения событий "на лету" без создания методов событий.

      • Разнородные полезные данные

        Возможность передавать массивы и классы со специальными атрибутами, а также типы-примитивы в качестве полезных данных.

      • Отслеживание действий

        События Start и Stop помечают возникающие между ними события идентификатором, который представляет все текущие активные действия.

      Для поддержки этих функций перегруженный метод Write был добавлен в класс EventSource.

  • Windows Presentation Foundation (WPF)

    • Усовершенствования HDPI

      В .NET Framework 4.6 улучшена поддержка HDPI в WPF. В округление макетов внесены изменения для снижения числа вхождений обрезки в элементах управления с границами. По умолчанию эта функция включена, только если для атрибута TargetFrameworkAttribute задано значение .NET Framework 4.6. приложения, предназначенные для более ранних версий платформы, но выполняемые на платформа .NET Framework 4,6, могут использовать новое поведение, добавив следующую строку в < раздел runtime > файла app.config:

      <AppContextSwitchOverrides
      value="Switch.MS.Internal.DoNotApplyLayoutRoundingToMarginsAndBorderThickness=false"
      />
      

      Окна WPF, разнесенные на несколько мониторов с разными параметрами DPI (настройка нескольких параметров разрешения), теперь отображаются полностью, без черных областей. Можно отключить это новое поведение, добавив следующую строку в раздел <appSettings> файла app.config.

      <add key="EnableMultiMonitorDisplayClipping" value="true"/>
      

      В System.Windows.Input.Cursor добавлена поддержка автоматической загрузки правого курсора на основе параметра dpi.

    • Улучшено касание

      В .NET Framework 4.6 решена проблема с касанием, приводившим к непредсказуемому поведению, о которой сообщает клиент на веб-сайте Connect. Пороговое значение двойного касания для приложений Магазина Windows и приложений WPF теперь одинаково в Windows 8.1 и более поздних версий.

    • Поддержка прозрачных дочерних окон

      WPF в .NET Framework 4.6 поддерживает прозрачные дочерние окна в Windows 8.1 и более поздних версий. Это позволяет создавать непрямоугольные и прозрачные дочерние окна в окнах верхнего уровня. Чтобы включить эту функцию, необходимо задать для свойства HwndSourceParameters.UsesPerPixelTransparency значение true.

  • Windows Communication Foundation (WCF)

    • Поддержка SSL

      Теперь WCF помимо SSL 3.0 и TLS 1.0 поддерживает SSL-версии TLS 1.1 и TLS 1.2 при использовании NetTcp с безопасностью транспорта и проверкой подлинности клиента. Теперь можно выбрать, какой протокол использовать, или отключить старые менее безопасные протоколы. Это можно сделать, задав свойство SslProtocols или добавив следующие данные в файл конфигурации.

      <netTcpBinding>
          <binding>
            <security mode= "None|Transport|Message|TransportWithMessageCredential" >
                <transport clientCredentialType="None|Windows|Certificate"
                          protectionLevel="None|Sign|EncryptAndSign"
                          sslProtocols="Ssl3|Tls1|Tls11|Tls12">
                  </transport>
            </security>
          </binding>
      </netTcpBinding>
      
    • Отправка сообщений с помощью разных подключений HTTP

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

      • С помощью префикса имени группы подключений

        Пользователи могут указать строку, которую WCF будет использовать как префикс для имени группы подключений. Два сообщения с разными префиксами отправляются с помощью разных базовых HTTP-подключений. Префикс задается путем добавления пары "ключ-значение" в свойство Message.Properties сообщения. Ключ — это "HttpTransportConnectionGroupNamePrefix"; значение — желаемый префикс.

      • С помощью разных фабрик каналов

        Пользователи могут также включить функцию, которая гарантирует, что сообщения, отправляемые по каналам, созданным разными фабриками каналов, будут отправляться с помощью разных базовых HTTP-подключений. Чтобы включить эту функцию, пользователи должны самостоятельно задать для следующего параметра appSetting значение true.

        <appSettings>
            <add key="wcf:httpTransportBinding:useUniqueConnectionPoolPerFactory" value="true" />
        </appSettings>
        
  • Windows Workflow Foundation (WWF)

    Теперь можно указать интервал (в секундах) удержания службой рабочего процесса внеочередного запроса операции при наличии незавершенной закладки "без протокола" до истечения времени ожидания запроса. Закладка "без протокола" — это закладка, которая не связана с незавершенными действиями получения. Некоторые действия создают закладки без протокола в собственной реализации, поэтому не всегда очевидно, что закладка без протокола существует. К таким действиям относятся State и Pick. Соответственно, при наличии службы рабочего процесса, реализованной с помощью конечного автомата или содержащей действие Pick, вероятнее всего, имеются закладки без протокола. Укажите интервал, добавив строку следующего вида в раздел appSettings файла app.config.

    <add key="microsoft:WorkflowServices:FilterResumeTimeoutInSeconds" value="60"/>
    

    Значение по умолчанию — 60 секунд. Если value имеет значение 0, внеочередные запросы немедленно отклоняются с созданием ошибки с текстом, который выглядит следующим образом.

    Operation 'Request3|{http://tempuri.org/}IService' on service instance with identifier '2b0667b6-09c8-4093-9d02-f6c67d534292' cannot be performed at this time. Please ensure that the operations are performed in the correct order and that the binding in use provides ordered delivery guarantees.
    

    Это же сообщение отображается при получении сообщения о внеочередной операции в отсутствии закладок без протокола.

    Если элемент FilterResumeTimeoutInSeconds имеет ненулевое значение, существуют закладки без протокола и истекает интервал времени ожидания, то происходит сбой операции с сообщением об истечении времени ожидания.

  • Транзакции

    Теперь можно включить идентификатор распределенной транзакции для транзакций, вызвавших создание исключения, производного от TransactionException. Это можно сделать, добавив следующий ключ в раздел appSettings файла app.config:

    <add key="Transactions:IncludeDistributedTransactionIdInExceptionMessage" value="true"/>
    

    Значение по умолчанию — false.

  • Сеть

    • Повторное использование сокета

      Windows 10 включает новый алгоритм сетевых подключений с высокой масштабируемостью, который повышает эффективность использования ресурсов компьютера путем повторного использования локальных портов для исходящих TCP-подключений. .NET Framework 4.6 поддерживает новый алгоритм, который позволяет приложениям .NET использовать преимущества нового поведения. В предыдущих версиях Windows существовало искусственно заданное ограничение числа параллельных подключений (обычно 16 384, размер динамического диапазона портов по умолчанию), которое могло ограничивать масштабируемость службы, вызывая нехватку портов при высокой загрузке.

      В .NET Framework 4.6 добавлены два API, которые обеспечивают повторное использование портов и тем самым снимают ограничение на 64 КБ для одновременных подключений:

      По умолчанию свойство ServicePointManager.ReusePort имеет значение false, если в качестве значения HWRPortReuseOnSocketBind раздела реестра HKLM\SOFTWARE\Microsoft\.NETFramework\v4.0.30319 не задано 0x1. Чтобы включить повторное использование локальных портов для HTTP-подключений, задайте для свойства ServicePointManager.ReusePort значение true. В результате все исходящие подключения сокета TCP от HttpClient и HttpWebRequest будут использовать новый параметр сокета Windows 10, SO_REUSE_UNICASTPORT, который обеспечивает повторное использование локальных портов.

      Разработчики, создающие приложения, работающие только с сокетами, могут указать параметр System.Net.Sockets.SocketOptionName при вызове такого метода, как Socket.SetSocketOption, чтобы исходящие сокеты повторно использовали локальные порты во время привязки.

    • Поддержка международных доменных имен и PunyCode

      В класс Uri добавлено новое свойство IdnHost, обеспечивающее более эффективную поддержку международных доменных имен и PunyCode.

  • Изменение размеров элементов управления Windows Forms.

    Эта функция была расширена в .NET Framework 4.6 и включает типы DomainUpDown, NumericUpDown, DataGridViewComboBoxColumn, DataGridViewColumn и ToolStripSplitButton, а также прямоугольник, указанный свойством Bounds, используемым при рисовании UITypeEditor.

    Это функция, включаемая пользователем. Чтобы ее включить, задайте для элемента EnableWindowsFormsHighDpiAutoResizing в файле конфигурации приложения (app.config) значение true:

    <appSettings>
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
    </appSettings>
    
  • Поддержка кодировок кодовых страниц

    .NET Core в первую очередь поддерживает кодировки Юникод и по умолчанию предоставляет ограниченную поддержку для кодировок кодовых страниц. Вы можете добавить поддержку кодировок кодовых страниц, доступных в .NET Framework, но не поддерживаемых в .NET Core, зарегистрировав эти кодировки в методе Encoding.RegisterProvider. Для получения дополнительной информации см. System.Text.CodePagesEncodingProvider.

  • .NET Native

Приложения универсальной платформы Windows (UWP), написанные на языке C# или Visual Basic, могут использовать новую технологию для компиляции приложений на машинный код, а не на промежуточный язык. Эта технология создает приложения с меньшим временем запуска и выполнения. Дополнительные сведения см. в разделе Компиляция приложений с помощью .NET Native. Общие сведения о .NET Native и рассмотрение отличий такой компиляции от компиляции JIT и NGEN, а также ее влияние на код см. в разделе .NET Native и компиляция.

Приложения по умолчанию компилируются в машинный код при компиляции в Visual Studio 2015 и более поздних версиях. Дополнительные сведения см. в разделе Начало работы с .NET Native.

Для поддержки отладки приложений .NET Native в интерфейс API отладки неуправляемого кода добавлено несколько новых интерфейсов и перечислений. Дополнительные сведения см. в разделе Отладка (справочник по неуправляемым API).

  • Пакеты .NET Framework с открытым исходным кодом

    Пакеты .NET Core, такие как неизменяемые коллекции, API SIMD и API-интерфейсы сетевых подключений, например из пространства имен System.Net.Http, теперь доступны в виде пакетов с открытым кодом на сайте GitHub. Сведения о доступе к этому коду см. в разделе .NET на GitHub. Дополнительные сведения и инструкции по участию в разработке этих пакетов см. в разделе Введение в .NET и на домашней странице .NET в GitHub.

Новые возможности .NET Framework 4.5.2

  • Новые API для приложений ASP.NET. Новые методы HttpResponse.AddOnSendingHeaders и HttpResponseBase.AddOnSendingHeaders позволяют проверять и изменять коды состояния и заголовки ответов при передаче ответа в клиентское приложение. Эти методы можно использовать вместо событий PreSendRequestHeaders и PreSendRequestContent; они более эффективны и надежны.

    Метод HostingEnvironment.QueueBackgroundWorkItem позволяет планировать небольшие фоновые рабочие элементы. ASP.NET отслеживает эти элементы и блокирует резкое прерывание службами IIS рабочего процесса до выполнения всех фоновых рабочих элементов. Этот метод нельзя вызвать за пределами управляемого домена приложений ASP.NET.

    Новые свойства HttpResponse.HeadersWritten и HttpResponseBase.HeadersWritten возвращают логические значения, которые указывают, были ли записаны заголовки ответов. Эти свойства можно использовать, чтобы гарантировать, что вызовы API, например HttpResponse.StatusCode (создает исключения, если заголовки записаны), будут выполняться успешно.

  • Изменение размеров элементов управления Windows Forms. Эта функция была расширена. Теперь системный параметр DPI можно использовать для изменения размера компонентов следующих дополнительных элементов управления (например, стрелки, раскрывающей поле со списком):

    Это функция, включаемая пользователем. Чтобы ее включить, задайте для элемента EnableWindowsFormsHighDpiAutoResizing в файле конфигурации приложения (app.config) значение true:

    <appSettings>
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
    </appSettings>
    
  • Новая функция рабочего процесса. Диспетчер ресурсов, использующий метод EnlistPromotableSinglePhase (и, следовательно, реализующий интерфейс IPromotableSinglePhaseNotification), может использовать новый метод Transaction.PromoteAndEnlistDurable для запроса следующих операций:

    • повышение транзакции до уровня "координатор распределенных транзакций (Майкрософт)" (MSDTC);

    • замена IPromotableSinglePhaseNotification перечислениемISinglePhaseNotification, которое является устойчивым перечислением, поддерживающим одноэтапные фиксации.

    Эту операцию можно выполнить в том же домене приложения; для повышения уровня не требуется написание дополнительного неуправляемого кода для взаимодействия с MSDTC. Новый метод можно вызвать только при наличии ожидающего выполнения вызова из System.Transactions к методу IPromotableSinglePhaseNotificationPromote, который реализуется перечислением, поддерживающим повышение уровня.

  • Усовершенствования профилирования. Следующие новые неуправляемые API профилирования обеспечивают более надежное профилирование:

    Предыдущие реализации ICorProfiler поддерживали отложенную загрузку зависимых сборок. Новые API профилирования требуют немедленной доступности для загрузки вставляемых профилировщиком зависимых сборок вместо их загрузки после полной инициализации приложения. Это изменение не влияет на пользователей существующих API ICorProfiler.

  • Усовершенствования отладки. Следующие новые интерфейсы API отладки неуправляемого кода обеспечивают более эффективную интеграцию с профилировщиком. Теперь можно получить доступ к метаданным, вставленным профилировщиком, а также к локальным переменным и коду, созданным запросами компилировщика ReJIT во время отладки дампа.

  • Изменения трассировки событий. .NET Framework 4.5.2 поддерживает внепроцессную трассировку действий, основанную на трассировке событий Windows (ETW), для более крупных контактных зон. Это позволяет поставщикам решений автоматического управления питанием (АРМ) предлагать облегченные средства, точно отслеживающие стоимость отдельных запросов и действий в разных потоках. Эти события вызываются только при включении их контроллерами ETW. Таким образом, изменения не влияют на ранее написанный код ETW или код, который выполняется при отключенной трассировке ETW.

  • Повышение уровня транзакции и преобразование ее в устойчивое зачисление

    Transaction.PromoteAndEnlistDurable — это новый API, добавленный в .NET Framework версий 4.5.2 и 4.6.

    [System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name = "FullTrust")]
    public Enlistment PromoteAndEnlistDurable(Guid resourceManagerIdentifier,
                                              IPromotableSinglePhaseNotification promotableNotification,
                                              ISinglePhaseNotification enlistmentNotification,
                                              EnlistmentOptions enlistmentOptions)
    
    <System.Security.Permissions.PermissionSetAttribute(System.Security.Permissions.SecurityAction.LinkDemand, Name:="FullTrust")>
    public Function PromoteAndEnlistDurable(resourceManagerIdentifier As Guid,
                                            promotableNotification As IPromotableSinglePhaseNotification,
                                            enlistmentNotification As ISinglePhaseNotification,
                                            enlistmentOptions As EnlistmentOptions) As Enlistment
    

    Метод может использоваться зачислением, ранее созданным Transaction.EnlistPromotableSinglePhase в ответ на метод ITransactionPromoter.Promote. Он запрашивает у System.Transactions повышение уровня транзакции до транзакции MSDTC и "преобразование" зачисления, допускающего повышение уровня, в зачисление устойчивых ресурсов. После успешного завершения этого метода System.Transactions больше не будет ссылаться на интерфейс IPromotableSinglePhaseNotification, и все будущие уведомления будут поступать в предоставленном интерфейсе ISinglePhaseNotification. Рассматриваемое зачисление должно работать как зачисление устойчивых ресурсов, поддерживая ведение журнала транзакций и восстановления. Подробные сведения см. в разделе Transaction.EnlistDurable. Кроме того, зачисление должно поддерживать ISinglePhaseNotification. Этот метод может вызываться только во время обработки вызова ITransactionPromoter.Promote. Если это не так, создается исключение TransactionException.

Новые возможности .NET Framework 4.5.1

Обновления апреля 2014 г. :

  • Обновление 2 для Visual Studio 2013 включает обновления для шаблонов переносимой библиотеки классов для поддержки следующих сценариев:

    • Возможность использовать API среды выполнения Windows в переносимых библиотеках, предназначенных для Windows 8.1, Windows Phone 8.1 и Windows Phone Silverlight 8.1.

    • возможность включить XAML-код (типы Windows.UI.XAML) в переносимые библиотеки, предназначенные для Windows 8.1 или Windows Phone 8.1. Поддерживаются следующие шаблоны XAML: "Пустая страница", "Словарь ресурсов", "Шаблонный элемент управления" и "Пользовательский элемент управления".

    • Можно создать переносной компонент среды выполнения Windows (WINMD-файл) для использования в приложениях магазинов, предназначенных для Windows 8.1 и Windows Phone 8.1.

    • Можно изменить целевую платформу библиотеки классов Магазина Windows или Магазина Windows Phone, такой как переносимая библиотека классов.

    Дополнительные сведения об этих изменениях см. в разделе Переносимая библиотека классов.

  • Набор содержимого .NET Framework теперь включает документацию для .NET Native. Это технология предварительной компиляции для сборки и развертывания приложений Windows. .NET Native компилирует приложения напрямую в машинный код, а не в промежуточный язык (IL), что повышает производительность. Подробные сведения см. в разделе Компиляция приложений с помощью .NET Native.

  • На странице .NET Framework Reference Source предоставляются новые возможности навигации и расширенные функции. Теперь можно искать исходный код .NET Framework в Интернете, загрузить справочник для автономной работы и пошагово просматривать источники (включая исправления и обновления) во время отладки. Дополнительные сведения см. в записи блога Новый облик .NET Reference Source.

Новые функции и улучшения базовых классов в .NET Framework 4.5.1 включают следующее:

  • Автоматическая переадресация привязки для сборок. Начиная с версии Visual Studio 2013 при компиляции приложения, ориентированного на .NET Framework 4.5.1, в файл конфигурации приложения можно добавить переадресации привязок, если приложение или его компоненты ссылаются на несколько версий одной и той же сборки. Включить эту функцию также можно для проектов, предназначенных для более ранних версий платформы .NET Framework. Дополнительные сведения см. в разделе Практическое руководство. Включение и отключение автоматического перенаправления привязки.

  • Возможность сбора диагностической информации, чтобы помочь разработчикам повысить производительность серверных и облачных приложений. Дополнительные сведения см. в описании методов WriteEventWithRelatedActivityId и WriteEventWithRelatedActivityIdCore класса EventSource.

  • Возможность явно уплотнять кучу больших объектов во время сборки мусора. Дополнительные сведения см. в описании свойства GCSettings.LargeObjectHeapCompactionMode.

  • Дополнительные улучшения производительности, например приостановка приложений ASP.NET, усовершенствования многоядерного JIT и более быстрый запуск приложений после обновления платформы .NET Framework. Дополнительные сведения см. в объявлении о выходе .NET Framework 4.5.1 и в публикации в блоге о приостановке приложения ASP.NET.

Усовершенствования в Windows Forms включают следующие:

  • Изменение размеров элементов управления Windows Forms. Системный параметр DPI можно использовать для изменения размера компонентов элементов управления (например, значков, которые отображаются в сетке свойств) путем явного включения с помощью записи в файле конфигурации приложения (app.config) нужного приложения. Эта функция в настоящее время поддерживается для следующих элементов управления Windows Forms:

    Чтобы включить эту функцию, добавьте новый < Элемент appSettings > в файл конфигурации (app.config) и задайте EnableWindowsFormsHighDpiAutoResizing для true элемента следующее значение:

    <appSettings>
        <add key="EnableWindowsFormsHighDpiAutoResizing" value="true" />
    </appSettings>
    

В процесс отладки приложений .NET Framework в Visual Studio 2013 внесены следующие улучшения.

  • Возвращаемые значения в отладчике Visual Studio. При отладке управляемого приложения в Visual Studio 2013 в окне "Видимые" отображаются возвращаемые типы и значения для методов. Эти сведения доступны для приложений для настольных систем, приложений для Магазина Windows и приложений Windows Phone. Дополнительные сведения см. в статье Анализ значений, возвращаемых из вызовов методов.

  • "Изменить и продолжить" для 64-разрядных приложений. Visual Studio 2013 поддерживает действие "Изменить и продолжить" для 64-разрядных управляемых приложений для настольных систем, приложений для Магазина Windows и приложений для Windows Phone. Существующие ограничения остаются действующими и для 32-разрядных, и для 64-разрядных приложений (см. последний раздел статьи Поддерживаемые изменения кода (C#)).

  • Отладка с поддержкой асинхронности. Чтобы упростить отладку асинхронных приложений в Visual Studio 2013, стеке вызовов скрывает код инфраструктуры, предоставляемый компиляторами для поддержки асинхронного программирования, а также цепочки логических родительских кадров, что упрощает прослеживание логики выполнения программы. В окне "Задачи", которое заменяет собой окно "Параллельные задачи", отображаются задачи, относящиеся к определенной точке останова, а также все другие задачи, которые в данный момент активны или запланированы в приложении. Вы можете прочесть об этой возможности в разделе "Отладка с поддержкой асинхронности" объявления о выходе .NET Framework 4.5.1.

  • Усовершенствованная поддержка исключений для компонентов среды выполнения Windows. В Windows 8.1 все исключения, возникающие в приложениях для Магазина Windows, сохраняют сведения об ошибке, которая вызвала исключение, даже при переходе через границы языков. Вы можете прочесть об этой возможности в разделе "Разработка приложений для Магазина Windows" объявления о выходе .NET Framework 4.5.1.

Начиная с Visual Studio 2013 вы можете использовать Управляемое средство профильной оптимизации (Mpgo.exe) для оптимизации приложений для Магазина Windows 8.x и для настольных систем.

См. новые возможности ASP.NET 4.5.1 в статье Заметки о выпуске ASP.NET and Web Tools для Visual Studio 2013.

Новые возможности .NET Framework 4.5

базовых классов;

  • Возможность уменьшения количества перезапусков системы путем обнаружения и закрытия приложений .NET Framework 4 во время развертывания. См. раздел Уменьшение числа перезагрузок при установке платформы .NET Framework 4.5.

  • Поддержка массивов, размер которых превышает 2 ГБ, на 64-разрядных платформах. Эту функцию можно включить в файле конфигурации приложения. < См. элемент gcAllowVeryLargeObjects >, в котором также перечислены другие ограничения на размер объекта и размер массива.

  • Улучшенная производительность благодаря фоновой сборке мусора для серверов. Если вы используете серверную сборку мусора в .NET Framework 4.5, фоновая сборка мусора включается автоматически. Сведения см. в разделе "Фоновая сборка мусора сервера" статьи Основы сборки мусора.

  • Фоновая компиляция по требованию (JIT), которая доступна по выбору на многоядерных процессорах для повышения производительности приложения. См. раздел ProfileOptimization.

  • Возможность ограничения времени, в течение которого обработчик регулярных выражений будет пытаться разрешить регулярное выражение до истечения срока действия выражения. См. свойство Regex.MatchTimeout.

  • Возможность определить язык и региональные параметры по умолчанию для домена приложения. См. класс CultureInfo.

  • Консольная поддержка кодировки Юникод (UTF-16). См. класс Console.

  • Поддержка управления версиями данных сортировки и сравнения строк, зависящих от языка и региональных параметров. См. класс SortVersion.

  • Улучшенная производительность при извлечении ресурсов. См. Упаковка и развертывание ресурсов.

  • Усовершенствования в области сжатия ZIP, позволяющие уменьшить размер сжатого файла. См. пространство имен System.IO.Compression.

  • Возможность настраивать контекст отражения для переопределения поведения отражения по умолчанию с помощью класса CustomReflectionContext.

  • Поддержка версии 2008 международного доменного имени в приложениях (IDNA), если System.Globalization.IdnMapping класс используется в Windows 8.

  • Делегирование сравнения строк операционной системе, которая реализует Юникод 6.0, при использовании .NET Framework в среде Windows 8. При работе на других платформах .NET Framework включает собственные данные сравнения строк, которые реализуют Юникод 5.x. См. класс String и раздел "Примечания" в описании класса SortVersion.

  • Возможность вычисления хэш-кодов для строк для каждого домена приложения. См < . элемент UseRandomizedStringHashAlgorithm >.

  • Поддержка отражения типов, разделенная между классами Type и TypeInfo. См. раздел Отражение в .NET Framework для приложений Магазина Windows.

Managed Extensibility Framework (MEF)

В .NET Framework 4.5 для Managed Extensibility Framework (MEF) предоставлены следующие новые возможности:

  • Поддержка универсальных типов.

  • Модель программирования на основе соглашений, позволяющая создавать части на основе соглашений об именах, а не на основе атрибутов.

  • Множественные области действия.

  • Подмножество MEF, которое можно использовать при создании приложений для Магазина Windows 8.x. Это подмножество доступно как загружаемый пакет из коллекции NuGet. Чтобы установить пакет, откройте проект в Visual Studio, выберите Управление пакетами NuGet в меню Проект и выполните поиск пакета Microsoft.Composition в Интернете.

Дополнительные сведения см. в разделе Managed Extensibility Framework.

Асинхронные операции с файлами

В .NET Framework 4.5 добавлены новые асинхронные возможности в языки C# и Visual Basic. Эти возможности представляют собой модель на основе задач для выполнения асинхронных операций. Для использования этой новой модели используйте асинхронные методы в классах ввода-вывода. См. раздел Асинхронные операции файлового ввода-вывода.

Инструменты

В .NET Framework 4.5 генератор файлов ресурсов (Resgen.exe) позволяет преобразовать RESOURCES-файл, внедренный в сборку .NET Framework, в RESW-файл для использования в приложениях Магазина Windows 8.x. Дополнительные сведения см. в разделе Resgen.exe (генератор файлов ресурсов).

Средство управляемой оптимизации с использованием профиля (Mpgo.exe) позволяет сократить время запуска приложения, улучшить использование памяти (размер рабочего множества) и пропускную способность путем оптимизации сборок машинных образов. Этот инструмент командной строки формирует данные профилирования для сборок машинного образа приложения. См. раздел Mpgo.exe (инструмент управляемой оптимизации с использованием профиля). Начиная с Visual Studio 2013 вы можете использовать средство Mpgo.exe для оптимизации приложений для Магазина Windows 8.x и для настольных систем.

Параллельные вычисления

В .NET Framework 4.5 предусмотрено несколько новых возможностей и усовершенствований для параллельных вычислений. К ним относятся повышение производительности, повышение управляемости, улучшенная поддержка асинхронного программирования, новая библиотека потоков данных и улучшенная поддержка параллельной отладки и анализа производительности. См. запись Новые возможности параллелизма в .NET Framework 4.5 в блоге, посвященном параллельному программированию в .NET.

Интернет

В ASP.NET 4.5 и 4.5.1 добавилась привязка модели для Web Forms, поддержка WebSocket, асинхронные обработчики, усовершенствования для повышения производительности и многие другие возможности. Дополнительные сведения см. в следующих ресурсах:

Сети

.NET Framework 4.5 предоставляет новый интерфейс программирования для приложений HTTP. Дополнительные сведения см. в описании новых пространств имен System.Net.Http и System.Net.Http.Headers.

Также предусмотрена поддержка нового интерфейса программирования для приема и взаимодействия с соединением WebSocket с помощью существующего класса HttpListener и связанных с ним классов. Дополнительные сведения см. в описании нового пространства имен System.Net.WebSockets и класса HttpListener.

Кроме того, в .NET Framework 4.5 улучшено сетевое взаимодействие:

  • RFC-совместимая поддержка URI. Дополнительные сведения см. в описании Uri и соответствующих классов.

  • Поддержка синтаксического анализа интернационализированных доменных имен (Internationalized Domain Name, IDN). Дополнительные сведения см. в описании Uri и соответствующих классов.

  • Поддержка интернационализации адресов электронной почты (Email Address Internationalization, EAI). Дополнительные сведения см. в описании пространства имен System.Net.Mail.

  • Улучшенная поддержка протокола IPv6. Дополнительные сведения см. в описании пространства имен System.Net.NetworkInformation.

  • Поддержка сокета с двойным режимом. Дополнительные сведения см. в описаниях классов Socket и TcpListener.

Windows Presentation Foundation (WPF)

В .NET Framework 4.5 для Windows Presentation Foundation (WPF) добавлены изменения и усовершенствования в следующих областях:

  • Новый элемент управления Ribbon, позволяющий реализовать пользовательский интерфейс в виде ленты, на которой размещаются панель быстрого доступа, меню приложения и вкладки.

  • Новый интерфейс INotifyDataErrorInfo, который поддерживает синхронную и асинхронную проверку данных.

  • Новые возможности для классов VirtualizingPanel и Dispatcher.

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

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

  • Изменение расположения данных по мере изменение значений (формирование данных в реальном времени).

  • Возможность проверить, отсоединен ли контекст данных для контейнера элемента.

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

  • Улучшенная поддержка реализации шаблонов слабых событий. Кроме того, события теперь могут принимать расширения разметки.

Windows Communication Foundation (WCF)

В .NET Framework 4.5 добавлены следующие возможности, чтобы упростить создание и обслуживание приложений Windows Communication Foundation (WCF):

  • Упрощение создаваемых файлов конфигурации.

  • Поддержка разработки в соответствии с парадигмой "сначала контракт".

  • Упрощение настройки режима совместимости ASP.NET.

  • Изменения значений свойств транспорта по умолчанию для уменьшения вероятности необходимости их настройки.

  • Обновления класса XmlDictionaryReaderQuotas для уменьшения вероятности того, что потребуется вручную настраивать квоты для читателей словаря XML.

  • Проверка файлов конфигурации WCF силами Visual Studio в рамках процесса сборки, позволяющая выявить ошибки в конфигурации до запуска приложения.

  • Новая поддержка асинхронной потоковой передачи.

  • Новое сопоставление протокола HTTPS, облегчающее предоставление конечной точки по HTTPS с помощью служб IIS.

  • Возможность создавать метаданные в одном документе WSDL путем добавления ?singleWSDL к URL-адресу службы.

  • Поддержка Websockets, обеспечивающая истинно двунаправленный обмен данными через порты 80 и 443 с показателями производительности, схожими с характеристиками TCP-транспорта.

  • Поддержка настройки служб в коде.

  • Всплывающие подсказки в редакторе XML.

  • Поддержка кэширования ChannelFactory.

  • Поддержка сжатия двоичного кодировщика.

  • Поддержка UDP-транспорта, которая позволяет разработчикам писать службы, использующие обмен сообщениями по принципу "отправить и забыть". Клиент отправляет сообщение службе, но не ожидает от нее ответа.

  • Возможность поддерживать несколько режимов аутентификации в одной конечной точке WCF при использовании HTTP-транспорта и безопасности транспорта.

  • Поддержка служб WCF, использующих интернационализированные доменные имена (IDN).

Дополнительные сведения см. в разделе Новые возможности в Windows Communication Foundation.

Windows Workflow Foundation (WF)

В .NET Framework 4.5 для Windows Workflow Foundation (WF) добавлено несколько новых возможностей, в том числе следующие:

  • Рабочие процессы конечного автомата, впервые добавленные в .NET Framework 4.0.1 (обновление 1 для .NET Framework 4). В это обновление вошло несколько новых классов и действий, позволивших разработчикам создавать рабочие процессы конечного автомата. В .NET Framework 4.5 эти классы и действия были обновлены и теперь включают в себя следующие возможности:

    • Возможность установки точек останова на состояниях.

    • Возможность копирования и вставки переходов в конструкторе рабочих процессов.

    • Поддержка создания в конструкторе переходов с общим триггером.

    • Действия для создания рабочих процессов конечного автомата, в том числе StateMachine, State и Transition.

  • Расширенные возможности конструктора рабочих процессов, например следующие:

    • Расширенные возможности поиска рабочих процессов в Visual Studio, включая быстрый поиск и поиск в файлах.

    • Возможность автоматически создавать действие Sequence, когда к действию-контейнеру добавляется второе действие — дочерний элемент, и включать оба действия в действие Sequence.

    • Поддержка панорамирования, которая позволяет изменять видимую часть рабочего процесса без использования полос прокрутки.

    • Новое представление Структура документа, в котором компоненты рабочего процесса отображаются в виде древовидной структуры с возможностью выбора компонента в представлении Структура документа.

    • Возможность добавлять примечаний к действиям.

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

    • Автоматическое соединение и автоматическая вставка для действий и переходов в рабочих процессах блок-схемы и конечного автомата.

  • Хранение данных о состоянии представления для рабочего процесса в одном элементе в XAML-файле, чтобы данные о состоянии представления можно было легко находить и редактировать.

  • Действие-контейнер NoPersistScope для предотвращения сохранения дочерних действий.

  • Поддержка выражений C#:

    • Проекты рабочих процессов, в которых используется Visual Basic, будут использовать выражения Visual Basic, а проекты рабочих процессов C# будут использовать выражения C#.

    • Проекты рабочих процессов C#, созданные в Visual Studio 2010 и содержащие выражения Visual Basic, совместимы с проектами рабочих процессов C#, в которых используются выражения C#.

  • Усовершенствования управления версиями:

    • Новый WorkflowIdentity класс, который обеспечивает сопоставление между материализованным экземпляром рабочего процесса и его определением рабочего процесса.

    • Параллельное выполнение нескольких версий рабочего процесса в одном и том же узле, в том числе WorkflowServiceHost.

    • В динамическом обновлении это возможность изменять определение сохраненного экземпляра рабочего процесса.

  • Разработка служб рабочего процесса в соответствии с парадигмой "сначала контракт", что обеспечивает поддержку автоматического создания действий в соответствии с существующим контрактом службы.

Дополнительные сведения см. в разделе Новые возможности Windows Workflow Foundation.

.NET для приложений Магазина Windows 8.x

Приложения для Магазина Windows 8.x разрабатываются для конкретных форм-факторов и в полной мере используют возможности операционной системы Windows. Предоставляется подмножество .NET Framework 4.5 или 4.5.1 для разработки приложений для Магазина Windows 8.x с использованием C# или Visual Basic. Это подмножество называется .NET для Магазина Windows 8.x. Оно подробно рассматривается в обзорной статье.

Переносимые библиотеки классов

Проект "Переносимая библиотека классов" для Visual Studio 2012 (и более поздних версий) позволяет писать и собирать управляемые сборки, работающие на нескольких платформах .NET Framework. Используя проект "Переносимая библиотека классов", вы можете создавать приложения для конкретных платформ (например, для Windows Phone или .NET для приложений Магазина Windows 8.x). Доступные типы и члены в проекте автоматически ограничиваются типами и членами, общими для этих платформ. Дополнительные сведения см. в статье Переносимая библиотека классов.

См. также