Перенацеливание изменений для миграции на .NET Framework 4.7.x
В этой статье перечислены проблемы совместимости приложений, представленные в .NET Framework 4.7, 4.7.1и 4.7.2.
.NET Framework 4.7
ASP.NET
HttpRuntime.AppDomainAppPath выбрасывает исключение NullReferenceException
Подробности
В .NET Framework 4.6.2 среда выполнения создает T:System.NullReferenceException
при получении значения P:System.Web.HttpRuntime.AppDomainAppPath
, включающего пустые символы. В .NET Framework 4.6.1 и более ранних версиях среда выполнения создает T:System.ArgumentNullException
.
Предложение
Вы можете выполнить одно из следующих действий, чтобы ответить на это изменение:
- Обработайте
T:System.NullReferenceException
, если приложение работает в .NET Framework 4.6.2. - Обновите .NET Framework до версии 4.7, которая восстанавливает предыдущее поведение и выбрасывает
T:System.ArgumentNullException
.
Имя | Ценность |
---|---|
Размах | Кромка |
Версия | 4.6.2 |
Тип | Перенацеливание |
Затронутые API
Регулирование одновременных запросов на сеанс
Подробности
В .NET Framework 4.6.2 и более ранних версиях ASP.NET выполняет запросы с одинаковым Sessionid последовательно, и ASP.NET всегда присваивает Sessionid с помощью файлов cookie по умолчанию. Если на открытие страницы требуется много времени, это приводит к значительному снижению производительности сервера просто при нажатии F5 в браузере. В исправлении мы добавили счетчик для отслеживания очередных запросов и завершения запросов при превышении указанного ограничения. Значение по умолчанию — 50. Если ограничение достигнуто, в журнал событий будет записано предупреждение, а в журнал IIS может быть записан ответ HTTP 500.
Предложение
Чтобы восстановить старое поведение, можно добавить следующий параметр в файл web.config, чтобы отказаться от нового поведения.
<appSettings>
<add key="aspnet:RequestQueueLimitPerSession" value="2147483647"/>
</appSettings>
Имя | Ценность |
---|---|
Размах | Эдж |
Версия | 4.7 |
Тип | Перенацеливание |
Сети
Значение по умолчанию «ServicePointManager.SecurityProtocol» — «SecurityProtocolType.System.Default»
Подробности
Начиная с приложений, предназначенных для .NET Framework 4.7, значение по умолчанию свойства ServicePointManager.SecurityProtocol равно SecurityProtocolType.SystemDefault. Это изменение позволяет API сети .NET Framework на основе SSLStream (например, FTP, HTTPS и SMTP) наследовать протоколы безопасности по умолчанию от операционной системы вместо использования жестко закодированных значений, определенных платформой .NET Framework. Значение по умолчанию зависит от операционной системы и любой пользовательской конфигурации, выполняемой системным администратором. Сведения о протоколе SChannel по умолчанию в каждой версии операционной системы Windows см. в протоколах TLS/SSL (Schannel SSP) .
Для приложений, предназначенных для более ранней версии .NET Framework, значение по умолчанию свойства ServicePointManager.SecurityProtocol зависит от версии целевой платформы .NET Framework. Дополнительные сведения см. в разделе Сетевое взаимодействие из "Перенацеливание для миграции с .NET Framework 4.5.2 на 4.6".Предложение
Это изменение влияет на приложения, предназначенные для .NET Framework 4.7 или более поздних версий. Если вы предпочитаете использовать определенный протокол, а не полагаться на системное значение по умолчанию, можно явно задать значение свойства ServicePointManager.SecurityProtocol. Если это изменение нежелательно, вы можете отказаться от него, добавив параметр конфигурации в раздел <среды выполнения> файла конфигурации приложения. В следующем примере показаны раздел <runtime>
и опция Switch.System.Net.DontEnableSystemDefaultTlsVersions
для отказа.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Net.DontEnableSystemDefaultTlsVersions=true" />
</runtime>
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7 |
Тип | Перенацеливание |
Затронутые API
SslStream поддерживает оповещения TLS
Подробности
После неудачного рукопожатия TLS исключение System.IO.IOException с внутренним System.ComponentModel.Win32Exception будет возбуждено первой операцией ввода-вывода чтения или записи. Код System.ComponentModel.Win32Exception.NativeErrorCode для System.ComponentModel.Win32Exception можно сопоставить с оповещением TLS от удаленной стороны с помощью кодов ошибок Schannel для оповещений TLS и SSL. Дополнительные сведения см. в разделе RFC 2246: оповещения об ошибках 7.2.2.
Поведение в .NET Framework 4.6.2 и более ранних версиях заключается в том, что транспортный канал (обычно TCP-подключение) будет истекать при попытке записи или чтения, если другая сторона не прошла подтверждение и сразу после этого отклонила подключение.
Предложение
Приложения, вызывающие API-интерфейсы сети ввода-вывода, такие как Read(Byte[], Int32, Int32)/Write(Byte[], Int32, Int32), должны обрабатывать IOException или System.TimeoutException.
Функция оповещений TLS включена по умолчанию, начиная с .NET Framework 4.7. Приложения, предназначенные для версий .NET Framework от 4.0 до 4.6.2, работающих в системе .NET Framework 4.7 или более поздней версии, будут отключены для сохранения совместимости.
Следующий API конфигурации доступен для включения или отключения функции для приложений .NET Framework 4.6 и более поздних версий, работающих в .NET Framework 4.7 или более поздней версии.
Программно: это должно быть первым действием приложения, так как ServicePointManager инициализируется только один раз.
AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true); // Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. AppContext.SetSwitch("Switch.System.Net.DontEnableTlsAlerts", true);
AppConfig:
<runtime> <AppContextSwitchOverrides value="Switch.System.Net.DontEnableTlsAlerts=true"/> <!-- Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. --> </runtime>
Раздел реестра (для всех компьютеров): установите значение
false
, чтобы включить функцию в .NET Framework 4.6 – 4.6.2.Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts - Type: String - Value: "true"
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7 |
Тип | Перенацеливание |
Затронутые API
- System.Net.Security.SslStream
- System.Net.WebRequest
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
- System.Net.Mail.SmtpClient
- System.Net.Http
Безопасность
CspParameters.ParentWindowHandle теперь ожидает значение HWND
Подробности
Значение ParentWindowHandle, введенное в .NET Framework 2.0, позволяет приложению зарегистрировать значение дескриптора родительского окна, чтобы любой пользовательский интерфейс, необходимый для доступа к ключу (например, диалоговое окно "ПИН-код" или диалогового окна согласия), открывался в качестве модального дочернего элемента в указанном окне. Начиная с приложений, предназначенных для .NET Framework 4.7, приложение Windows Forms может задать свойство ParentWindowHandle с кодом следующим образом:
cspParameters.ParentWindowHandle = form.Handle;
В предыдущих версиях .NET Framework ожидалось, что значение будет представлено как System.IntPtr, обозначающее расположение в памяти, где находилось значение HWND. При установке свойства form.Handle в Windows 7 и более ранних версиях это не оказывает никакого эффекта, но в Windows 8 и более поздних версиях это приводит к ошибке "System.Security.Cryptography.CryptographicException: параметр неверен".
Предложение
Приложения, предназначенные для .NET Framework 4.7 или более поздней версии, желающие зарегистрировать связь родительского окна, рекомендуется использовать упрощенную форму:
cspParameters.ParentWindowHandle = form.Handle;
Пользователи, которые определили, что правильным значением для передачи был адрес ячейки памяти, в которой содержалось значение form.Handle
, могут отказаться от изменения поведения, установив для переключателя AppContext Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle
значение true
:
- Программно устанавливая переключатели совместимости в AppContext, как описано здесь.
- Добавив следующую строку в раздел
<runtime>
файла app.config:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle=true"/>
</runtime>
И наоборот, пользователи, которые хотят отказаться от нового поведения в среде выполнения .NET Framework 4.7, когда приложение загружается в более ранних версиях .NET Framework, может задать для параметра AppContext значение false
.
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7 |
Тип | Перенацеливание |
Затронутые API
SslStream поддерживает оповещения TLS
Подробности
После неудачного рукопожатия TLS, при первой операции чтения и записи ввода-вывода, будет выброшено исключение System.IO.IOException с внутренним System.ComponentModel.Win32Exception. Код System.ComponentModel.Win32Exception.NativeErrorCode для System.ComponentModel.Win32Exception можно сопоставить с оповещением TLS от удаленной стороны, используя коды ошибок Schannel для оповещений TLS и SSL. Дополнительные сведения см. в разделе RFC 2246: Раздел 7.2.2: оповещения об ошибках.
Поведение в .NET Framework 4.6.2 и более ранних версиях заключается в том, что транспортный канал (обычно TCP-подключение) будет истекать во время записи или чтения, если другой стороне не удалось установить соединение и сразу после этого она отклонила подключение.
Предложение
Приложения, вызывающие API-интерфейсы сети ввода-вывода, такие как Read(Byte[], Int32, Int32)/Write(Byte[], Int32, Int32), должны обрабатывать IOException или System.TimeoutException.
Функция оповещений TLS включена по умолчанию, начиная с .NET Framework 4.7. Приложения, предназначенные для версий .NET Framework от 4.0 до 4.6.2, работающих в системе .NET Framework 4.7 или более поздней версии, будут отключены для сохранения совместимости.
Следующий API конфигурации доступен для включения или отключения функции для приложений .NET Framework 4.6 и более поздних версий, работающих в .NET Framework 4.7 или более поздней версии.
Программно: это должно быть самым первым, что делает приложение, поскольку ServicePointManager инициализируется только один раз.
AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true); // Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. AppContext.SetSwitch("Switch.System.Net.DontEnableTlsAlerts", true);
AppConfig:
<runtime> <AppContextSwitchOverrides value="Switch.System.Net.DontEnableTlsAlerts=true"/> <!-- Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. --> </runtime>
Раздел реестра (общемашинный): установите значение
false
, чтобы включить функцию в .NET Framework 4.6 – 4.6.2.Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts - Type: String - Value: "true"
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7 |
Тип | Перенацеливание |
Затронутые API
- System.Net.Security.SslStream
- System.Net.WebRequest
- System.Net.HttpWebRequest
- System.Net.FtpWebRequest
- System.Net.Mail.SmtpClient
- System.Net.Http
Windows Communication Foundation (WCF)
Сериализация символов управления с помощью DataContractJsonSerializer теперь совместима с ECMAScript V6 и V8
Подробности
В .NET Framework 4.6.2 и более ранних версиях System.Runtime.Serialization.Json.DataContractJsonSerializer не сериализовал некоторые специальные символы управления, такие как \b, \f и \t, в формате, совместимом со стандартами ECMAScript V6 и V8. Начиная с .NET Framework 4.7 сериализация этих символов управления совместима с ECMAScript версии 6 и V8.
Предложение
Для приложений, предназначенных для .NET Framework 4.7, эта функция включена по умолчанию. Если это поведение нежелательно, вы можете отказаться от этой функции, добавив следующую строку в раздел <runtime>
файла app.config или web.config:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Runtime.Serialization.DoNotUseECMAScriptV6EscapeControlCharacter=false" />
</runtime>
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7 |
Тип | Перенацеливание |
Затронутые API
- DataContractJsonSerializer.WriteObject(Stream, Object)
- DataContractJsonSerializer.WriteObject(XmlDictionaryWriter, Object)
- DataContractJsonSerializer.WriteObject(XmlWriter, Object)
Безопасность сообщений WCF теперь может использовать TLS1.1 и TLS1.2
Подробности
Начиная с .NET Framework 4.7 клиенты могут настроить TLS1.1 или TLS1.2 в безопасности сообщений WCF в дополнение к SSL3.0 и TLS1.0 с помощью параметров конфигурации приложения.
Предложение
В .NET Framework 4.7 поддержка TLS1.1 и TLS1.2 в безопасности сообщений WCF отключена по умолчанию. Его можно включить, добавив следующую строку в раздел <runtime>
файла app.config или web.config:
<runtime>
<AppContextSwitchOverrides value="Switch.System.ServiceModel.DisableUsingServicePointManagerSecurityProtocols=false;Switch.System.Net.DontEnableSchUseStrongCrypto=false" />
</runtime>
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7 |
Тип | Перенацеливание |
Windows Presentation Foundation (WPF)
Вызовы System.Windows.Input.PenContext.Disable на системах с поддержкой сенсорного ввода могут вызывать ArgumentException
Подробности
В некоторых случаях вызов внутреннего метода System.Windows.Intput.PenContext.Disable на системах с поддержкой сенсорного ввода может вызывать необработанное T:System.ArgumentException
из-за повторного выполнения.
Предложение
Эта проблема устранена в .NET Framework 4.7. Чтобы предотвратить исключение, обновите версию .NET Framework, начиная с .NET Framework 4.7.
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.6.1 |
Тип | Перенацеливание |
NullReferenceException в коде обработки исключений из ImageSourceConverter.ConvertFrom
Подробности
Ошибка в коде обработки исключений для ConvertFrom(ITypeDescriptorContext, CultureInfo, Object) приводила к возникновению неправильной System.NullReferenceException вместо предполагаемого исключения (System.IO.DirectoryNotFoundException или System.IO.FileNotFoundException). Это изменение исправляет эту ошибку, чтобы метод теперь выдает правильное исключение.
По умолчанию все приложения, предназначенные для .NET Framework 4.6.2 и более ранних версий, продолжают вызывать System.NullReferenceException для обеспечения совместимости. Разработчики, работающие с .NET Framework 4.7 и выше, должны получать правильные исключения.
Предложение
Разработчики, которые хотят вернуться к значению System.NullReferenceException при использовании .NET Framework 4.7 или более поздней версии, могут добавить или объединить следующие элементы в файл App.config приложения:
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Media.ImageSourceConverter.OverrideExceptionWithNullReferenceException=true"/>
</runtime>
</configuration>
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7 |
Тип | Перенацеливание |
Затронутые API
Распределение пространства звездочными колонками в сетке WPF
Подробности
Начиная с .NET Framework 4.7, WPF заменяет алгоритм, который Grid использует для выделения пространства для *-столбцов. Это приведет к изменению фактической ширины, назначенной *-столбцам в ряде случаев.
- Если один или несколько *-столбцов также имеют минимальную или максимальную ширину, которая переопределяет пропорциональное выделение для этих столбцов. (Минимальная ширина может быть производным от явного объявления MinWidth или от неявного минимального значения, полученного из содержимого столбца. Максимальная ширина может быть определена только явным образом из объявления MaxWidth.)
- Если один или несколько *-столбцов указывают чрезвычайно большой *-вес, превышающий 10^298.
- Когда *-веса достаточно различаются, чтобы возникла нестабильность с плавающей запятой (переполнение, понижение, потеря точности).
- Если округление макета включено, а эффективный DPI отображения достаточно высок. В первых двух случаях ширина, созданная новым алгоритмом, может значительно отличаться от тех, которые производятся старым алгоритмом; В последнем случае разница будет иметь не более одного или двух пикселей.
Новый алгоритм устраняет несколько ошибок, присутствующих в старом алгоритме:
Общее выделение столбцов может превышать ширину сетки. Это может произойти при выделении пространства столбцу, пропорциональная доля которой меньше минимального размера. Алгоритм выделяет минимальный размер, который уменьшает пространство, доступное другим столбцам. Если не осталось *-столбцов для выделения, общее выделение будет слишком большим.
Общее выделение может быть меньше ширины сетки. Это противоположная задача к #1, возникающая при выделении ресурсов для столбца, чья пропорциональная доля превышает максимальный размер, без оставшихся *-столбцов для поглощения излишков.
Две *-столбца могут получать распределения, не пропорциональные их *-весам. Это более мягкая версия #1/#2, возникающая при выделении *-columns A, B и C (в этом порядке), где пропорциональная доля B нарушает его минимальное (или максимальное) ограничение. Как описано выше, это изменяет пространство, доступное для столбца C, который получает меньшее (или более) пропорциональное выделение, чем A.
Столбцы с очень большими весами (> 10^298) рассматриваются как если бы они имели вес 10^298. Пропорциональные различия между ними (и между столбцами с немного меньшим весом) не учитываются.
Столбцы с бесконечными весами не обрабатываются правильно. (На самом деле вы не можете задать вес, равный бесконечности, но это искусственное ограничение. Код распределения пытается его обработать, но справляется с ним плохо.)
Несколько незначительных проблем при предотвращении переполнения, утечки, потери точности и аналогичных проблем с плавающей запятой.
Корректировки округления макета неверны при достаточно высоком уровне DPI. Новый алгоритм создает результаты, соответствующие следующим критериям:
- Фактическая ширина, назначенная столбцу *-column, никогда не меньше минимальной ширины или больше максимальной ширины.
- Каждому столбцу *-column, не имеющему назначенной минимальной или максимальной ширины, присваивается ширина, пропорциональная этому столбцу *-весу. Чтобы быть точным, если два столбца объявляются с шириной x* и y* соответственно, и если ни один столбец не получает минимальную или максимальную ширину, фактические ширины v и w, назначенные столбцам, находятся в той же пропорции: v /w == x /y.
- Общая ширина, выделенная для "пропорциональных" *-столбцов, равна пространству, доступному после выделения ограниченным столбцам (фиксированным, автоматическим и *-столбцам с минимальной или максимальной шириной). Это может быть нулевым, например, если сумма минимальной ширины превышает доступную ширину сетки.
- Все эти инструкции должны быть интерпретированы в отношении "идеального" макета. Когда применяется округление макета, фактические ширины могут отличаться от идеальных ширин на один пиксель.
Заметка
Все, что говорится о столбцах и ширине в этой статье, относится к строкам и высотам.
Предложение
По умолчанию приложения, предназначенные для версий .NET Framework, начиная с .NET Framework 4.7, увидят новый алгоритм, а приложения, предназначенные для .NET Framework 4.6.2 или более ранних версий, увидят старый алгоритм.
Чтобы переопределить значение по умолчанию, используйте следующий параметр конфигурации:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=true" />
</runtime>
Значение true
выбирает старый алгоритм, false
выбирает новый алгоритм.
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7 |
Тип | Перенацеливание |
WPF Pointer-Based стек сенсорного ввода
Подробности
Это изменение добавляет возможность включить необязательный стек сенсорного ввода и пера WPF, основанный на WM_POINTER. Разработчики, которые явно не включат это, не заметят изменений в сенсорном вводе и работе пера в WPF. Текущие известные проблемы с необязательным стеком сенсорного ввода и пера на основе WM_POINTER:
- Поддержка рукописного ввода в режиме реального времени не поддерживается.
- Хотя рукописный ввод и плагины для стилуса по-прежнему будут работать, их обработка будет происходить на потоке пользовательского интерфейса, что может привести к ухудшению производительности.
- Изменения поведения из-за изменений в продвижении от событий касания или стилуса на события мыши
- Манипуляция может вести себя по-другому
- Перетаскивание/отпускание не будет показывать нужную обратную связь для сенсорного ввода
- Это не влияет на входные данные пера
- Перетаскивание больше не может быть начато при событиях касания или пера
- Это может привести к остановке реагирования приложения до обнаружения входных данных мыши.
- Вместо этого разработчики должны запускать перетаскивание исходя из событий мыши.
Предложение
Разработчики, которые хотят включить этот стек, могут добавить или объединить следующие элементы в файл App.config приложения:
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Input.Stylus.EnablePointerSupport=true"/>
</runtime>
</configuration>
Удаление этого или установка значения false приведет к отключению этого необязательного стека. Обратите внимание, что этот стек доступен только в Windows 10 Creators Update и выше.
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7 |
Тип | Перенацеливание |
Windows Workflow Foundation (WF)
Контрольные суммы рабочих процессов изменились с MD5 на SHA1
Подробности
Для поддержки отладки с помощью Visual Studio среда выполнения рабочего процесса создает контрольную сумму для экземпляра рабочего процесса с помощью алгоритма хэширования. В .NET Framework 4.6.2 и более ранних версиях хэширование контрольной суммы рабочих процессов использовал алгоритм MD5, который вызвал проблемы с системами с поддержкой FIPS. Начиная с .NET Framework 4.7, алгоритм — SHA1. Если ваш код сохранил эти контрольные суммы, они могут оказаться несовместимыми.
Предложение
Если код не может загрузить экземпляры рабочих процессов из-за сбоя контрольной суммы, попробуйте задать значение true для параметра AppContext
switch.System.Activities.UseMD5ForWFDebugger. В коде:
System.AppContext.SetSwitch("Switch.System.Activities.UseMD5ForWFDebugger", true);
Или в конфигурации:
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Activities.UseMD5ForWFDebugger=true" />
</runtime>
</configuration>
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7 |
Тип | Перенацеливание |
.NET Framework 4.7.1
ASP.NET
Улучшения доступности в ASP.NET в .NET Framework 4.7.1
Подробности
Начиная с .NET Framework 4.7.1, в ASP.NET улучшена работа веб-элементов управления с технологиями доступности в Visual Studio, чтобы лучше поддерживать пользователей ASP.NET. К ним относятся следующие изменения:
- Изменения, направленные на реализацию отсутствующих шаблонов специальных возможностей пользовательского интерфейса в элементах управления, таких как диалоговое окно "Добавить поле" в мастере подробного представления или диалоговое окно "Настройка ListView" в мастере ListView.
- Изменения для улучшения отображения в режиме высокой контрастности, например редактор полей страниц данных.
- Изменения, направленные на улучшение навигации с помощью клавиатуры для элементов управления, таких как диалоговое окно "Поля" в мастере редактирования полей DataPager, диалоговое окно настройки ObjectContext или диалоговое окно настройки выбора данных в мастере настройки источника данных.
Предложение
Как согласиться или отказаться от этих изменений Чтобы конструктор Visual Studio воспользовался этими изменениями, он должен выполняться в .NET Framework 4.7.1 или более поздней версии. Веб-приложение может воспользоваться этими изменениями в любом из следующих способов:
- Установите Visual Studio 2017 15.3 или более поздней версии, которая по умолчанию поддерживает новые функции специальных возможностей с помощью следующего параметра AppContext.
- Отказаться от устаревшего поведения специальных возможностей, добавив переключатель
Switch.UseLegacyAccessibilityFeatures
AppContext в раздел<runtime>
в файле devenv.exe.config и установив для него значениеfalse
, как показано в следующем примере.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
...
<!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false' -->
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
...
</runtime>
</configuration>
Приложения, предназначенные для .NET Framework 4.7.1 или более поздней версии и желающие сохранить устаревшее поведение специальных возможностей, могут использовать устаревшие функции специальных возможностей, явно установив этот параметр AppContext на true
.
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7.1 |
Тип | Перенацеливание |
Ядро
Исключения в фоновом потоке SerialPort
Подробности
Фоновые потоки, создаваемые с помощью потоков SerialPort, больше не завершают процесс при возникновении исключений ОС.
В приложениях, предназначенных для .NET Framework 4.7 и более ранних версий, процесс завершается при возникновении исключения операционной системы в фоновом потоке, созданном с помощью потока SerialPort.
В приложениях, предназначенных для .NET Framework 4.7.1 или более поздней версии, фоновые потоки ожидают событий ОС, связанных с активным последовательным портом, и могут завершиться сбоем в некоторых случаях, например внезапное удаление последовательного порта.
Предложение
Для приложений, предназначенных для .NET Framework 4.7.1, можно отказаться от обработки исключений, если это не желательно, добавив в раздел <runtime>
файла app.config
следующее:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions=true" />
</runtime>
Для приложений, предназначенных для более ранних версий .NET Framework, но запускаемых на платформе .NET Framework 4.7.1 или более поздней версии, можно выбрать обработку исключений, добавив в раздел <runtime>
файла app.config
:
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions=false" />
</runtime>
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7.1 |
Тип | Перенацеливание |
Затронутые API
ServiceBase не распространяет исключения OnStart
Подробности
В .NET Framework 4.7 и более ранних версиях исключения, создаваемые при запуске службы, не распространяются на вызывающий объект ServiceBase.Run.
Начиная с приложений, предназначенных для .NET Framework 4.7.1, среда выполнения распространяет исключения для ServiceBase.Run для служб, которые не запускались.
Предложение
При запуске службы, если существует исключение, это исключение будет распространяться. Это поможет диагностировать случаи, когда службы не запускались.
Если это поведение нежелательно, вы можете отказаться от него, добавив следующий элемент AppContextSwitchOverrides
в раздел runtime
файла конфигурации приложения:
<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=true" />
Если приложение предназначено для более ранней версии, чем 4.7.1, но вы хотите использовать это поведение, добавьте следующий элемент AppContextSwitchOverrides
в раздел runtime
файла конфигурации приложения:
<AppContextSwitchOverrides value="Switch.System.ServiceProcess.DontThrowExceptionsOnStart=false" />
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7.1 |
Тип | Перенацеливание |
Затронутые API
Безопасность
Алгоритмы SignedXML и SignedXMS по умолчанию изменились на SHA256
Подробности
В .NET Framework 4.7 и более ранних версиях Для некоторых операций по умолчанию SignedXML и SignedCMS используется SHA1. Начиная с .NET Framework 4.7.1, SHA256 включен по умолчанию для этих операций. Это изменение необходимо, так как SHA1 больше не считается безопасным.
Предложение
Существует два новых значения переключения контекста для управления тем, используется ли SHA1 (небезопасная версия) или SHA256 по умолчанию:
- Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms
- Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms для приложений, предназначенных для .NET Framework 4.7.1 и более поздних версий, если использование SHA256 нежелательно, вы можете восстановить значение по умолчанию в SHA1, добавив следующий параметр конфигурации в раздел среды выполнения файла конфигурации приложения:
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=true;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=true" />
Для приложений, предназначенных для .NET Framework 4.7 и более ранних версий, можно выбрать это изменение, добавив следующий параметр конфигурации в раздел среды выполнения файла конфигурации приложения:
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms=false;Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms=false" />
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7.1 |
Тип | Перенацеливание |
Затронутые API
- System.Security.Cryptography.Pkcs.CmsSigner
- System.Security.Cryptography.Xml.SignedXml
- System.Security.Cryptography.Xml.Reference
SignedXml.GetPublicKey возвращает RSACng в net462 (или lightup) без изменения перенацеливания.
Подробности
Начиная с .NET Framework 4.6.2, конкретный тип объекта, возвращаемого методом SignedXml.GetPublicKey, изменился (без причудливости) из реализации CryptoServiceProvider в реализацию Cng. Это связано с тем, что реализация изменилась: теперь вместо certificate.PublicKey.Key
используется внутренний certificate.GetAnyPublicKey
, который перенаправляет на RSACertificateExtensions.GetRSAPublicKey.
Предложение
Начиная с приложений, работающих в .NET Framework 4.7.1, можно использовать реализацию CryptoServiceProvider, используемую по умолчанию в .NET Framework 4.6.1 и более ранних версиях, добавив следующий параметр конфигурации в раздел среды выполнения раздела конфигурации приложения:
<AppContextSwitchOverrides value="Switch.System.Security.Cryptography.Xml.SignedXmlUseLegacyCertificatePrivateKey=true" />
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.6.2 |
Тип | Перенацеливание |
Затронутые API
Windows Communication Foundation (WCF)
Улучшена доступность некоторых средств .NET SDK.
Подробности
В пакете SDK для .NET Framework 4.7.1 инструменты SvcConfigEditor.exe и SvcTraceViewer.exe были улучшены за счет устранения различных проблем с доступностью. Большинство из них были небольшими проблемами, такими как имя, не определено или некоторые шаблоны автоматизации пользовательского интерфейса не реализованы правильно. Хотя многие пользователи не будут знать об этих неправильных значениях, клиенты, использующие вспомогательные технологии, такие как средства чтения с экрана, будут находить эти средства SDK более доступными. Конечно, эти исправления изменяют некоторые предыдущие функции, такие как порядок фокусировки клавиатуры. Чтобы получить все исправления доступности в этих инструментах, вы можете добавить следующее в ваш файл app.config:
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false"/>
</runtime>
Имя | Ценность |
---|---|
Размах | Edge |
Версия | 4.7.1 |
Тип | Перенацеливание |
Windows Forms
Улучшения доступности в элементах управления Windows Forms
Подробности
Windows Forms улучшает работу с технологиями специальных возможностей для повышения поддержки клиентов Windows Forms. К ним относятся следующие изменения, начиная с .NET Framework 4.7.1:
- Изменения для улучшения отображения во время режима высокой контрастности.
- Изменения для улучшения работы с браузером свойств. К усовершенствованиям браузера свойств относятся следующие:
- Улучшенная навигация по различным раскрывающимся окнам выбора.
- Сокращены ненужные остановки табуляции.
- Более качественная отчетность о типах элементов управления.
- Улучшено поведение экранного диктора.
- Изменения для реализации отсутствующих шаблонов специальных возможностей пользовательского интерфейса в элементах управления.
Предложение
Как отказаться от этих изменений, чтобы приложение пользовалось этими изменениями, оно должно выполняться в .NET Framework 4.7.1 или более поздней версии. Приложение может воспользоваться этими изменениями в любом из следующих способов:
- Она была перекомпилирована для целевой платформы .NET Framework 4.7.1. Эти изменения доступности включены по умолчанию в приложениях Windows Forms, предназначенных для .NET Framework 4.7.1 или более поздней версии.
- Это отключает устаревшие функции доступности, добавляя следующий параметр AppContext в раздел
<runtime>
файла app.config и устанавливая его наfalse
, как показано в следующем примере.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false -->
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
</runtime>
</configuration>
Приложения, предназначенные для .NET Framework 4.7.1 или более поздней версии и желающие сохранить устаревшее поведение специальных возможностей, могут использовать устаревшие функции специальных возможностей, явно установив этот параметр AppContext на true
.
Общие сведения об автоматизации пользовательского интерфейса см. в .
Добавлена поддержка шаблонов и свойств автоматизации пользовательского интерфейса
Клиенты специальных возможностей могут воспользоваться новыми функциями специальных возможностей WinForms с помощью общих, общедоступных шаблонов вызова. Эти шаблоны не зависят от WinForms. Например, клиенты доступности могут вызывать метод QueryInterface в интерфейсе IAccessible (MAAS), чтобы получить интерфейс IServiceProvider. Если этот интерфейс доступен, клиенты могут использовать метод QueryService для запроса интерфейса IAccessEx. Дополнительные сведения см. в разделе Использование IAccessibleEx со стороны клиента. Начиная с .NET Framework 4.7.1, IServiceProvider и IAccessibleEx (где применимо) доступны для объектов специальных возможностей WinForms.
Платформа .NET Framework 4.7.1 добавляет поддержку следующих шаблонов автоматизации пользовательского интерфейса и свойств:
Элементы управления ToolStripSplitButton и ComboBox поддерживают шаблон Expand/Collapse.
Элемент управления
имеет значение свойства типа управления . Элемент управления ToolStripItem поддерживает свойство NameProperty и шаблонExpand/Collapse.
Элемент управления ToolStripDropDownItem поддерживает AccessibleEvents, который указывает на изменения состояния (StateChange) и имени (NameChange) при развёртывании или свёртывании раскрывающегося списка.
Элемент управления ToolStripDropDownButton имеет значение свойства ControlTypeControlType.MenuItem.
Элемент управления DataGridViewCheckBoxCell поддерживает TogglePattern.
Элементы управления NumericUpDown и DomainUpDown поддерживают свойство NameProperty и имеют тип управления ControlType.Spinner.
Улучшения элемента управления PropertyGrid .NET Framework 4.7.1 добавляет следующие улучшения в элемент управления PropertyBrowser:Кнопка сведений
в диалоговом окне ошибки, отображаемая, когда пользователь вводит неверное значение в элементе управления , поддерживает шаблон развертывания и свертывание шаблона , уведомления об изменении состояния и имени, а также свойствоControlType со значением. Область сообщений, отображаемая при развертывании кнопки сведений диалогового окна ошибки, теперь доступна клавиатура и позволяет экранный диктор объявить содержимое сообщения об ошибке.
AccessibleRole строк в элементе управления PropertyGrid изменились с "Строка" на "Ячейка". Ячейка сопоставляется с UIA ControlType "DataItem", что позволяет поддерживать соответствующие сочетания клавиш и объявления экранного диктора.
Строки элементов управления PropertyGrid, представляющие элементы заголовка, когда элемент управления PropertyGrid имеет свойство PropertySort, равное PropertySort.Categorized, имеют значение свойства ControlTypeControlType.Button.
Строки управления PropertyGrid, представляющие элементы заголовка, когда элемент управления PropertyGrid имеет свойство PropertySort, которое PropertySort.Categorized поддерживает шаблон развертывания и свертывание.
Улучшена навигация по клавиатуре между сеткой и панелью инструментов над ней. Теперь нажатие клавиши SHIFT-TAB выбирает первую кнопку Панели инструментов, а не всю панель инструментов.
PropertyGrid элементы управления, отображаемые в режиме высокой контрастности, теперь нарисуют прямоугольник фокуса вокруг кнопки ToolBar, которая соответствует текущему значению свойства PropertySort.
элементы управления PropertyGrid, отображаемые в режиме высокой контрастности и с установленным свойством PropertySort на PropertySort.Categorized, теперь будут отображать фон заголовков категорий в цвете с высокой контрастностью.
PropertyGrid элементы управления лучше различают элементы ToolBar с фокусом и элементы ToolBar, которые указывают текущее значение свойства PropertySort. Это исправление состоит из изменения высококонтрастного режима и изменения для сценариев без высокой контрастности.
Элементы панели инструментов PropertyGrid, которые указывают текущее значение свойства PropertySort, поддерживают TogglePattern.
Улучшена поддержка экранного диктора для различения выбранного выравнивания в инструменте выбора выравнивания.
Когда пустой элемент управления PropertyGrid отображается в форме, теперь он будет получать фокус, тогда как ранее этого не происходило.
Использование определенных ОС цветов в темах высокой контрастности
- Элементы управления Button и CheckBox с их свойством FlatStyle заданы FlatStyle.System, который является стилем по умолчанию, теперь при выборе используется определяемые ОС цвета в теме высокой контрастности. Ранее цвета текста и фона не контрастировали и были трудно читать.
- Элементы управления Button, CheckBox, RadioButton, Label, LinkLabelи GroupBox со свойством Enabled, установленным в значение false, использовали затененный цвет для отображения текста в темах высокой контрастности, что приводит к низкой контрастности по отношению к фону. Теперь эти элементы управления используют цвет "Отключенный текст", определенный ОС. Это исправление применяется к элементам управления, свойству
FlatStyle
присвоено значение, отличное от FlatStyle.System. Последние элементы управления отображаются операционной системой. - DataGridView теперь отображает видимый прямоугольник вокруг содержимого ячейки с текущим фокусом. Ранее это не было видно в некоторых темах высокой контрастности.
- элементы управления ToolStripMenuItem с их свойством Enabled, установленным в false, теперь используют цвет "Отключенный текст", установленный ОС.
- ToolStripMenuItem элементы управления, у которых свойство Checked установлено в истина, теперь выводят связанный флажок в контрастном системном цвете. Ранее цвет флажка не был достаточно контрастен и не виден в темах высокой контрастности. ПРИМЕЧАНИЕ. Windows 10 изменил значения для некоторых цветов системы высокой контрастности. Платформа Windows Forms Framework основана на платформе Win32. Для лучшего использования запустите последнюю версию Windows и включите последние изменения ОС, добавив файл app.manifest в тестовое приложение и отменив комментарий к следующему коду:
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
Улучшенная навигация по клавиатуре
- Если элемент управления ComboBox имеет свойство DropDownStyle значение ComboBoxStyle.DropDownList и является первым элементом управления в порядке табуляции формы, теперь он отображает прямоугольник фокуса при открытии родительской формы с помощью клавиатуры. До этого изменения фокус клавиатуры был на этом элементе управления, но индикатор фокуса не отображался.
улучшенная поддержка экранного диктора
Элемент управления MonthCalendar добавил поддержку вспомогательных технологий для доступа к нему, включая возможность экранного диктора считывать его значение, когда ранее он не мог.
Элемент управления CheckedListBox теперь уведомляет диспетчер экранного диктора при изменении свойства CheckBox.CheckState. Ранее Нарратор не получал уведомление, и в результате пользователи не были проинформированы о том, что свойство CheckState было обновлено.
Элемент управления LinkLabel изменил способ уведомления экранного диктора о тексте в элементе управления. Ранее экранный диктор дважды объявил об этом тексте и прочитал символы&как реальный текст, даже если они не видны пользователю. Дублированный текст был удален из объявлений экранного диктора, а также ненужных символов "&".
Типы элементов управления DataGridViewCell теперь правильно сообщают о состоянии только для чтения экранному диктору и другим вспомогательным технологиям.
Экранный диктор теперь может читать системное меню дочерних окон в приложениях [Multiple-Document Интерфейс]~/docs/framework/winforms/advanced/multiple-document-interface-mdi-applications.md).
Экранный диктор теперь может читать элементы управления ToolStripMenuItem с свойством ToolStripItem.Enabled, равным false. Ранее экранный диктор не мог фокусироваться на неактивных элементах меню, чтобы прочитать их содержимое.
Имя | Ценность |
---|---|
Размах | Майор |
Версия | 4.8 |
Тип | Перенацеливание |
Затронутые API
- ToolStripDropDownButton.CreateAccessibilityInstance()
- DomainUpDown.DomainUpDownAccessibleObject.Name
- MonthCalendar.AccessibilityObject
Windows Presentation Foundation (WPF)
Улучшения специальных возможностей в WPF
Подробности
улучшения высокой контрастности
- Фокус для элемента управления Expander теперь отображается. В предыдущих версиях .NET Framework это не было.
- Текст в элементах управления CheckBox и RadioButton, когда они выбраны, теперь проще видеть, чем в предыдущих версиях .NET Framework.
- Граница отключенного ComboBox теперь совпадает по цвету с отключенным текстом. В предыдущих версиях .NET Framework это не было.
- Теперь отключенные и сфокусированные кнопки используют правильный цвет темы. В предыдущих версиях .NET Framework они этого не поддерживали.
- Теперь кнопка раскрывающегося списка отображается, если для стиля элемента управления ComboBox задано значение ToolBar.ComboBoxStyleKey. В предыдущих версиях .NET Framework это не было.
- Стрелка индикатора сортировки в элементе управления DataGrid теперь использует цвета темы. В предыдущих версиях .NET Framework этого не было.
- Стиль гиперссылки по умолчанию изменяется на правильный цвет темы при наведении мыши. В предыдущих версиях .NET Framework этой функции не было.
- Фокус клавиатуры на переключателях теперь отображается. В предыдущих версиях .NET Framework это не было.
- Столбец с флажками в элементе управления DataGrid теперь использует ожидаемые цвета для индикации фокуса клавиатуры. В предыдущих версиях .NET Framework этого не было.
- Визуальные элементы фокуса клавиатуры теперь отображаются на элементах управления ComboBox и ListBox. В предыдущих версиях .NET Framework это не было.
Улучшения во взаимодействии со средством чтения с экрана
- Expander элементы управления теперь правильно объявляются как группы (развернуть или свернуть) средствами чтения с экрана.
- DataGridCell элементы управления теперь правильно объявляются как ячейка сетки данных (локализованная) средствами чтения с экрана.
- Теперь средства чтения с экрана объявят имя редактируемого элемента ComboBox.
- PasswordBox элементы управления больше не объявляются средствами чтения с экрана как "нет элементов в представлении".
поддержка LiveRegion
Программы экранного доступа, такие как Narrator, помогают людям понять пользовательский интерфейс приложения, как правило, описывая элемент пользовательского интерфейса, на котором в данный момент сосредоточено внимание. Однако если элемент пользовательского интерфейса изменяется где-то на экране и не имеет фокуса, пользователь может не быть проинформирован и пропустить важную информацию. LiveRegions предназначен для решения этой проблемы. Разработчик может использовать их для информирования программы экранного доступа или любого другого клиента автоматизации пользовательского интерфейса о том, что важное изменение было внесено в элемент пользовательского интерфейса. Затем средство чтения с экрана может решить, как и когда сообщить пользователю об этом изменении. Свойство LiveSetting также позволяет средству чтения с экрана узнать, насколько важно сообщить пользователю об изменениях, внесенных в пользовательский интерфейс.
Предложение
Как согласиться или отказаться от этих изменений
Чтобы приложение пользовалось этими изменениями, оно должно работать в .NET Framework 4.7.1 или более поздней версии. Приложение может воспользоваться этими изменениями в любом из следующих способов:
Целевая платформа .NET Framework 4.7.1. Это рекомендуемый подход. Эти изменения специальных возможностей включены по умолчанию в приложениях WPF, предназначенных для .NET Framework 4.7.1 или более поздней версии.
Он отключает устаревшее поведение специальных возможностей, добавив следующий AppContext Switch в разделе
<runtime>
файла конфигурации приложения и установив ему значениеfalse
, как показано в следующем примере.<?xml version="1.0" encoding="utf-8"?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/> </startup> <runtime> <!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false' --> <AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" /> </runtime> </configuration>
Приложения, использующие .NET Framework 4.7.1 или более позднюю версию и стремящиеся сохранить старое поведение возможностей специального доступа, могут выбрать использование старых функций специального доступа путем явной установки этого переключателя AppContext на true
.
Общие сведения об автоматизации пользовательского интерфейса см. в обзоре автоматизации пользовательского интерфейса.
Имя | Ценность |
---|---|
Размах | Майор |
Версия | 4.7.1 |
Тип | Перенацеливание |
Затронутые API
- AutomationElementIdentifiers.LiveSettingProperty
- AutomationElementIdentifiers.LiveRegionChangedEvent
- System.Windows.Automation.AutomationLiveSetting
- AutomationProperties.LiveSettingProperty
- AutomationProperties.SetLiveSetting(DependencyObject, AutomationLiveSetting)
- AutomationProperties.GetLiveSetting(DependencyObject)
- AutomationPeer.GetLiveSettingCore()
Событие Selector SelectionChanged и свойство SelectedValue
Подробности
Начиная с .NET Framework 4.7.1, Selector всегда обновляет значение своего свойства SelectedValue перед вызовом события SelectionChanged при изменении своей выборки. Это делает свойство SelectedValue согласованным с другими свойствами выбора (SelectedItem и SelectedIndex), которые обновляются перед вызовом события.
В .NET Framework 4.7 и более ранних версиях обновление на SelectedValue произошло до события в большинстве случаев, но это произошло после события, если изменение выбора было вызвано изменением свойства SelectedValue.
Предложение
Приложения, предназначенные для .NET Framework 4.7.1 или более поздней версии, могут отказаться от этого изменения и использовать устаревшее поведение, добавив следующее в раздел <runtime>
файла конфигурации приложения:
<runtime>
<AppContextSwitchOverrides
value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=true" />
</runtime>
Приложения, предназначенные для .NET Framework 4.7 или более ранней версии, но работающие в .NET Framework 4.7.1 или более поздней версии, могут включить новое поведение, добавив следующую строку в раздел <runtime>
файла конфигурации приложения:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=false" />
</runtime>
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7.1 |
Тип | Перенацеливание |
Затронутые API
Событие TabControl SelectionChanged и свойство SelectedContent
Подробности
Начиная с версии .NET Framework 4.7.1, TabControl обновляет значение своего свойства SelectedContent перед вызовом события SelectionChanged, когда изменяется выбор. В версии .NET Framework 4.7 и более ранних обновление SelectedContent происходило после события.
Предложение
Приложения, предназначенные для .NET Framework 4.7.1 или более поздней версии, могут отказаться от этого изменения и использовать устаревшее поведение, добавив следующее в раздел <runtime>
файла конфигурации приложения:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=true" />
</runtime>
Приложения, предназначенные для .NET Framework 4.7 или более ранней версии, но работающие в .NET Framework 4.7.1 или более поздней версии, могут включить новое поведение, добавив следующую строку в раздел <runtime>
файла конфигурации приложения:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.TabControl.SelectionPropertiesCanLagBehindSelectionChangedEvent=false" />
</runtime>
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7.1 |
Тип | Перенацеливание |
Затронутые API
Алгоритм хэша по умолчанию для пакета WPF PackageDigitalSignatureManager теперь — SHA256
Подробности
System.IO.Packaging.PackageDigitalSignatureManager
предоставляет функции цифровых подписей в отношении пакетов WPF. В .NET Framework 4.7 и более ранних версиях алгоритм по умолчанию (PackageDigitalSignatureManager.DefaultHashAlgorithm), используемый для подписывания частей пакета, был SHA1. Из-за недавних проблем безопасности с SHA1 это значение по умолчанию было изменено на SHA256, начиная с .NET Framework 4.7.1. Это изменение влияет на подписывание всех пакетов, включая документы XPS.
Предложение
Разработчик, который хочет использовать это изменение, нацеливаясь на версию платформы ниже .NET Framework 4.7.1, или разработчик, которому требуется предыдущая функциональность при выборе платформы .NET Framework 4.7.1 или более поздней, может задать следующий флаг AppContext соответствующим образом. Значение true приведет к использованию SHA1 в качестве алгоритма по умолчанию; False приводит к SHA256.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.UseSha1AsDefaultHashAlgorithmForDigitalSignatures=true"/>
</runtime>
</configuration>
Имя | Ценность |
---|---|
Размах | Microsoft Edge |
Версия | 4.7.1 |
Тип | Перенацеливание |
Затронутые API
Windows Workflow Foundation (WF)
Улучшения доступности в конструкторе рабочих процессов Windows Workflow Foundation (WF)
Подробности
Конструктор рабочих процессов Windows Workflow Foundation (WF) улучшает, как он работает с технологиями специальных возможностей. К этим улучшениям относятся следующие изменения:
- Порядок вкладок изменяется слева направо и сверху вниз в некоторых элементах управления:
- Окно инициализации корреляции для задания данных корреляции для действия InitializeCorrelation
- Окно определения содержимого для действий Receive, Send, SendReplyи ReceiveReply
- Дополнительные функции доступны с помощью клавиатуры:
- При редактировании свойств действия группы свойств можно свернуть с помощью клавиатуры при первом фокусе.
- Значки предупреждений теперь доступны с помощью клавиатуры.
- Кнопка "Дополнительные свойства" в окне "Свойства" теперь доступна с помощью клавиатуры.
- Теперь пользователи клавиатуры могут получить доступ к элементам заголовка в панелях аргументов и переменных конструктора рабочих процессов.
- Улучшена видимость элементов, находящихся в фокусе, например:
- Добавление строк в сетки данных, используемых конструктором рабочих процессов и конструкторами действий.
- Переключение по полям в действиях ReceiveReply и SendReply.
- Задание значений по умолчанию для переменных или аргументов
- Средства чтения с экрана теперь могут правильно распознать следующее:
- Точки останова, заданные в конструкторе рабочих процессов.
- Действия FlowSwitch<T>, FlowDecisionи CorrelationScope.
- Содержимое действия Receive.
- Тип цели для действия InvokeMethod.
- Поле со списком исключений и разделом "Наконец" в действии TryCatch.
- Поле со списком "Тип сообщения", разделитель в окне "Добавление инициализаторов корреляции", окно "Определение содержимого" и окно "Определение коррелей" в действиях обмена сообщениями (Receive, Send, SendReplyи ReceiveReply).
- Переходы конечных автоматов и их цели.
- Аннотации и соединители для действий FlowDecision.
- Контекстные меню (щелкните правой кнопкой мыши) для действий.
- Редакторы значений свойств, кнопка "Очистить поиск", кнопки "По категориям" и "Алфавитный сортировка" и диалоговое окно "Редактор выражений" в сетке свойств.
- Процент увеличения в редакторе рабочих процессов.
- Разделитель в действиях Parallel и Pick.
- Действие InvokeDelegate.
- Окно "Выбор типов" для действий словаря (
Microsoft.Activities.AddToDictionary<TKey,TValue>
,Microsoft.Activities.RemoveFromDictionary<TKey,TValue>
и т. д.). - Окно "Обзор и выбор типа .NET".
- Хлебные крошки в конструкторе рабочих процессов.
- Пользователи, которые выбирают темы высокой контрастности, увидят много улучшений в видимости конструктора рабочих процессов и его элементов управления, таких как лучшее соотношение контрастности между элементами и более заметными полями выбора, используемыми для элементов фокуса.
Предложение
Если у вас есть приложение с повторно размещенным конструктором рабочих процессов, приложение может воспользоваться этими изменениями, выполнив одно из следующих действий:
- Перекомпилируйте своё приложение для .NET Framework 4.7.1. Эти изменения доступности включены по умолчанию.
- Если приложение предназначено для .NET Framework 4.7 или более ранней версии, но работает в .NET Framework 4.7.1, вы можете отказаться от этих устаревших специальных возможностей, добавив приведенный ниже параметр AppContext в раздел
<runtime>
файла app.config и присвойте ему значениеfalse
, как показано в следующем примере.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false -->
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false" />
</runtime>
</configuration>
Приложения, предназначенные для .NET Framework 4.7.1 или более поздней версии и желающие сохранить устаревшее поведение специальных возможностей, могут использовать устаревшие функции специальных возможностей, явно установив этот параметр AppContext на true
.
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7.1 |
Тип | Перенацеливание |
.NET Framework 4.7.2
Ядро
Разрешить двунаправленные управляющие символы Unicode в URI
Подробности
Юникод задает несколько специальных символов управления, используемых для указания ориентации текста. В предыдущих версиях .NET Framework эти символы были неправильно удалены из всех URI, даже если они присутствуют в их кодируемой процентом форме. Чтобы лучше следовать RFC 3987, теперь мы разрешаем эти символы в URI. При обнаружении незакодированных в URI они кодируются в процентах. При обнаружении в кодировке процентов они остаются as-is.
Предложение
Для приложений, предназначенных для версий .NET Framework начиная с версии 4.7.2, поддержка двунаправленных символов Юникода включена по умолчанию. Если это изменение нежелательно, вы можете его отключить, добавив следующий переключатель AppContextSwitchOverrides в раздел <runtime>
файла конфигурации приложения.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontKeepUnicodeBidiFormattingCharacters=true" />
</runtime>
Для приложений, предназначенных для более ранних версий .NET Framework, но выполняются в версиях, начиная с .NET Framework 4.7.2, поддержка двунаправленных символов Юникода по умолчанию отключена. Его можно включить, добавив следующий AppContextSwitchOverrides в раздел <runtime>
файла конфигурации приложения:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontKeepUnicodeBidiFormattingCharacters=false" />
</runtime>
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7.2 |
Тип | Перенацеливание |
Затронутые API
DeflateStream использует собственные API для декомпрессии
Подробности
Начиная с .NET Framework 4.7.2 реализация декомпрессии в классе T:System.IO.Compression.DeflateStream
по умолчанию изменилась на использование собственных API Windows. Как правило, это приводит к значительному улучшению производительности. Все приложения .NET, предназначенные для .NET Framework версии 4.7.2 или более поздней, используют собственную реализацию. Это изменение может привести к некоторым различиям в поведении, которые включают:
- Сообщения об исключениях могут отличаться. Однако тип генерируемого исключения остается неизменным.
- Некоторые особые ситуации, такие как отсутствие достаточной памяти для завершения операции, могут обрабатываться по-разному.
- Существуют известные различия при разборе заголовка gzip (обратите внимание: затрагивается только набор
GZipStream
для декомпрессии): - Исключения при синтаксическом анализе недопустимых заголовков могут возникать в разное время.
- Собственная реализация гарантирует, что значения для некоторых зарезервированных флагов внутри заголовка gzip (т. е. FLG) задаются в соответствии со спецификацией, что может привести к возникновению исключения, где ранее недопустимые значения игнорировались.
Предложение
Если декомпрессия с нативными API негативно повлияла на поведение вашего приложения, вы можете отказаться от этой функции, добавив опцию Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression
в раздел runtime
файла app.config и установив её на true
:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression=true" />
</runtime>
</configuration>
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7.2 |
Тип | Перенацеливание |
Затронутые API
Убедитесь, что System.Uri использует согласованный зарезервированный набор символов
Подробности
В System.Uriнекоторые символы, закодированные в процентной кодировке, которые иногда декодировались, теперь последовательно остаются закодированными. Это происходит в свойствах и методах, которые обращаются к компонентам URI: путь, запрос, фрагмент или userinfo. Поведение изменится только в том случае, если оба следующих условия являются истинными.
- URI содержит закодированную форму любого из следующих зарезервированных символов:
:
,'
,(
,)
,!
или*
. - Универсальный код ресурса (URI) содержит символ Юникода или закодированный незарезервированный символ. Если оба вышеупомянутых условия выполнены, кодированные зарезервированные символы остаются закодированными. В предыдущих версиях .NET Framework они декодируются.
Предложение
Для приложений, предназначенных для версий .NET Framework, начиная с версии 4.7.2, новое поведение декодирования включено по умолчанию. Если это изменение нежелательно, вы можете отключить его, добавив следующий переключатель AppContextSwitchOverrides в раздел <runtime>
файла конфигурации приложения.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontEnableStrictRFC3986ReservedCharacterSets=true" />
</runtime>
Для приложений, предназначенных для более ранних версий .NET Framework, но выполняются в версиях, начиная с .NET Framework 4.7.2, новое поведение декодирования отключено по умолчанию. Вы можете включить его, добавив следующий переключатель AppContextSwitchOverrides в раздел <runtime>
файла конфигурации приложения.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Uri.DontEnableStrictRFC3986ReservedCharacterSets=false" />
</runtime>
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7.2 |
Тип | Перенацеливание |
Затронутые API
Resgen отказывается загружать содержимое из Интернета
Подробности
Resx-файлы могут содержать двоичные отформатированные входные данные. Если вы пытаетесь использовать resgen для загрузки файла, скачаенного из ненадежного расположения, он не сможет загрузить входные данные по умолчанию.
Предложение
Пользователи Resgen, которые нуждаются в загрузке двоичных данных в формате из ненадежных источников, могут либо удалить метку веб-сайта из входного файла, либо применить опцию отказа. Добавьте следующий параметр реестра, чтобы применить отказ, действующий на уровне всей машины: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft.NETFramework\SDK] "AllowProcessOfUntrustedResourceFiles"="true"
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7.2 |
Тип | Перенацеливание |
Трассировки стека, полученные при использовании переносимых PDB-файлов, теперь включают информацию об исходном файле и строке, если это требуется.
Подробности
Начиная с .NET Framework 4.7.2, трассировки стека, полученные при использовании переносимых PDB, включают информацию об исходном файле и номере строки по запросу. В версиях до .NET Framework 4.7.2 исходный файл и сведения о строке были недоступны при использовании переносимых PDB-файлов, даже если они явно запрашивались.
Предложение
Для приложений, нацеленных на .NET Framework 4.7.2, вы можете исключить сведения об исходном файле и строках кода при использовании переносимых PDB, если это нежелательно, добавив следующий текст в раздел <runtime>
файла app.config
:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Diagnostics.IgnorePortablePDBsInStackTraces=true" />
</runtime>
Для приложений, предназначенных для более ранних версий платформы .NET Framework, но запускаемых в .NET Framework 4.7.2 или более поздней версии, вы можете включить информацию об исходном файле и строках при использовании переносимых PDB-файлов, добавив следующий код в раздел <runtime>
файла app.config
:
<runtime>
<AppContextSwitchOverrides value="Switch.System.Diagnostics.IgnorePortablePDBsInStackTraces=false" />
</runtime>
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7.2 |
Тип | Перенацеливание |
Затронутые API
Windows Forms
Улучшения доступности в элементах управления Windows Forms для .NET 4.7.2
Подробности
Windows Forms Framework улучшает работу с технологиями специальных возможностей для повышения поддержки клиентов Windows Forms. К ним относятся следующие изменения:
- Изменения для улучшения отображения во время режима высокой контрастности.
- Изменения для улучшения навигации по клавиатуре в элементах управления DataGridView и MenuStrip.
- Изменения взаимодействия с экранным диктором.
Предложение
Как отказаться от этих изменений, чтобы приложение пользовалось этими изменениями, оно должно выполняться в .NET Framework 4.7.2 или более поздней версии. Приложение может воспользоваться этими изменениями в любом из следующих способов:
- Он перекомпилируется для целевой платформы .NET Framework 4.7.2. Эти изменения доступности включены по умолчанию в приложениях Windows Forms, предназначенных для .NET Framework 4.7.2 или новее.
- Относится к .NET Framework 4.7.1 или более ранней версии и отключает наследуемое поведение доступности, добавив следующий AppContext Switch в раздел
<runtime>
файла конфигурации приложения и установив его значение наfalse
, как показано в следующем примере.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7"/>
</startup>
<runtime>
<!-- AppContextSwitchOverrides value attribute is in the form of 'key1=true/false;key2=true/false -->
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false" />
</runtime>
</configuration>
Обратите внимание, что чтобы принять участие в функциях специальных возможностей, добавленных в .NET Framework 4.7.2, также необходимо принять участие в специальных возможностях .NET Framework 4.7.1. Приложения, предназначенные для .NET Framework 4.7.2 или более поздней версии и желающие сохранить устаревшее поведение специальных возможностей, могут использовать устаревшие функции специальных возможностей, явно установив этот параметр AppContext на true
.
Использование определенных ОС цветов в темах высокой контрастности
- Стрелка выпадающего списка ToolStripDropDownButton теперь использует цвета, определяемые операционной системой, в режиме высокой контрастности.
- Button, RadioButton и элементы управления CheckBox с FlatStyle для FlatStyle.Flat или FlatStyle.Popup теперь используют определяемые ОС цвета в теме высокой контрастности при выборе. Ранее цвета текста и фона не контрастировали и были трудно читать.
- Элементы управления, содержащиеся в GroupBox с его свойством Enabled, теперь равным
false
, будут использовать определенные ОС цвета в теме высокой контрастности. - Элементы управления ToolStripButton, ToolStripComboBoxи ToolStripDropDownButton имеют повышенную контрастность в режиме высокой контрастности.
- DataGridViewLinkCell по умолчанию использует определенные ОС цвета в режиме высокой контрастности для свойства DataGridViewLinkCell.LinkColor. ПРИМЕЧАНИЕ. Windows 10 изменил значения для некоторых цветов системы высокой контрастности. Платформа Windows Forms Framework основана на платформе Win32. Для лучшего использования запустите последнюю версию Windows и включите последние изменения ОС, добавив файл app.manifest в тестовое приложение и отменив комментарий к следующему коду:
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
улучшенная поддержка экранного диктора
- Экранный диктор теперь озвучивает значение свойства ToolStripMenuItem.ShortcutKeys при объявлении текста из ToolStripMenuItem.
- Диктор теперь указывает, когда у ToolStripMenuItem свойство Enabled установлено на
false
. - Нарратор теперь дает отзыв о состоянии флажка, когда свойству ListView.CheckBoxes присвоено значение
true
. - Порядок фокуса в режиме экрана экранного диктора теперь соответствует визуальному порядку элементов управления в диалоговом окне загрузки ClickOnce.
Улучшена поддержка доступности для DataGridView
- Строки в DataGridView теперь можно сортировать с помощью клавиатуры. Теперь пользователь может использовать ключ F3 для сортировки по текущему столбцу.
- Если для DataGridView.SelectionMode задано значение DataGridViewSelectionMode.FullRowSelect, заголовок столбца изменит цвет, указывая на текущий столбец, по мере того как пользователь перемещается по ячейкам в текущей строке.
- Теперь свойство DataGridViewCell.DataGridViewCellAccessibleObject.Parent возвращает правильный родительский элемент управления.
улучшенные визуальные подсказки
- Элементы управления RadioButton и CheckBox с пустым свойством Text теперь будут отображать индикатор фокуса, когда на них наводят фокус.
улучшенная поддержка сетки свойств
Дочерние элементы управления PropertyGrid теперь возвращают
true
для свойства IsReadOnlyProperty только в том случае, если элемент PropertyGrid включен.Дочерние элементы управления PropertyGrid теперь возвращают
Улучшенная навигация по клавиатуреfalse
для свойства IsEnabledProperty только в том случае, если элемент PropertyGrid можно изменить пользователем. Посмотрите обзор автоматизации пользовательского интерфейсадля получения общих сведений.ToolStripButton теперь позволяет фокусироваться, если он содержится в ToolStripPanel с свойством TabStop, равным
true
.
Имя | Ценность |
---|---|
Размах | Майор |
Версия | 4.7.2 |
Тип | Перенацеливание |
Свойство ContextMenuStrip.SourceControl содержит допустимый элемент управления в случае вложенных объектов ToolStripMenuItems
Подробности
В .NET Framework 4.7.1 и предыдущих версиях свойство ContextMenuStrip.SourceControl неправильно возвращает значение NULL, когда пользователь открывает меню из вложенных элементов управления ToolStripMenuItem. В .NET Framework 4.7.2 и более поздних версиях свойство SourceControl всегда устанавливается на фактический исходный элемент управления.
Предложение
Как отказаться от этих изменений, чтобы приложение пользовалось этими изменениями, оно должно выполняться в .NET Framework 4.7.2 или более поздней версии. Приложение может воспользоваться этими изменениями в любом из следующих способов:
- Он предназначен для .NET Framework 4.7.2. Это изменение включено по умолчанию в приложениях Windows Forms, предназначенных для .NET Framework 4.7.2 или более поздней версии.
- Он предназначен для .NET Framework 4.7.1 или более ранней версии и отключает устаревшие функции специальных возможностей, добавляя следующий AppContext Switch в раздел
<runtime>
файла app.config и устанавливая для него значениеfalse
, как показано в следующем примере.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.UseLegacyContextMenuStripSourceControlValue=false"/>
</runtime>
Приложения, предназначенные для .NET Framework 4.7.2 или более поздней версии, и которые хотят сохранить устаревшее поведение, могут выбрать использование устаревшего значения для исходного контроля, явно установив для этого параметра AppContext значение true
.
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7.2 |
Тип | Перенацеливание |
Затронутые API
Метод PrivateFontCollection.AddFontFile освобождает ресурсы Шрифта
Подробности
В .NET Framework 4.7.1 и предыдущих версиях класс System.Drawing.Text.PrivateFontCollection не освобождает ресурсы шрифтов GDI+ после удаления PrivateFontCollection для объектов Font, добавленных в эту коллекцию с помощью метода AddFontFile(String). В .NET Framework 4.7.2 и более поздних версиях Dispose выпуски шрифтов GDI+, добавленных в коллекцию в виде файлов.
Предложение
Как отказаться от этих изменений, чтобы приложение пользовалось этими изменениями, оно должно выполняться в .NET Framework 4.7.2 или более поздней версии. Приложение может воспользоваться этими изменениями в любом из следующих способов:
- Он перекомпилируется для целевой платформы .NET Framework 4.7.2. Это изменение включено по умолчанию в приложениях Windows Forms, предназначенных для .NET Framework 4.7.2 или более поздней версии.
- Он предназначен для .NET Framework 4.7.1 или более ранней версии и отключает устаревшие функции специальных возможностей, добавив следующие AppContext Switch в раздел
<runtime>
файла app.config и установив для него значениеfalse
, как показано в следующем примере.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Drawing.Text.DoNotRemoveGdiFontsResourcesFromFontCollection=false"/>
</runtime>
Приложения, предназначенные для .NET Framework 4.7.2 или более поздней версии, и которые хотят сохранить устаревшее поведение, могут выбрать сохранение ресурсов шрифтов, явно установив для этого параметра AppContext значение true
.
Имя | Ценность |
---|---|
Размах | Эдж |
Версия | 4.7.2 |
Тип | Перенацеливание |
Затронутые API
Действия кнопок "вверх" и "вниз" в домене WinForm теперь синхронизированы
Подробности
В .NET Framework 4.7.1 и предыдущих версиях, когда присутствует текст элемента управления, действие DomainUpDown.UpButton() для DomainUpDown элемента управления игнорируется. Разработчику следует сначала задать действие DomainUpDown.DownButton() для элемента управления перед выполнением действия DomainUpDown.UpButton(). Начиная с .NET Framework 4.7.2 DomainUpDown.UpButton() и DomainUpDown.DownButton() операции работают независимо в данном сценарии и остаются в синхронизации.
Предложение
Чтобы приложение пользовалось этими изменениями, оно должно работать в .NET Framework 4.7.2 или более поздней версии. Приложение может воспользоваться этими изменениями в любом из следующих способов:
- Он был перекомпилирован на платформу .NET Framework 4.7.2. Это изменение включено по умолчанию в приложениях Windows Forms, предназначенных для .NET Framework 4.7.2 или более поздней версии.
- Он откажется от устаревшего поведения прокрутки, добавив следующий AppContext Switch в раздел
<runtime>
файла конфигурации приложения и установив для него значениеfalse
, как показано в следующем примере.
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Forms.DomainUpDown.UseLegacyScrolling=false"/>
</runtime>
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7.2 |
Тип | Перенацеливание |
Затронутые API
Windows Presentation Foundation (WPF)
Фокус клавиатуры теперь правильно перемещается через несколько уровней размещения в среде WinForms/WPF.
Подробности
Рассмотрим приложение WPF, в котором размещается элемент управления WinForms, который в свою очередь размещает элементы управления WPF. Пользователи могут не иметь возможности перемещаться по вкладкам из слоя WinForms, если первый или последний элемент управления в этом слое — это WPF System.Windows.Forms.Integration.ElementHost
. Это изменение исправляет эту проблему, и пользователи теперь могут перемещать фокус из слоя WinForms. Автоматические приложения, которые зависят от отсутствия выхода фокуса за пределы слоя WinForms, могут перестать работать как ожидалось.
Предложение
Разработчик, который хочет использовать это изменение при выборе версии платформы ниже .NET 4.7.2, может задать для следующего набора флагов AppContext значение false для включения изменения.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false"/>
</runtime>
</configuration>
Приложения WPF должны включиться во все ранние улучшения доступности, чтобы получить более поздние улучшения. Другими словами, и переключатели Switch.UseLegacyAccessibilityFeatures
, и Switch.UseLegacyAccessibilityFeatures.2
должны быть активированы. Разработчик, которому требуется предыдущая функциональность и который использует .NET 4.7.2 или более позднюю версию, может установить следующий флаг AppContext в true, чтобы отключить это изменение.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true"/>
</runtime>
</configuration>
Имя | Ценность |
---|---|
Размах | Microsoft Edge |
Версия | 4.7.2 |
Тип | Перенацеливание |
Алгоритм хэша по умолчанию для компилятора разметки WPF теперь — SHA256
Подробности
WPF MarkupCompiler предоставляет службы компиляции для файлов разметки XAML. В .NET Framework 4.7.1 и более ранних версиях алгоритм хэша по умолчанию, используемый для контрольных сумм, был SHA1. Из-за недавних проблем безопасности с SHA1 это значение по умолчанию было изменено на SHA256, начиная с .NET Framework 4.7.2. Это изменение влияет на создание контрольных сумм для файлов разметки в процессе компиляции.
Предложение
Разработчик, разрабатывающий для .NET Framework 4.7.2 или более новой версии, и желающий вернуться к поведению хэширования SHA1, должен задать следующий флаг AppContext.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Markup.DoNotUseSha256ForMarkupCompilerChecksumAlgorithm=true"/>
</runtime>
</configuration>
Разработчик, который хочет использовать хэширование SHA256 при выборе версии платформы ниже .NET 4.7.2, должен задать следующий флаг AppContext. Обратите внимание, что установленная версия .NET Framework должна быть 4.7.2 или более поздней.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Markup.DoNotUseSha256ForMarkupCompilerChecksumAlgorithm=false"/>
</runtime>
</configuration>
Имя | Ценность |
---|---|
Размах | Прозрачный |
Версия | 4.7.2 |
Тип | Перенацеливание |
Обработка завершения работы AppDomain в WPF теперь может вызывать Dispatcher.Invoke при очистке слабых событий.
Подробности
В .NET Framework 4.7.1 и более ранних версиях WPF потенциально создаёт System.Windows.Threading.Dispatcher в потоке финализатора .NET во время завершения AppDomain. Это было исправлено в .NET Framework 4.7.2 и более поздних версиях, сделав очистку слабых событий с учётом потоков. В связи с этим WPF может вызывать Dispatcher.Invoke для завершения процесса очистки. В некоторых приложениях это изменение времени вызова финализатора может вызвать исключения во время завершения AppDomain или завершения процесса. Обычно это видно в приложениях, которые неправильно завершают работу диспетчеров, работающих в рабочих потоках перед процессом или завершением работы AppDomain. Такие приложения должны должным образом управлять временем существования диспетчеров.
Предложение
В .NET Framework 4.7.2 и более поздних версиях разработчики могут отключить это исправление, чтобы облегчить (но не устранять) проблемы с временем, которые могут возникнуть из-за изменения очистки. Чтобы отключить изменение очистки, используйте следующий флаг AppContext.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.MS.Internal.DoNotInvokeInWeakEventTableShutdownListener=true"/>
</runtime>
</configuration>
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7.2 |
Тип | Перенацеливание |
WPF Изменяет первичный ключ при отображении данных ADO в сценарии master/Detail
Подробности
Предположим, у вас есть коллекция элементов типа Order
, с отношением, названным "OrderDetails", связанным с коллекцией элементов типа Detail
через первичный ключ "OrderID". В вашем приложении WPF можно привязать элемент управления списком к сведениям для заданного заказа.
<ListBox ItemsSource="{Binding Path=OrderDetails}" >
где DataContext — это Order
. WPF получает значение свойства OrderDetails
— коллекцию D всех элементов Detail
, OrderID
которых соответствует OrderID
главного элемента. Изменение поведения возникает при изменении первичного ключа OrderID
главного элемента. ADO автоматически изменяет OrderID
каждой из затронутых записей в коллекции Details (а именно той, которая копируется в коллекцию D). Но что происходит с D?
- Предыдущее поведение: коллекция D очищается. Главный элемент не вызывает уведомление об изменении свойства
OrderDetails
. ListBox продолжает использовать коллекцию D, которая теперь пуста. - Новое поведение: коллекция D не изменяется. Каждый из его элементов вызывает уведомление об изменении для свойства
OrderID
. ListBox продолжает использовать коллекцию D и отображает сведения с новымOrderID
. WPF реализует новое поведение, создавая коллекцию D другим способом: вызывая метод ADO DataRowView.CreateChildView(DataRelation, Boolean) с аргументомfollowParent
, равнымtrue
.
Предложение
Приложение получает новое поведение с помощью следующего параметра AppContext.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Data.DoNotUseFollowParentWhenBindingToADODataRelation=false"/>
</runtime>
</configuration>
Переключение по умолчанию на true
(старое поведение) для приложений, предназначенных для .NET 4.7.1 или более поздней версии, а также для false
(новое поведение) для приложений, предназначенных для .NET 4.7.2 или более поздней версии.
Имя | Ценность |
---|---|
Размах | Несовершеннолетний |
Версия | 4.7.2 |
Тип | Перенацеливание |
Фокусное отображение WPF для radiobutton и checkbox теперь отображается правильно, когда элементы управления не содержат контента.
Подробности
В .NET Framework 4.7.1 и более ранних версиях WPF System.Windows.Controls.CheckBox и System.Windows.Controls.RadioButton имеют несогласованные и в классических и высококонтрастных темах неправильные визуальные элементы фокуса. Эти проблемы возникают в случаях, когда элементы управления не имеют набора содержимого. Это может сделать переход между темами запутанным и визуальный фокус трудным для восприятия. В .NET Framework 4.7.2 эти визуальные элементы теперь более согласованы между темами и более легко видны в классических и высококонтрастных темах.
Предложение
Разработчик, нацеленный на .NET Framework 4.7.2, который хочет вернуться к поведению в .NET 4.7.1, должен задать следующий флаг AppContext.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures.2=true;"/>
</runtime>
</configuration>
Разработчик, который хочет использовать это изменение при выборе версии платформы ниже .NET 4.7.2, должен задать следующие флаги AppContext. Обратите внимание, что все флаги должны быть установлены соответствующим образом, а установленная версия .NET Framework должна иметь значение 4.7.2 или больше. Приложения WPF должны принять все более ранние улучшения специальных возможностей, чтобы получить последние улучшения. Для этого убедитесь, что оба переключателя AppContext 'Switch.UseLegacyAccessibilityFeatures' и 'Switch.UseLegacyAccessibilityFeatures.2' установлены в false.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.UseLegacyAccessibilityFeatures=false;Switch.UseLegacyAccessibilityFeatures.2=false;"/>
</runtime>
</configuration>
Имя | Ценность |
---|---|
Размах | Edge |
Версия | 4.7.2 |
Тип | Перенацеливание |
Выделение текста в WPF TextBox и PasswordBox не соответствует системным цветам
Подробности
В .NET Framework 4.7.1 и более ранних версиях WPF System.Windows.Controls.TextBox
и System.Windows.Controls.PasswordBox
могли отображать только выделение текста на уровне декоратора. В некоторых системных темах это будет закрывать текст, делая его трудным для чтения. В .NET Framework 4.7.2 и более поздних версиях у разработчиков есть возможность включить схему отрисовки выбора, не основанную на элементах Adorner, которая устраняет эту проблему.
Предложение
Разработчик, который хочет использовать это изменение, должен соответствующим образом задать следующий флаг AppContext. Чтобы использовать эту функцию, установленная версия .NET Framework должна быть 4.7.2 или более поздней. Чтобы включить механизм выделения, не основанный на декораторах, используйте следующий флаг AppContext.
<configuration>
<runtime>
<AppContextSwitchOverrides value="Switch.System.Windows.Controls.Text.UseAdornerForTextboxSelectionRendering=false"/>
</runtime>
</configuration>
Имя | Ценность |
---|---|
Размах | Эдж |
Версия | 4.7.2 |
Тип | Перенацеливание |
Windows Workflow Foundation (WF)
Избегайте бесконечных рекурсий для IWorkflowInstanceManagement.TransactedCancel и IWorkflowInstanceManagement.TransactedTerminate
Подробности
В некоторых случаях при использовании IWorkflowInstanceManagement.TransactedCancel или IWorkflowInstanceManagement.TransactedTerminate API для отмены или прекращения экземпляра службы рабочего процесса экземпляр рабочего процесса может столкнуться с переполнением стека из-за бесконечной рекурсии, когда среда выполнения Workflow
пытается сохранить экземпляр службы в процессе обработки запроса. Проблема возникает, если экземпляр рабочего процесса находится в состоянии, в котором ожидается выполнение другого незавершенного запроса WCF к другой службе. Операции TransactedCancel
и TransactedTerminate
создают рабочие элементы, которые помещаются в очередь для экземпляра службы рабочего процесса. Эти рабочие элементы не выполняются в рамках обработки запроса TransactedCancel/TransactedTerminate
. Поскольку экземпляр службы рабочего процесса занят ожиданием завершения другого незавершенного запроса WCF, созданный рабочий элемент остаётся в очереди. Операция TransactedCancel/TransactedTerminate
завершается и элемент управления возвращается клиенту. Когда транзакция, связанная с операцией TransactedCancel/TransactedTerminate
, пытается завершить, требуется сохранить состояние экземпляра службы рабочего процесса. Но так как для экземпляра есть неразрешенный запрос WCF
, среда выполнения Workflow не может сохранить экземпляр службы рабочего процесса, а бесконечный цикл рекурсии приводит к переполнению стека. Так как TransactedCancel
и TransactedTerminate
создают только рабочий элемент в памяти, то то, что транзакция существует, не имеет никакого эффекта. Откат транзакции не удаляет рабочий элемент. Для решения этой проблемы, начиная с .NET Framework 4.7.2, мы ввели AppSetting
, который можно добавить в web.config/app.config
службы рабочего процесса, чтобы она игнорировала транзакции для TransactedCancel
и TransactedTerminate
. Это позволяет транзакции подтверждать без ожидания сохранения экземпляра рабочего процесса. Настройка приложения для этой функции называется microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate
. Значение true
указывает на то, что транзакция должна игнорироваться, что позволяет избежать переполнения стека. Значением по умолчанию этого AppSetting является false
, поэтому существующие экземпляры службы рабочих процессов не затрагиваются.
Предложение
Если вы используете AppFabric или другой клиент IWorkflowInstanceManagement и сталкиваетесь с переполнением стека в экземпляре службы рабочего процесса при попытке отменить или завершить экземпляр рабочего процесса, можно добавить следующее в раздел <appSettings>
файла web.config/app.config для службы рабочего процесса:
<add key="microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate" value="true"/>
Если вы не столкнулись с проблемой, это не нужно делать.
Имя | Ценность |
---|---|
Размах | Край |
Версия | 4.7.2 |
Тип | Перенацеливание |