diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..70a51e2dd --- /dev/null +++ b/.gitattributes @@ -0,0 +1,74 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto encoding=UTF-8 + +# csc/vbc are shell scripts and should always have unix line endings +# These shell scripts are included in the toolset packages. Normally, the shell +# scripts in our repo are only run by cloning onto a Linux/Mac machine, and git +# automatically chooses LF as the line ending. +# +# However, right now the toolset packages must be built on Windows, and so the +# files must be hard-coded to be cloned with LF +src/Compilers/CSharp/CscCore/csc text eol=lf +src/Compilers/VisualBasic/VbcCore/vbc text eol=lf + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +*.cs diff=csharp text +*.vb text + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..83b3b1e60 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,38 @@ +blank_issues_enabled: false +contact_links: + - name: Issue with .NET Framework + url: https://developercommunity.visualstudio.com/dotnet + about: Please open issues relating to the .NET Framework (rather than .NET Core or .NET 5+) in Developer Community + - name: Issue with ASP.NET Core + url: https://github.com/dotnet/aspnetcore/issues/new/choose + about: Please open issues relating to ASP.NET Core in dotnet/aspnetcore. + - name: Issue with .NET runtime or core .NET libraries + url: https://github.com/dotnet/runtime/issues/new/choose + about: Please open issues with the .NET runtime or core .NET libraries in dotnet/runtime. + - name: Issue with .NET SDK + url: https://github.com/dotnet/sdk/issues/new/choose + about: Please open issues relating to the .NET SDK in dotnet/sdk. + - name: Issue with .NET Aspire + url: https://github.com/dotnet/aspire/issues/new/choose + about: Please open issues relating to .NET Aspire in dotnet/aspire. + - name: Issue with Entity Framework + url: https://github.com/dotnet/efcore/issues/new/choose + about: Please open issues relating to Entity Framework in dotnet/efcore. + - name: Issue with .NET MAUI + url: https://github.com/dotnet/maui/issues/new/choose + about: Please open issues relating to .NET MAUI in dotnet/maui. + - name: Issue with Roslyn compiler + url: https://github.com/dotnet/roslyn/issues/new/choose + about: Please open issues relating to the Roslyn .NET compiler in dotnet/roslyn. + - name: Issue with Windows Forms + url: https://github.com/dotnet/winforms/issues/new/choose + about: Please open issues relating to Windows Forms in dotnet/winforms. + - name: Issue with WPF + url: https://github.com/dotnet/wpf/issues/new/choose + about: Please open issues relating to WPF in dotnet/wpf. + - name: Issue with release notes or package deprecation + url: https://github.com/dotnet/core/issues/new/choose + about: Please open issues relating to release notes in dotnet/core. + - name: Issue with .NET website + url: https://github.com/dotnet/website-feedback/issues/new/choose + about: Please open issues relating to the website in dotnet/website-feedback. diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..b5d7fe667 --- /dev/null +++ b/.gitignore @@ -0,0 +1,289 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# VS Code +.vscode/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Typescript v1 declaration files +typings/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 9f7e3945e..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,86 +0,0 @@ -# How to contribute - -We welcome contributions! However, we do have some requests on how contributions -should be done. Please read them in order to avoid surprises down the road. - -## Choosing something to work on - -The issue tracker of each project has a list of items that you can start -working on: - -* **Features**. Those are issues marked as 'enhancement'. - -* **Bugs**. Those are issues marked as 'bug'. - -In order to avoid overlap, it's always a good idea to comment on the item and -let everybody know that you want to work on it. - -## Creating a pull request - -1. Make sure that there is a corresponding issue for your change first. If there - is none, create one. -2. Create a fork in GitHub -3. Create a branch off the `master` branch. Name it something that that makes - sense, such as `issue-123` or `githubhandle-issue`. This makes it easy for everyone to figure out what - the branch is used for. It also makes it easier to isolate your change from incoming changes from the origin. -4. Commit your changes and push your changes to GitHub -5. Create a pull request against the origin's `master` branch - -## DOs and DON'Ts - -* **DO** follow our coding style (see below) -* **DO** include tests when adding new features. When fixing bugs, start with - adding a test that highlights how the current behavior is broken. -* **DO** keep the discussions focused. When a new or related topic comes up - it's often better to create new issue than to side track the discussion. -* **DO** blog and tweet (or whatever) about your contributions, frequently! -* **DON'T** surprise us with big pull requests. Instead, file an issue and start - a discussion so we can agree on a direction before you invest a large amount - of time. -* **DON'T** commit code that you didn't write. If you find MIT or Apache 2 licensed code that you think is a good fit to add to .NET Core, file an issue and start a discussion before proceeding. - - -## C# Coding Style - -The general rule we follow is "use Visual Studio defaults". - -1. We use Allman style braces -2. We use four spaces of indentation (no tabs) -3. We use "_camelCase" private members and use "readonly" where possible -4. We avoid `this.` unless absolutely necessary -5. We always specify the visibility, even if it's the default (i.e. - `private string _foo` not `string _foo`) -6. Namespace imports should be specified at the top of the file, *outside* of - `namespace` declarations and should be sorted alphabetically, with `System.` - namespaces at the top and blank lines between different top level groups - -### Example File: - -```C# -using System.Aardvarks; -using System.IO; -using System.Zebras; - -using Microsoft.CoolStuff; -using Microsoft.CoolStuff.Build; - -using Zebra.Crossing; - -namespace System.More.AndMore -{ - public class MyClass - { - private readonly IAbstraction _something; - - public MyClass(IAbstraction something) - { - _something = something; - } - - public IAbstraction SomethingService - { - get { return _something; } - } - } -} -``` diff --git a/Documentation/KnownIssues/776516-InvalidOperationException in System_Web_ni!System.Web.Hosting.RecycleLimitMonitor+RecycleLimitMonitorSingleton.AlertProxyMonitors.md b/Documentation/KnownIssues/776516-InvalidOperationException in System_Web_ni!System.Web.Hosting.RecycleLimitMonitor+RecycleLimitMonitorSingleton.AlertProxyMonitors.md new file mode 100644 index 000000000..985c1e1da --- /dev/null +++ b/Documentation/KnownIssues/776516-InvalidOperationException in System_Web_ni!System.Web.Hosting.RecycleLimitMonitor+RecycleLimitMonitorSingleton.AlertProxyMonitors.md @@ -0,0 +1,20 @@ +# InvalidOperationException in ASP.Net-RecycleLimitMonitor-AlertProxyMonitors + +## Symptoms +ASP.Net applications may crash intermittently due to an `InvalidOperationException` in +`System_Web_ni!System.Web.Hosting.RecycleLimitMonitor+RecycleLimitMonitorSingleton.AlertProxyMonitors`. + +## Cause +This issue was introduced when ASP.Net 4.7 separated cache management and memory monitoring. This new `RecycleLimitMonitorSingleton` monitors worker process private bytes usage against the recycling limit for the process, and when +the limit is near, it alerts a set of "proxy monitors" in each registered AppDomain so they can take action to avoid a process +recycle. The collection of "proxy monitors" being enumerated was not thread-safe, though, so new AppDomains spinning up or old +AppDomains shutting down while this monitor enumerated the collection could result in this unhandled `InvalidOperationException` +in the default AppDomain, causing a crash. + +## Workaround +There is no reliable workaround. If the environment does not tend to consume private bytes near the recycling limit, or if +web app domain lifetimes tend to last the entire length of the process lifetime, then chances of hitting this issue are +extremely minimal. More private bytes consumption and/or more AppDomain recycling increases the odds of hitting this exception condition. + +## Resolution +A hotfix for this issue is planned for .Net 4.8. This page will be updated with a link to the hotfix when it becomes available. diff --git a/Documentation/KnownIssues/README.md b/Documentation/KnownIssues/README.md new file mode 100644 index 000000000..f9c60efec --- /dev/null +++ b/Documentation/KnownIssues/README.md @@ -0,0 +1,13 @@ +# .NET Framework Known Issues + +The following links provide the known issues about the various .NET Framework versions at the time of their release. They describe the underlying issue and how to resolve them. + +- [.NET Framework 4.8.1](https://github.com/Microsoft/dotnet/blob/master/releases/net481/dotnet481-known-issues.md) +- [.NET Framework 4.8](http://go.microsoft.com/fwlink/?LinkId=2086606) +- [.NET Framework 4.7.2](http://go.microsoft.com/fwlink/?LinkId=863257) +- [.NET Framework 4.7.1](http://go.microsoft.com/fwlink/?LinkId=852101) +- [.NET Framework 4.7](http://go.microsoft.com/fwlink/?LinkId=825308) +- [.NET Framework 4.6.2](http://go.microsoft.com/fwlink/?LinkId=780606) +- [.NET Framework 4.6.1](http://go.microsoft.com/fwlink/?LinkId=671749) +- [.NET Framework 4.6](https://support.microsoft.com/help/3047761/known-issues-for-the--net-framework-4-6) +- [.NET Framework 4.5.2](https://support.microsoft.com/help/2962547/known-issues-for-the-net-framework-4-5-2) diff --git a/Documentation/KnownIssues/Template/NETFXKnownIssuesTemplate.md b/Documentation/KnownIssues/Template/NETFXKnownIssuesTemplate.md new file mode 100644 index 000000000..c729b6205 --- /dev/null +++ b/Documentation/KnownIssues/Template/NETFXKnownIssuesTemplate.md @@ -0,0 +1,22 @@ +# [|Known Issue Title|] +// There is no built-in way to do comments in Markdown, so this template uses a C#-style comment to mark comments. Please REMOVE ALL COMMENTS before submission. +// Please use proper markdown syntax for code snippets. See for examples. +// Entries with [| ... |] are fields that must be updated. + +## Symptoms +[|Description of the symptom(s)|] +// A description of the symptom(s) that exhibit due to the underlying issue. + +## Cause +[|Description of the root cause(s)|] + +## Workaround +[|Description of the workaround, if available|] + +## Resolution +[|Description of the resolution|] +// Add the steps that will allow users to resolve the underlying problem including any workarounds. +// In future, if there is a fix available, then also update this page with the latest information or future update/hotfix link. + +## More information +// This is an optional section. Add any other relevant information, if available, like link(s) to help docs, blog etc. diff --git a/Documentation/KnownIssues/wpf-binding-issue.md b/Documentation/KnownIssues/wpf-binding-issue.md new file mode 100644 index 000000000..3912f6899 --- /dev/null +++ b/Documentation/KnownIssues/wpf-binding-issue.md @@ -0,0 +1,55 @@ +# WPF Binding stops working after an item container leaves the visual tree + +## Symptoms +This issue affects bindings whose path contains an explicit use of the `DataContext` +property of an element that belongs to the subtree generated for an item within an +`System.Windows.Controls.ItemsControl`. When the element leaves the visual tree, +the binding stops working; any subsequent changes to other properties mentioned in +the path are ignored. + +The visible symptoms depend on how the binding is used. For example, an app +may want to share a `System.Windows.Controls.ContextMenu` among the +item containers within an `System.Windows.Controls.ItemsControl`, and have the +content and behavior of the menu depend on the item container for which it is +displayed. This can be implemented by declaring the menu as a resource and binding its +`DataContext` to that of its `PlacementTarget`: + +```xml + + + ... other content ... + + +``` + +Then refer to the resource in the appropriate data template: + +```xml + + + ... other content .... + + +``` + +When the user right-clicks the `StackPanel` for a particular data item, the shared context menu +is displayed, its `PlacementTarget` is changed to be the `StackPanel`, the binding sets its +`DataContext` to the data item, and the menu's content and behavior can depend on the data item. + +The issue arises if the app removes the item container from the visual tree while the menu +is visible. (There are many ways this can happen: removing the data item from the underlying +collection, replacing the `ItemsSource`, scrolling enough to re-virtualize the data item, etc.) +When this happens, the binding stops working, and any subsequent changes to the `PlacementTarget` +property are ignored. The visible symptom is that right-clicking a different data item +will bring up the menu and reset its `PlacementTarget`, but its content and behavior are +still attached to the original item rather than to the newly-chosen one. + +## Cause +When an item container leaves the visual tree, its `DataContext` is changed to `{DisconnectedItem}`. +The binding recognizes this sentinel value and suppresses the normal data transfer, but +mistakenly leaves itself in a state where it ignores subsequent changes to other properties +along the path (such as `PlacementTarget` in the example). + +## Resolution +A hotfix for this issue is planned for .Net Framework 4.8. This page will be updated with a link to the hotfix when it becomes available. diff --git a/Documentation/KnownIssues/wpf-pma-window-drag.md b/Documentation/KnownIssues/wpf-pma-window-drag.md new file mode 100644 index 000000000..b68e59cac --- /dev/null +++ b/Documentation/KnownIssues/wpf-pma-window-drag.md @@ -0,0 +1,7 @@ +# Per-Monitor DPI-aware WPF applications position mouse cursor incorrectly when dragging between monitors + +## Symptoms +A user running a WPF application that enables the Per-Monitor DPI awareness feature introduced in .NET Framework 4.7.2 may notice that the mouse cursor is in a different location relative to the window after dragging the window from one monitor to another. + +## Cause +This issue is caused by a calculation error when resizing and placing the window after switching DPI. diff --git a/Documentation/README.md b/Documentation/README.md new file mode 100644 index 000000000..6323e4aa1 --- /dev/null +++ b/Documentation/README.md @@ -0,0 +1,15 @@ +# Documentation + +The following documents are available in this repo: + +- [.NET Framework Application Compatibility](compatibility/README.md) +- [.NET Framework Known Issues](KnownIssues/README.md) +- [.NET Framework Release Notes](../releases/README.md) +- [Testing with RyuJIT](testing-with-ryujit.md) + +The following .NET Framework documentation is available from Microsoft: + +- [.NET Framework Documentation](https://docs.microsoft.com/dotnet/articles/framework/) +- [.NET Core Documentation](https://docs.microsoft.com/dotnet/articles/core/) +- [.NET Standard Documentation](https://docs.microsoft.com/dotnet/standard/net-standard) +- [General .NET Development](https://docs.microsoft.com/dotnet/standard/) diff --git a/Documentation/compatibility/! Template.md b/Documentation/compatibility/! Template.md new file mode 100644 index 000000000..843116dd5 --- /dev/null +++ b/Documentation/compatibility/! Template.md @@ -0,0 +1,64 @@ +## [|Breaking Change Title|] + +// There is no built in way to do comments in Markdown, so this C# style comment used to mark comments. Please remove all of these before submission +// Please use proper markdown syntax for code snippets. See https://daringfireball.net/projects/markdown/syntax for examples +// Entries with [| ... |] are fields that must be updated. + +### Scope +[|Major|Minor|Edge|Transparent|] +//A description of the Scope values can be found at https://docs.microsoft.com/dotnet/articles/framework/migration-guide/net-compatibility-diagnostics + +### Version Introduced +[|Version in which the breaking change first occurred|] + +### Version Reverted +[|Version in which the breaking change was reverted. If not applicable, please remove|] + +### Source Analyzer Status +// Flag that specifies whether an analyzer for Microsoft.DotNet.FrameworkCompatibilityDiagnostics has been or will be written +// For more information on the diagnostics, see this blog: https://blogs.msdn.microsoft.com/dotnet/2016/03/03/net-framework-compatibility-diagnostics/ +[|Investigating|Planned|Available|NotPlanned|] + +### Change Description +[|Description of what a change does and how it may affect someone|] + +// Replace the space with an 'x' if applicable +- [ ] Quirked // Uses some mechanism to turn the feature on or off, usually using runtime targeting, AppContext or config files. Needs to be turned on automatically for some situations. +- [ ] Build-time break // Causes a break if attempted to recompile + +### Recommended Action +[| + Suggested steps if user is affected go here: + + - Example of code changes to handle change + - How to opt out of change + - For earlier versions, how to opt in to change +|] + +### Affected APIs +[| List of APIs affected by change referred to using docids|] + +// For details on how to generate docids, please look at other change files or +// see https://msdn.microsoft.com/library/fsbx0t7x.aspx for the spec. +// +// For example, if all members of System.Xml.XmlTextReader is affected, we would have the following item: +// * `T:System.Xml.XmlTextReader` +// +// Notice that only the type is included, as everything contained with it will be included as well. This works for any level of the type +// hierarchy and allows for whole namespaces to be included if needed. +// +// If no specific API is affected, use the following entry: +// * Not detectable via API analysis + +### Category +[|Pick a category from [the list of supported categories](!categories.md)|] + +// If no link is available, please remove this line +[More information]([|LinkForMoreInformation|]) + + + + diff --git a/Documentation/compatibility/!categories.md b/Documentation/compatibility/!categories.md new file mode 100644 index 000000000..c52e096c0 --- /dev/null +++ b/Documentation/compatibility/!categories.md @@ -0,0 +1,27 @@ +| Category| +|---------| +|ADO.NET| +|ASP.NET| +|C#| +|ClickOnce| +|Core| +|Data| +|Debugger| +|Entity Framework| +|Globalization| +|JIT| +|LINQ| +|Managed Extensibility Framework (MEF)| +|MSBuild| +|Networking| +|Printing| +|Security| +|Serialization| +|Setup and Deployment| +|Visual Basic .NET| +|Web Applications| +|Windows Communication Foundation (WCF)| +|Windows Forms| +|Windows Presentation Foundation (WPF)| +|Windows Workflow Foundation (WF)| +|XML, XSLT| diff --git a/Documentation/compatibility/ASPNET-accessibility-improvement.md b/Documentation/compatibility/ASPNET-accessibility-improvement.md new file mode 100644 index 000000000..b4734f939 --- /dev/null +++ b/Documentation/compatibility/ASPNET-accessibility-improvement.md @@ -0,0 +1,58 @@ +## ASP.NET Accessibility Improvements in .NET Framework 4.7.1 + +### Scope +Minor + + +### Version Introduced +4.7.1 + + +### Source Analyzer Status +NotPlanned + + +### Change Description +Starting with the .NET Framework 4.7.1, ASP.NET has improved how ASP.NET Web Controls work with accessibility technology in Visual Studio to better support ASP.NET customers. These include the following changes: + +- Changes to implement missing UI accessibility patterns in controls, like the Add Field dialog in the Details View wizard, or the Configure ListView dialog of the ListView wizard. + +- Changes to improve the display in High Contrast mode, like the Data Pager Fields Editor. + +- Changes to improve the keyboard navigation experiences for controls, like the Fields dialog in the Edit Pager Fields wizard of the DataPager control, the Configure ObjectContext dialog, or the Configure Data Selction dialog of the Configure Data Source wizard. + +- [x] Quirked +- [ ] Build-time break + + +### Recommended Action + +**How to opt in or out of these changes** + +In order for the Visual Studio Designer to benefit from these changes, it must run on the .NET Framework 4.7.1 or later. The web application can benefit from these changes in either of the following ways: + +- Install Visual Studio 2017 15.3 or later, which supports the new accessibility features with the following AppContext Switch by default. + +- Opt out of the legacy accessibility behaviors by adding the `Switch.UseLegacyAccessibilityFeatures` AppContext switch to the `` section in the devenv.exe.config file and setting it to `false`, as the following example shows. + +```xml + + + + ... + + + ... + + +``` + +Applications that target the .NET Framework 4.7.1 or later and want to preserve the legacy accessibility behavior can opt in to the use of legacy accessibility features by explicitly setting this AppContext switch to ```true```. + +### Affected APIs + * Not detectable via API analysis + +### Category +ASP.NET + + diff --git a/Documentation/compatibility/Change-SignedXML-and-SignedCMS-default-algorithms-to-SHA256.md b/Documentation/compatibility/Change-SignedXML-and-SignedCMS-default-algorithms-to-SHA256.md new file mode 100644 index 000000000..76ad8dd4e --- /dev/null +++ b/Documentation/compatibility/Change-SignedXML-and-SignedCMS-default-algorithms-to-SHA256.md @@ -0,0 +1,49 @@ +## Default SignedXML and SignedXMS algorithms changed to SHA256 + +### Scope +Minor + +### Version Introduced +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +In the .NET Framework 4.7 and earlier, SignedXML and SignedCMS default to SHA1 for some operations. + +Starting with the .NET Framework 4.7.1, SHA256 is enabled by default for these operations. This change is necessary because SHA1 is no longer considered to be secure. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +There are two new context switch values to control whether SHA1 (insecure) or SHA256 is used by default: + +- Switch.System.Security.Cryptography.Xml.UseInsecureHashAlgorithms + +- Switch.System.Security.Cryptography.Pkcs.UseInsecureHashAlgorithms + +For applications that target the .NET Framework 4.7.1 and later versions, if the use of SHA256 is undesirable, you can restore the default to SHA1 by adding the following configuration switch to the [runtime](~/docs/framework/configure-apps/file-schema/runtime/runtime-element.md) section of your app config file: + +```xml + +``` + +For applications that target the .NET Framework 4.7 and earlier versions, you can opt into this change by adding the following configuration switch to the [runtime](~/docs/framework/configure-apps/file-schema/runtime/runtime-element.md) section of your app config file: + +```xml + +``` + +### Affected APIs +* `T:System.Security.Cryptography.Pkcs.CmsSigner` +* `T:System.Security.Cryptography.Xml.SignedXml` +* `T:System.Security.Cryptography.Xml.Reference` + +### Category +Security + + diff --git a/Documentation/compatibility/GetECDsaPublicKey-correctly-handles-brainpool-curves.md b/Documentation/compatibility/GetECDsaPublicKey-correctly-handles-brainpool-curves.md new file mode 100644 index 000000000..5f1b0e3a8 --- /dev/null +++ b/Documentation/compatibility/GetECDsaPublicKey-correctly-handles-brainpool-curves.md @@ -0,0 +1,29 @@ +## ECDsaCertificateExtensions.GetECDsaPublicKey correctly handles Brainpool curves + +### Scope +Edge + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +Starting with .NET Framework 4.8, the method correctly handles all named curves supported by the OS, including the Brainpool elliptic curves. + +### Recommended Action +If you encounter compatibility issues with this change on the .NET Framework 4.8 or a later version, you can opt-out of it by adding the following line to the \ section of the app.config file: + +```xml + + + +``` + +### Affected APIs + +* `M:System.Security.Cryptography.X509Certificates.ECDsaCertificateExtensions.GetECDsaPublicKey(System.Security.Cryptography.X509Certificates.X509Certificate2)` + +### Category +Security diff --git a/Documentation/compatibility/README.md b/Documentation/compatibility/README.md new file mode 100644 index 000000000..ee144fc6f --- /dev/null +++ b/Documentation/compatibility/README.md @@ -0,0 +1,305 @@ +# .NET Framework Application Compatibility + +The following documents provide information on .NET Framework application compatibility. They describe breaking changes and other changes in behavior in each .NET Framework release. + +Please help us improve the [.NET Framework Application Compatibility documents](https://github.com/Microsoft/dotnet/tree/master/Documentation/compatibility). In particular, better titles will improve the index below, both in content and the sort. + +- [.NET Framework 4.8.1](#net-framework-481) +- [.NET Framework 4.8](#net-framework-48) +- [.NET Framework 4.7.2](#net-framework-472) +- [.NET Framework 4.7.1](#net-framework-471) +- [.NET Framework 4.7](#net-framework-47) +- [.NET Framework 4.6.2](#net-framework-462) +- [.NET Framework 4.6.1](#net-framework-461) +- [.NET Framework 4.6](#net-framework-46) +- [.NET Framework 4.5.2](#net-framework-452) +- [.NET Framework 4.5.1](#net-framework-451) +- [.NET Framework 4.5](#net-framework-45) + +## .NET Framework 4.8.1 + +No breaking changes or other changes in behavior which is expected to impact application compatibility are included as a part of .NET Framework 4.8.1 + +## .NET Framework 4.8 + +- [.NET COM successfully marshals ByRef SafeArray parameters on events](interop-event-handlers-safearray.md) +- [.NET Interop will now QueryInterface for IAgileObject (a WinRT interface)](interop-enable-winrt-iagileobject.md) +- [Accessibility improvements in Windows Forms controls for .NET 4.8](winforms-accessibility-changes-48.md) +- [Accessibility improvements in Windows Workflow Foundation (WF) workflow designer](workflow-designer-accessibility-4-8.md) +- [Accessibility improvements in WPF](wpf-accessibility-improvements-48.md) +- [Add SelectionTextBrush public property to TextBox/PasswordBox non-adorner selection](wpf-SelectionTextBrush-property-for-non-adorner-selection.md) +- [ASP.NET Fix handling of InputAttributes and LabelAttributes for WebForms CheckBox control](aspnet-fix-handling-input-and-label-attributes-for-webforms-checkbox-control.md) +- [ASP.NET Incorrect multipart handling may result in lost form data.](aspnet-invalid-results-from-httprequest.getattributefromheader.md) +- [ASP.NET ValidationContext.MemberName is not NULL when using custom DataAnnotations.ValidationAttribute](aspnet-asp.net-validationcontext.membername-is-null-sometimes.md) +- [CLR critical section spin-wait removal](clr_critical_section_spin_wait_removal.md) +- [Data Binding improvement for KeyedCollection](wpf-databinding-should-use-key-not-indexer.md) +- [ECDsaCertificateExtensions.GetECDsaPublicKey correctly handles Brainpool curves](GetECDsaPublicKey-correctly-handles-brainpool-curves.md) +- [Fixed problem of unresponsiveness when ListBox contains duplicate value-types](wpf-hang-listbox-duplicate-valuetypes.md) +- [High DPI (HDPI) improvements in Windows Forms controls for .NET 4.8](winforms-hdpi-changes-48.md) +- [HwndHost now correctly resizes child-HWND during DPI changes](wpf-HwndHost-child-hwnd-correct-size-during-DPI-changes.md) +- [Improvements to Grid star-rows space allocating algorithm](wpf-grid-row-size-allocation-with-collapsed-element.md) +- [Keyboard navigation improvement in ListBox with Hyperlinks](wpf-keyboard-navigation-listbox-hyperlink.md) +- [Managed cryptography classes do not throw a CryptographyException in FIPS mode](cryptographicexception-not-thrown-in-fips-mode.md) +- [Performance improvement in Automation tree for grouping ItemsControls](wpf-performace-improvement-grouping-automation.md) +- [svcTraceViewer ComboBox high contrast change](wcf-accessbility-combobox-high-contrast-issue-in-svcTraceViewer-tool.md) +- [System.Threading.Monitor lock acquision scalability improvement](system_threading_monitor_lock_acquisition_scalability_improvement.md) +- [System.Threading.Timer lock contention improvement](system_threading_timer_lock_contention_improvement.md) +- [Workflow XAML checksums for symbols changed from SHA1 to SHA256](workflow-xaml-checksums-for-symbols-changed-from-sha1-to-sha256.md) +- [Workflow XOML definition and SqlTrackingService cache keys changed from MD5 to SHA256](workflow-xoml-definition-and-sqltrackingservice-caches-changed-from-md5-to-sha256.md) +- [Workflow XOML file checksums changed from MD5 to SHA256](workflow-xoml-file-checksums-changed-from-md5-to-sha256.md) + +## .NET Framework 4.7.2 + +- ["dataAnnotations:dataTypeAttribute:disableRegEx" app setting is on by default in .NET Framework 4.7.2](aspnet-472-compat-doc.md) +- [Accessibility improvements in Windows Forms controls for .NET 4.7.2](winforms-accessibility-changes-472.md) +- [Allow Unicode Bidirectional Control Characters in URIs](uri-unicode-bidirectional-characters.md) +- [Allow Unicode in URIs that resemble UNC shares](uri-unc-shares-normalized.md) +- [Avoiding endless recursion for IWorkflowInstanceManagement.TransactedCancel and IWorkflowInstanceManagement.TransactedTerminate](wcf-avoid-endless-recursion-in-two-iworkflowinstancemanagement-apis.md) +- [ContextMenuStrip.SourceControl property contains a valid control in the case of nested ToolStripMenuItems](winforms-ContextMenuStrip-SourceControl-property-change.md) +- [DeflateStream uses native APIs for decompression](deflatestream-uses-native-apis-for-decompression.md) +- [Ensure System.Uri uses a consistent reserved character set](uri-reserved-characters-consistent.md) +- [Improved WCF chain trust certificate validation for Net.Tcp certificate authentication](WCF-Improved-WCF-chain-trust-certificate-validation-for-Net.Tcp-certificate-authentication.md) +- [Keyboard focus now moves correctly across multiple layers of WinForms/WPF hosting ](wpf-KB-focus-now-moves-correctly-across-hosting-scenarios.md) +- [Keytips behavior improved in WPF](keytips-behavior-improved-in-wpf.md) +- [PrivateFontCollection.AddFontFile method releases Font resources](winforms-PrivateFontCollection-Font-handle-leak-fix.md) +- [Resgen refuses to load content from the web](resgen-block-mark-of-the-web-content.md) +- [Stack traces obtained when using portable PDBs now include source file and line information if requested](Stack-traces-obtained-when-using-portable-PDBs-now-include-source-file-and-line-information-if-requested.md) +- [Support special relative URI notation when Unicode is present](uri-unicode-scheme-only-relative.md) +- [The default hash algorithm for WPF's Markup Compiler is now SHA256](wpf-MarkupCompiler-default-hash-algorithm-is-now-SHA256.md) +- [WinForm's Domain upbutton and downbutton actions are in sync now](winform's-DomainUpDownControl-button's-actions-in-sync.md) +- [WPF AppDomain Shutdown Handling May Now Call Dispatcher.Invoke in Cleanup of Weak Events](wpf-AppDomain-shutdown-handling-may-now-call-Dispatcher.Invoke-in-cleanup-of-WeakEvents.md) +- [WPF Changing a primary key when displaying ADO data in a Master/Detail scenario](wpf-MasterDetail-ADOdata-PrimaryKey.md) +- [WPF FocusVisual for RadioButton and CheckBox Now Displays Correctly When The Controls Have No Content](wpf-focus-visual-for-radiobutton-and-checkbox-displays-correctly-when-there-is-no-content.md) +- [WPF TextBox/PasswordBox Text Selection Does Not Follow System Colors](wpf-TextBox-PasswordBox-text-selection-does-not-follow-system-colors.md) + +## .NET Framework 4.7.1 + +- [Accessibility improvements in Windows Forms controls](winforms-accessibility-changes-471.md) +- [Accessibility improvements in Windows Workflow Foundation (WF) workflow designer](workflow-designer-accessibility.md) +- [Accessibility improvements in WPF](wpf-accessibility-improvements.MD) +- [ASP.NET Accessibility Improvements in .NET Framework 4.7.1](ASPNET-accessibility-improvement.md) +- [Chained Popups with StaysOpen=False ](wpf-chained-popups-with-StaysOpen-false.md) +- [Default SignedXML and SignedXMS algorithms changed to SHA256](Change-SignedXML-and-SignedCMS-default-algorithms-to-SHA256.md) +- [Improved accessibility for some .NET SDK tools](WCFSDKToolsAccessibilityChangesIn4.7.1.md) +- [Selector SelectionChanged event and SelectedValue property](wpf-selector-selectionchanged-and-selectedvalue.md) +- [SerialPort background thread exceptions](SerialPort-background-thread-exceptions.md) +- [ServiceBase doesn't propagate OnStart exceptions](ServiceBase-doesnt-propagate-OnStart-exceptions.md) +- [TabControl SelectionChanged event and SelectedContent property](wpf-tabcontrol-selectionchanged-and-selectedcontent.md) +- [The default hash algorithm for WPF PackageDigitalSignatureManager is now SHA256](wpf-PackageDigitalSignatureManager.DefaultHashAlgorithm-is-now-SHA256.md) +- [WCF AddressHeaderCollection now throws an ArgumentException if an addressHeader element is null](WCF-AddressHeaderCollection-now-throws-an-ArgumentException-if-an-addressHeader-element-is-null.md) +- [WCF MsmqSecureHashAlgorithm default value is now SHA256](WCF-MsmqSecureHashAlgorithm-default-value-is-now-SHA256.md) +- [WCF PipeConnection.GetHashAlgorithm now uses SHA256](WCF-PipeConnection.GetHashAlgorithm-now-uses-SHA256.md) + +## .NET Framework 4.7 + +- [Crash in Selector when removing an item from a custom INCC collection](wpf-selector-crash-when-removing-item-from-custom-collection.md) +- [CspParameters.ParentWindowHandle now expects HWND value](cspparameters_parentwindowhandle-now-expects-hwnd-value.md) +- [Default value of ServicePointManager.SecurityProtocol is SecurityProtocolType.System.Default](servicepointmanager.securityprotocol-defaults-to-securityprotocoltype.systemdefault.md) +- [Incorrect code generation when passing and comparing UInt16 values](incorrect-code-generation-when-passing-and-comparing-uint16-values.md) +- [NullReferenceException in exception handling code from ImageSourceConverter.ConvertFrom](wpf-nullreferenceexception-in-exception-handling-code-from-imagesourceconverter_convertfrom.md) +- [Resizing a Grid can cause an application to become unresponsive](wpf-hang-when-resizing-a-grid.md) +- [Serialization of control characters with DataContractJsonSerializer is now compatible with ECMAScript V6 and V8](serialization-of-control-characters-with-datacontractjsonserializer-is-now-compatible-with-ecmascript-v6-and-v8.md) +- [SslStream supports TLS Alerts](sslstream-support-for-tls-alerts.md) +- [Throttle concurrent requests per session](throttle-concurrent-requests-per-session.md) +- [WCF message security now is able to use TLS1.1 and TLS1.2](wcf-message-security-unable-to-use-tls1_1-and-tls1_2.md) +- [Workflow checksums changed from MD5 to SHA1](workflow-checksums-changed-from-md5-to-sha1.md) +- [Workflow now throws original exception instead of NullReferenceException in some cases](workflow-now-throws-original-exception-instead-of-nullreferenceexception-in-some-cases.md) +- [Workflow SQL persistence adds primary key clusters and disallows null values in some columns](workflow-sql-persistence-adds-primary-key-clusters-and-disallows-null-values-in-some-columns.md) +- [WPF Grid allocation of space to star-columns](wpf-grid-allocation-of-space-to-star-columns.md) +- [WPF Pointer-Based Touch Stack](wpf-pointer-based-touch-stack.md) +- [WPF Printing Stack Update](wpf-printing-stack-update.md) + +## .NET Framework 4.6.2 + +- [AesCryptoServiceProvider decryptor provides a reusable transform](aescryptoserviceprovider-decryptor-provides-a-reusable-transform.md) +- [Calls to ClaimsIdentity constructors](calls-to-claimsidentity-constructors.md) +- [Changes in path normalization](changes-in-path-normalization.md) +- [Changing the IsEnabled property of the parent of a TextBlock control affects any child controls](changing-the-isenabled-property-of-the-parent-of-a-textblock-control-affects-any-child-controls.md) +- [Connection pool blocking period for Azure SQL databases is removed](connection-pool-blocking-period-for-azure-sql-databases-is-removed.md) +- [DataGridCellsPanel.BringIndexIntoView throws ArgumentOutOfRangeException](datagridcellspanel_bringintoview-throws-argumentoutofrangeexception.md) +- [Deadlock may result when using Reentrant services](wcf-deadlock-results-when-using-reentrant-services.md) +- [Horizontal scrolling and virtualization](horizontal-scrolling-and-virtualization.md) +- [HttpRuntime.AppDomainAppPath Throws a NullReferenceException](asp-net-httpruntime-appdomainapppath-throws-nullreferenceexception.md) +- [Incorrect implementation of MemberDescriptor.Equals](incorrect-implementation-of-memberdescriptor_equals.md) +- [Long path support](long-path-support.md) +- [OperationContext.Current may return null when called in a using clause](operationcontext-current-returns-null-in-a-using-clause.md) +- [Path colon checks are stricter](path-colon-checks-are-stricter.md) +- [Remove Ssl3 from the WCF TransportDefaults](remove-ssl3-from-the-wcf-transportdefaults.md) +- [RibbonGroup background is set to transparent in localized builds](ribbongroup-background-is-set-to-transparent-in-localized-builds.md) +- [RSACng and DSACng are once again usable in Partial Trust scenarios](RSACng-and-DSACng-not-usable-in-Partial-Trust-scenarios.md) +- [RSACng now correctly loads RSA keys of non-standard key size](rsacng-now-correctly-loads-rsa-keys-of-non-standard-keysize.md) +- [RSACng.VerifyHash now returns False for any verification failure](rsacng_verifyhash-now-returns-false-for-any-verification-failure.md) +- [SignedXml and EncryptedXml Breaking Changes](xml-documents-are-now-consider-invalid-if-they-contains-transforms-that-are-not-allowed-on-digital-signatures.md) +- [SignedXml.GetPublicKey returns RSACng on net462 (or lightup) without retargeting change](SignedXml.GetPublicKey-returns-RSACng-on-net462.md) +- [Unicode standard version 8.0 categories now supported](unicode-data-now-support-standard-v8_0-categories.md) +- [WCF transport security supports certificates stored using CNG](wcf-transport-security-supports-certificates-stored-using-cng.md) + +## .NET Framework 4.6.1 + +- [Application.FilterMessage no longer throws for re-entrant implementations of IMessageFilter.PreFilterMessage](application_filtermessage-no-longer-throws-for-re-entrant-implementations-of-imessagefilter_prefiltermessage.md) +- [Calls to System.Windows.Input.PenContext.Disable on touch-enabled systems may throw an ArgumentException](wpf-pencontext-disable-method-calls-on-touch-enabled-systems-may-throw-argumentexception.md) +- [Change in path separator character in FullName property of ZipArchiveEntry objects](change-in-path-separator-character-in-zip-files.md) +- [Contract.Invariant or Contract.Requires\ do not consider String.IsNullOrEmpty to be pure](code-contracts-and-string-isnullorempty-compiler-warning.md) +- [Item-scrolling a flat list with items of different pixel-height](item-scrolling-a-flat-list-with-items-of-different-pixel-height.md) +- [ObjectDisposedException thrown by WPF spellchecker](objectdisposedexception-thrown-by-wpf-spellchecker.md) +- [WCF binding with the TransportWithMessageCredential security mode](wcf-binding-with-the-transportwithmessagecredential-security-mode.md) +- [WPF Spell Checking fails in unexpected ways](wpf-spell-checking-fail-in-unexpected-ways.md) +- [X509CertificateClaimSet.FindClaims Considers All claimTypes](x509certificateclaimset_findclaims-considers-all-claimtypes.md) + +## .NET Framework 4.6 + +- [AppDomainSetup.DynamicBase is no longer randomized by UseRandomizedStringHashAlgorithm](appdomainsetup_dynamicbase-is-no-longer-randomized-by-userandomizedstringhashalgorithm.md) +- [Attempting a TCP/IP connection to a SQL Server database that resolves to `localhost` fails](sql-server-database-connection-that-resolves-to-localhost.md) +- [Calling Attribute.GetCustomAttributes on an indexer property no longer throws AmbiguousMatchException if the ambiguity can be resolved by index's type](calling-attribute_getcustomattributes-on-an-indexer-property-no-longer-throws-ambiguousmatchexception.md) +- [Calling CreateDefaultAuthorizationContext with a null argument has changed](calling-createdefaultauthorizationcontext-with-a-null-argument-has-changed.md) +- [Certificate EKU OID validation](certificate-eku-oid-validation.md) +- [ClickOnce supports SHA-256 on 4.0-targeted apps](clickonce-supports-sha-256-on-4_0-targeted-apps.md) +- [CoerceIsSelectionBoxHighlighted](coerceisselectionboxhighlighted.md) +- [ContentDisposition DateTimes returns slightly different string](contentdisposition-datetimes-returns-slightly-different-string.md) +- [CurrentCulture and CurrentUICulture flow across tasks](currentculture-flows-across-tasks.md) +- [CurrentCulture is not preserved across WPF Dispatcher operations](currentculture-not-preserved-across-wpf-dispatcher-operations.md) +- [ETW event names cannot differ only by a "Start" or "Stop" suffix](etw-event-names-cannot-differ-only-by-suffix.md) +- [Exception message has changed for failed DataContract serialization in case of an unknown type](exception-message-has-changed-for-failed-datacontract-serialization-in-case-of-an-unknown-type.md) +- [HtmlTextWriter does not render `
` element correctly](htmltextwriter-does-not-render-br-element-correctly.md) +- [Icon.ToBitmap successfully converts icons with PNG frames into Bitmap objects](windows-forms-icon-tobitmap-method-successfully-converts-icons-with-png-frames.md) +- [IL ret not allowed in a try region](il-ret-not-allowed-in-a-try-region.md) +- [New 64-bit JIT compiler in the .NET Framework 4.6](new-64-bit-jit-compiler.md) +- [Only Tls 1.0, 1.1 and 1.2 protocols supported in System.Net.ServicePointManager and System.Net.Security.SslStream](only-tls-1_0-1_1-and-1_2-protocols-supported-in-system_net_servicepointmanager-and-system_net_security_sslstream.md) +- [Persian calendar now uses the Hijri solar algorithm](persian-calendar-now-uses-the-hijri-solar-algorithm.md) +- [Product versioning changes in the .NET Framework 4.6 and later versions](product-versioning-changes-in-net-framework-4-6-and-later.md) +- [Reflection objects can no longer be passed from managed code to out-of-process DCOM clients](reflection-objects-can-no-longer-be-passed-from-managed-code-to-out-of-process-dcom-clients.md) +- [TargetFrameworkName for default app domain no longer defaults to null if not set](targetframeworkname-for-default-app-domain-no-longer-defaults-to-null-if-not-set.md) +- [The .NET Framework 4.6 does not use a 4.5.x.x version when registering itself in the registry](the-_net-framework-4_6-does-not-use-a-4_5_x_x-version-when-registering-itself-in-the-registry.md) +- [TLS 1.x by default passes the SCH_SEND_AUX_RECORD flag to the underlying SCHANNEL API](tls-1-x-by-default-passes-sch-send-aux-record-flag-to-the-underlying-schannel-api.md) +- [WCF services that use NETTCP with SSL security and MD5 certificate authentication](wcf-services-using-nettcp-with-ssl-security-and-md5-certificate-authentication.md) +- [WPF layout rounding of margins has changed](wpf-layout-rounding-of-margins-has-changed.md) +- [WPF spell checking in text-enabled controls will not work in Windows 10 for languages not in the OS's input language list](wpf-spell-checking-in-text-enabled-controls-will-not-work-in-windows-10-for-languages-not-in-the-input-language-list.md) +- [WPF windows are rendered without clipping when extending outside a single monitor](wpf-windows-are-rendered-without-clipping-when-extending-outside-a-single-monitor.md) +- [X509Certificate2.ToString(Boolean) does not throw now when .NET cannot handle the certificate](x509certificate2_tostring(bool)-does-not-throw-now-when-dotnet-cannot-handle-the-certificate.md) +- [XmlWriter throws on invalid surrogate pairs](xmlwriter-throws-on-invalid-surrogate-pairs.md) +- [XSD Schema validation now correctly detects violations of unique constraints if compound keys are used and one key is empty](xsd-schema-validation-now-correctly-detects-violations-of-unique-constraints-if-compound-keys-are-used-and-one-key-is-empty.md) + +## .NET Framework 4.5.2 + +- [ASP.NET MVC now escapes spaces in strings passed in via route parameters](asp_net-mvc-now-escapes-spaces-in-strings-passed-in-via-route-parameters.md) +- [DataObject.GetData now retrieves data as UTF-8](dataobject_getdata-now-retrieves-data-as-utf-8.md) +- [EF no longer throws for QueryViews with specific characteristics](ef-no-longer-throws-for-queryviews-with-specific-characteristics.md) +- [No longer able to set EnableViewStateMac to false](no-longer-able-to-set-enableviewstatemac-to-false.md) +- [Opt-in break to revert from different 4.5 SQL generation to simpler 4.0 SQL generation](opt-in-break-to-revert-from-different-4_5-sql-generation-to-simpler-4_0-sql-generation.md) +- [VB.NET no longer supports partial namespace qualification for System.Windows APIs](vb_net-no-longer-supports-partial-namespace-qualification-for-system_windows-apis.md) +- [WPF spawns a wisptis.exe process which can freeze the mouse](wpf-spawns-a-wisptis_exe-process-which-can-freeze-the-mouse.md) + +## .NET Framework 4.5.1 + +- [A ConcurrentDictionary serialized in .NET Framework 4.5 with NetDataContractSerializer cannot be deserialized by .NET Framework 4.5.1 or 4.5.2](a-concurrentdictionary-serialized-in-_net-4_5-with-netdatacontractserializer-cannot-be-deserialized-by-_net-4_5_1-or-4_5_2.md) +- [ADO.NET now attempts to automatically reconnect broken SQL connections](ado_net-now-attempts-to-automatically-reconnect-broken-sql-connections.md) +- [Building an Entity Framework edmx with Visual Studio 2013 can fail with error MSB4062 if using the EntityDeploySplit or EntityClean tasks](building-an-entity-framework-edmx-with-visual-studio-2013-can-fail-with-error-msb4062-if-using-the-entitydeploysplit-or-entityclean-tasks.md) +- [COR_PRF_GC_ROOT_HANDLEs are not being enumerated by profilers](cor_prf_gc_root_handles-are-not-being-enumerated-by-profilers.md) +- [DbParameter.Precision and DbParameter.Scale are now public virtual members](dbparameter_precision-and-dbparameter_scale-are-now-public-virtual-members.md) +- [Deserialization of objects across appdomains can fail](deserialization-of-objects-across-appdomains-can-fail.md) +- [EventListener truncates strings with embedded nulls](eventlistener-truncates-strings-with-embedded-nulls.md) +- [EventSource.WriteEvent impls must pass WriteEvent the same parameters that it received (plus ID)](eventsource_writeevent-impls-must-pass-writeevent-the-same-parameters-that-it-received-(plus-id).md) +- [Marshal.SizeOf and Marshal.PtrToStructure overloads break dynamic code](marshal_sizeof-and-marshal_ptrtostructure-overloads-break-dynamic-code.md) +- [MinFreeMemoryPercentageToActiveService is now respected](minfreememorypercentagetoactiveservice-is-now-respected.md) +- [NetDataContractSerializer fails to deserialize a ConcurrentDictionary serialized with a different .NET version](netdatacontractserializer-fails-to-deserialize-a-concurrentdictionary-serialized-with-a-different-_net-version.md) +- [ObsoleteAttribute exports as both ObsoleteAttribute and DeprecatedAttribute in WinMD scenarios](obsoleteattribute-exports-as-both-obsoleteattribute-and-deprecatedattribute-in-winmd-scenarios.md) +- [ResolveAssemblyReference task now warns of dependencies with the wrong architecture](resolveassemblyreference-task-now-warns-of-dependencies-with-the-wrong-architecture.md) +- [Two-way data-binding to a property with a non-public setter is not supported](two-way-data-binding-to-a-property-with-a-non-public-setter-is-not-supported.md) +- [WinRT stream adapters no long call FlushAsync automatically on close](winrt-stream-adapters-no-long-call-flushasync-automatically-on-close.md) + +## .NET Framework 4.5 + +- [Accessing a WPF DataGrid's selected items from a handler of the DataGrid's UnloadingRow event can cause a NullReferenceException](accessing-a-wpf-datagrid's-selected-items-from-a-handler-of-the-datagrid's-unloadingrow-event-can-cause-a-nullreferenceexception.md) +- [Apps published with ClickOnce that use a SHA-256 code-signing certificate may fail on Windows 2003](apps-published-with-clickonce-that-use-a-sha-256-code-signing-certificate-may-fail-on-windows-2003.md) +- [Assemblies compiled with Regex.CompileToAssembly breaks between 4.0 and 4.5](assemblies-compiled-with-regex_compiletoassembly-breaks-between-4_0-and-4_5.md) +- [BinaryFormatter can fail to find type from LoadFrom context](binaryformatter-can-fail-to-find-type-from-loadfrom-context.md) +- [Binding a WPF selector property (such as 'SelectedItem') to a static property does not work](binding-a-wpf-selector-property-(such-as-'selecteditem')-to-a-static-property-does-not-work.md) +- [BlockingCollection<T>.TryTakeFromAny does not throw anymore](blockingcollection_trytakefromany-does-not-throw-anymore.md) +- [Calling DataGrid.CommitEdit from a CellEditEnding handler drops focus](calling-datagrid_commitedit-from-a-celleditending-handler-drops-focus.md) +- [Calling Items.Refresh on a WPF ListBox, ListView, or DataGrid with items selected can cause duplicate items to appear in the element](calling-items_refresh-on-a-wpf-listbox-or-listview-or-datagrid-with-items-selected-can-cause-duplicate-items-to-appear-in-the-element.md) +- [Change in behavior for Task.WaitAll methods with time-out arguments](change-in-behavior-for-task_waitall-methods-with-time-out-arguments.md) +- [Change in behavior in Data Definition Language (DDL) APIs](change-in-behavior-in-data-definition-language-(ddl)-apis.md) +- [Compiler support for type forwarding when multi-targeting mscorlib](compiler-support-for-type-forwarding-when-multi-targeting-mscorlib.md) +- [ConcurrentQueue<T>.TryPeek can return an erroneous null via its out parameter](concurrentqueue_trypeek-can-return-an-erroneous-null-via-its-out-parameter.md) +- [Data written to PrintSystemJobInfo.JobStream must be in XPS format](data-written-to-printsystemjobinfo-jobstream-must-be-in-xps-format.md) +- [Deserialization of MailMessage objects serialized under the .NET Framework 4.5 may fail](serialization-deserialization-of-mailmessage-objects.md) +- [Different exception handling for ObjectContext.CreateDatabase and DbProviderServices.CreateDatabase methods](different-exception-handling-for-objectcontext_createdatabase-and-dbproviderservices_createdatabase-methods.md) +- [EncoderParameter ctor is obsolete](encoderparameter-ctor-is-obsolete.md) +- [Entity Framework version must match the .NET Framework version](ef-version-must-match-netfx-version.md) +- [EntityFramework 6.0 loads very slowly in apps launched from Visual Studio](entityframework-6_0-loads-very-slowly-in-apps-launched-from-visual-studio.md) +- [Enumerable.Empty<TResult> always returns cached instance](enumerable_empty-always-returns-cached-instance.md) +- [Error codes for maxRequestLength or maxReceivedMessageSize are different](error-codes-for-maxrequestlength-or-maxreceivedmessagesize-are-different.md) +- [ETW EventListeners do not capture events from providers with explicit keywords (like the TPL provider)](etw-eventlisteners-do-not-capture-events-from-providers-with-explicit-keywords.md) +- [Exceptions during unobserved processing in System.Threading.Tasks.Task no longer propagate on finalizer thread](exceptions-during-unobserved-processing-in-system_threading_tasks_task-no-longer-propagate-on-finalizer-thread.md) +- [FlowDocument may show an extra line of text](flowdocument-may-show-an-extra-line-of-text.md) +- [Foreach iterator variable is now scoped within the iteration, so closure capturing semantics are different (in C#5)](foreach-iterator-variable-is-now-scoped-within-the-iteration.md) +- [GlyphRun.ComputeInkBoundingBox() and FormattedText.Extent return different values beginning in .NET Framework 4.5](glyphrun-computeinkboundingbox-and-formattedtext-extent-return-different-values-beginning-in-dotnet-4-5.md) +- [GridViews with AllowCustomPaging set to true may fire the PageIndexChanging event when leaving the final page of the view](gridviews-with-allowcustompaging-set-to-true-may-fire-the-pageindexchanging-event-when-leaving-the-final-page-of-the-view.md) +- [HttpRequest.ContentEncoding property prohibits UTF7](httprequest_contentencoding-property-prohibits-utf7.md) +- [HttpUtility.JavaScriptStringEncode escapes ampersand](httputility_javascriptstringencode-escapes-ampersand.md) +- [IAsyncResult.CompletedSynchronously property must be correct for the resulting task to complete](iasyncresult_completedsynchronously-property-must-be-correct-for-the-resulting-task-to-complete.md) +- [ICommand.CanExecuteChanged event behaviour changed in .NET Framework 4.5](icommand_canexecutechanged-event-behaviour-changed-in-_net-4_5.md) +- [Intermittently unable to scroll to bottom item in ItemsControls (like ListBox and DataGrid) when using custom DataTemplates](intermittently-unable-to-scroll-to-bottom-item-in-itemscontrols-when-using-customer-datatemplates.md) +- [IPad should not be used in custom capabilities file because it is now a browser capability](ipad-should-not-be-used-in-custom-capabilities-file-because-it-is-now-a-browser-capability.md) +- [Items.Clear does not remove duplicates from SelectedItems](items_clear-does-not-remove-duplicates-from-selecteditems.md) +- [Linq to EF Join throws ArgumentOutOfRangeException](linq-to-ef-join-throws-argumentoutofrangeexception.md) +- [List<T>.ForEach can throw exception when modifying list item](list_foreach-can-throw-exception-when-modifying-list-item.md) +- [List.Sort algorithm changed](list_sort-algorithm-changed.md) +- [ListBoxItem IsSelected binding issue with ObservableCollection<T>.Move](listboxitem-isselected-binding-issue-with-observablecollection_move.md) +- [Log file name created by the ObjectContext.CreateDatabase method has changed to match SQL Server specifications](log-file-name-created-by-the-objectcontext_createdatabase-method-has-changed-to-match-sql-server-specifications.md) +- [MachineKey.Encode and MachineKey.Decode methods are now obsolete](machinekey_encode-and-machinekey_decode-methods-are-now-obsolete.md) +- [Managed browser hosting controls from the .NET Framework 1.1 and 2.0 are blocked](managed-browser-hosting-controls-from-the-_net-framework-1_1-and-2_0-are-blocked.md) +- [MEF catalogs implement IEnumerable and therefore can no longer be used to create a serializer](mef-catalogs-implement-ienumerable-and-therefore-can-no-longer-be-used-to-create-a-serializer.md) +- [Missing Target Framework Moniker results in 4.0 behavior](missing-target-framework-moniker-results-in-4_0-behavior.md) +- [Multi-line ASP.Net TextBox spacing changed when using AntiXSSEncoder](multi-line-asp_net-textbox-spacing-changed-when-using-antixssencoder.md) +- [Multiple items in a single TableLayoutPanel cell may be rearranged](multiple-items-in-a-single-tablelayoutpanel-cell-may-be-rearranged.md) +- [New (ambiguous) Dispatcher.Invoke overloads could result in different behavior](new-(ambiguous)-dispatcher_invoke-overloads-could-result-in-different-behavior.md) +- [New enum values in WPF's PageRangeSelection](new-enum-values-in-wpf's-pagerangeselection.md) +- [Non-pooled SQL connections will leak memory if not explicitly disposed](non-pooled-sql-connections-will-leak-memory-if-not-explicitly-disposed.md) +- [Null coalescer values are not visible in debugger until one step later](null-coalescer-values-are-not-visible-in-debugger-until-one-step-later.md) +- [ObjectContext.Translate and ObjectContext.ExecuteStoreQuery now support enum type](objectcontext_translate-and-objectcontext_executestorequery-now-support-enum-type.md) +- [Page.LoadComplete event no longer causes System.Web.UI.WebControls.EntityDataSource control to invoke data binding](page_loadcomplete-event-no-longer-causes-system_web_ui_webcontrols_entitydatasource-control-to-invoke-data-binding.md) +- [PreviewLostKeyboardFocus is called repeatedly if its handler shows a Windows Forms message box](previewlostkeyboardfocus-is-called-repeatedly-if-its-handler-shows-a-message-box.md) +- [Profiling ASP.Net MVC4 apps can lead to Fatal Execution Engine Error](profiling-asp_net-mvc4-apps-can-lead-to-fatal-execution-engine-error.md) +- [Right clicking on a WPF DataGrid row header changes the DataGrid selection](right-clicking-on-a-wpf-datagrid-row-header-changes-the-datagrid-selection.md) +- [Scrolling a WPF TreeView or grouped ListBox in a VirtualizingStackPanel can cause an application to become unresponsive](scrolling-a-wpf-treeview-or-grouped-listbox-in-a-virtualizingstackpanel-can-cause-a-hang.md) +- [Sharing session state with Asp.Net StateServer requires all servers in the web farm to use the same .NET Framework version](sharing-session-state-with-asp_net-stateserver-requires-all-servers-in-the-web-farm-to-use-the-same-_net-framework-version.md) +- [SoapFormatter cannot deserialize Hashtable and similar ordered collection objects](soapformatter-cannot-deserialize-hashtable-and-similar-ordered-collection-objects.md) +- [Some .NET APIs cause first chance (handled) EntryPointNotFoundExceptions](some-_net-apis-cause-first-chance-(handled)-entrypointnotfoundexceptions.md) +- [Some WorkFlow drag-and-drop APIs are obsolete](some-workflow-drag-and-drop-apis-are-obsolete.md) +- [Sql_variant data uses sql_variant collation rather than database collation](sql_variant-data-uses-sql_variant-collation-rather-than-database-collation.md) +- [SqlBulkCopy uses destination column encoding for strings](sqlbulkcopy-uses-destination-column-encoding-for-strings.md) +- [SqlConnection can no longer connect to SQL Server 1997 or databases using the VIA adapter](sqlconnection-can-no-longer-connect-to-sql-server-1997-or-databases-using-the-via-adapter.md) +- [SqlConnection.Open fails on Windows 7 with non-IFS Winsock BSP or LSP present](sqlconnection_open-fails-on-windows-7-with-non-ifs-winsock-bsp-or-lsp-present.md) +- [System.Activities is now APTCA](system_activities-is-now-aptca.md) +- [System.Net.PeerToPeer.Collaboration unavailable on Windows 8](system_net_peertopeer_collaboration-unavailable-on-windows-8.md) +- [System.ServiceModel.Web.WebServiceHost object no longer adds a default endpoint](system_servicemodel_web_webservicehost-object-no-longer-adds-a-default-endpoint.md) +- [System.Threading.Tasks.Task no longer throw ObjectDisposedException after object is disposed](system_threading_tasks_task-no-longer-throw-objectdisposedexception-after-object-is-disposed.md) +- [System.Uri escaping now supports RFC 3986](system_uri-escaping-now-supports-rfc-3986.md) +- [System.Uri parsing adheres to RFC 3987](system_uri-parsing-adheres-to-rfc-3987.md) +- [System.Uri.IsWellFormedUriString method returns false for relative URIs with a colon char in first segment](system_uri_iswellformeduristring-method-returns-false-for-relative-uris-with-a-colon-char-in-first-segment.md) +- [The Replace method in OData URLs is disabled by default](the-replace-method-in-odata-urls-is-disabled-by-default.md) +- [Type.IsAssignableFrom returns wrong result for generic variables with constraints](type_isassignablefrom-returns-wrong-result-for-generic-variables-with-constraints.md) +- [Unexpected InvalidCastException from InvokeMethod activity in WF4](unexpected-invalidcastexception-from-invokemethod-activity-in-wf4.md) +- [WebUtility.HtmlDecode no longer decodes invalid input sequences](webutility_htmldecode-no-longer-decodes-invalid-input-sequences.md) +- [WebUtility.HtmlEncode and WebUtility.HtmlDecode round-trip BMP correctly](webutility_htmlencode-and-webutility_htmldecode-round-trip-bmp-correctly.md) +- [WF serializes Expressions.Literal<T> DateTimes differently now (breaks custom XAML parsers)](wf-serializes-expressions_literal-datetimes-differently.md) +- [WinForm's CheckForOverflowUnderflow property is now true for System.Drawing](winform's-checkforoverflowunderflow-property-is-now-true-for-system_drawing.md) +- [WorkFlow 3.0 types are obsolete](workflow-3_0-types-are-obsolete.md) +- [WorkflowDesigner.Load doesn't remove symbol property](workflowdesigner_load-doesn't-remove-symbol-property.md) +- [WPF Aero2 and AeroLite themes toggle button doesn't show any state](wpf-aero2-and-aerolite-themes-toggle-button-doesn't-show-any-state.md) +- [WPF DataTemplate elements are now visible to UIA](wpf-datatemplate-elements-are-now-visible-to-uia.md) +- [WPF DispatcherSynchronizationContext.CreateCopy now returns a new copy instead of the current instance](wpf-dispatchersynchronizationcontext_createcopy-now-returns-a-new-copy-instead-of-the-current-instance.md) +- [WPF TextBox defaults to undo limit of 100](wpf-textbox-defaults-to-undo-limit-of-100.md) +- [WPF TextBox selected text appears a different color when the text box is inactive](wpf-textbox-selected-text-appears-a-different-color-when-the-text-box-is-inactive.md) +- [WPF TextBox.Text can be out-of-sync with databinding](wpf-textbox_text-can-be-out-of-sync-with-databinding.md) +- [WPF TreeViewItem must be used within a TreeView](wpf-treeviewitem-must-be-used-within-a-treeview.md) +- [XML schema validation is stricter](xml-schema-validation-is-stricter.md) +- [XmlSchemaException now sets line positions properly](xmlschemaexception-now-sets-line-positions-properly.md) +- [XmlSerializer fails while serializing a type that hides an accessible member with an inaccessible one](xmlserializer-fails-while-serializing-a-type-that-hides-an-accessible-member-with-an-inaccessible-one.md) +- [XmlSerializer serializes fields differently in .NET Framework 4.5](xmlserializer-serializes-fields-differently-in-4_5.md) +- [XmlTextReader DTD entity expansion is limited to 10,000,000 characters](xmltextreader-dtd-entity-expansion-is-limited-to-10000000-characters.md) +- [XSLT forward compat now works](xslt-forward-compat-now-works.md) +- [XSLT style sheet exception message changed](xslt-style-sheet-exception-message-changed.md) + +This file was generated by [Breaking Change Readme Generator](https://github.com/Microsoft/dotnet/blob/master/src/bc-readme-gen). diff --git a/Documentation/compatibility/RSACng-and-DSACng-not-usable-in-Partial-Trust-scenarios.md b/Documentation/compatibility/RSACng-and-DSACng-not-usable-in-Partial-Trust-scenarios.md new file mode 100644 index 000000000..9f4979bf5 --- /dev/null +++ b/Documentation/compatibility/RSACng-and-DSACng-not-usable-in-Partial-Trust-scenarios.md @@ -0,0 +1,42 @@ +## RSACng and DSACng are once again usable in Partial Trust scenarios + +### Scope +Edge + +### Version Introduced +4.6.2 + +### Version Reverted +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +CngLightup (used in several higher-level crypto apis, such as ) and in some cases rely on full trust. These include P/Invokes without asserting permissions, and code paths where has permission demands for . Starting with the .NET Framework 4.6.2, CngLightup was used to switch to wherever possible. As a result, partial trust apps that successfully used began to fail and throw exceptions. + +This change adds the required asserts so that all functions using CngLightup have the required permissions. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +If this change in the .NET Framework 4.6.2 has negatively impacted your partial trust apps, upgrade to the .NET Framework 4.7.1. + +### Affected APIs +* `M:System.Security.Cryptography.DSACng.#ctor(System.Security.Cryptography.CngKey)` +* `P:System.Security.Cryptography.DSACng.Key` +* `P:System.Security.Cryptography.DSACng.LegalKeySizes` +* `M:System.Security.Cryptography.DSACng.CreateSignature(System.Byte[])` +* `M:System.Security.Cryptography.DSACng.VerifySignature(System.Byte[],System.Byte[])` +* `M:System.Security.Cryptography.RSACng.#ctor(System.Security.Cryptography.CngKey)` +* `P:System.Security.Cryptography.RSACng.Key` +* `M:System.Security.Cryptography.RSACng.Decrypt(System.Byte[],System.Security.Cryptography.RSAEncryptionPadding)` +* `M:System.Security.Cryptography.RSACng.SignHash(System.Byte[],System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding)` + +### Category +Security + + diff --git a/Documentation/compatibility/SerialPort-background-thread-exceptions.md b/Documentation/compatibility/SerialPort-background-thread-exceptions.md new file mode 100644 index 000000000..03238af43 --- /dev/null +++ b/Documentation/compatibility/SerialPort-background-thread-exceptions.md @@ -0,0 +1,49 @@ +## SerialPort background thread exceptions + +### Scope +Minor + +### Version Introduced +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +Background threads created with streams no longer terminate the process when OS exceptions are thrown.
+ +In applications that target the .NET Framework 4.7 and earlier versions, a process is terminated when an operating system exception is thrown on a background thread created with a stream.
+ +In applications that target the .NET Framework 4.7.1 or a later version, background threads wait for OS events related to the active serial port and could crash in some cases, such as sudden removal of the serial port. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +For apps that target the .NET Framework 4.7.1, you can opt out of the exception handling if it is not desirable by adding the following to the `` section of your `app.config` file: + +```xml + + + +``` + +For apps that target earlier versions of the .NET Framework but run on the .NET Framework 4.7.1 or later, you can opt in to the exception handling by adding the following to the `` section of your `app.config` file: + +```xml + + + +``` + +### Affected APIs + +* `T:System.IO.Ports.SerialPort` + +### Category +Core + + diff --git a/Documentation/compatibility/ServiceBase-doesnt-propagate-OnStart-exceptions.md b/Documentation/compatibility/ServiceBase-doesnt-propagate-OnStart-exceptions.md new file mode 100644 index 000000000..e4da8d13b --- /dev/null +++ b/Documentation/compatibility/ServiceBase-doesnt-propagate-OnStart-exceptions.md @@ -0,0 +1,43 @@ +## ServiceBase doesn't propagate OnStart exceptions + +### Scope + +Minor + +### Version Introduced +4.7.1 + +### Source Analyzer Status + +NotPlanned + +### Change Description + +In the .NET Framework 4.7 and earlier versions, exceptions thrown on service startup are not propagated to the caller of .
+ +Starting with applications that target the .NET Framework 4.7.1, the runtime propagates exceptions to for services that fail to start. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +On service start, if there is an exception, that exception will be propagated. This should help diagnose cases where services fail to start.
+ +If this behavior is undesirable, you can opt out of it by adding the following <AppContextSwitchOverrides> element to the <runtime> section of your application configuration file: + +```xml + +``` + +If your application targets an earlier version than 4.7.1 but you want to have this behavior, add the following <AppContextSwitchOverrides> element to the <runtime> section of your application configuration file: + +```xml + +``` + +### Affected APIs +* `M:System.ServiceProcess.ServiceBase.Run(System.ServiceProcess.ServiceBase)` +* `M:System.ServiceProcess.ServiceBase.Run(System.ServiceProcess.ServiceBase[])` + +### Category +Core \ No newline at end of file diff --git a/Documentation/compatibility/SignedXml.GetPublicKey-returns-RSACng-on-net462.md b/Documentation/compatibility/SignedXml.GetPublicKey-returns-RSACng-on-net462.md new file mode 100644 index 000000000..f71f70bb3 --- /dev/null +++ b/Documentation/compatibility/SignedXml.GetPublicKey-returns-RSACng-on-net462.md @@ -0,0 +1,38 @@ +## SignedXml.GetPublicKey returns RSACng on net462 (or lightup) without retargeting change + +### Scope +Edge + +### Version Introduced +4.6.2 + +### Version Reverted +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description + +Starting with the .NET Framework 4.6.2, the concrete type of the object returned by the method changed (without a quirk) from a CryptoServiceProvider implementation to a Cng implementation. This is because the implementation changed from using `certificate.PublicKey.Key` to using the internal `certificate.GetAnyPublicKey` which forwards to . + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +Starting with apps running on the .NET Framework 4.7.1, you can use the CryptoServiceProvider implementation used by default in the .NET Framework 4.6.1 and earlier versions by adding the following configuration switch to the [runtime](~/docs/framework/configure-apps/file-schema/runtime/runtime-element.md) section of your app config file: + +```xml + +``` + +### Affected APIs +* `M:System.Security.Cryptography.Xml.SignedXml.CheckSignatureReturningKey(System.Security.Cryptography.AsymmetricAlgorithm@)` + +### Category +Security + + diff --git a/Documentation/compatibility/Stack-traces-obtained-when-using-portable-PDBs-now-include-source-file-and-line-information-if-requested.md b/Documentation/compatibility/Stack-traces-obtained-when-using-portable-PDBs-now-include-source-file-and-line-information-if-requested.md new file mode 100644 index 000000000..8c25d25d8 --- /dev/null +++ b/Documentation/compatibility/Stack-traces-obtained-when-using-portable-PDBs-now-include-source-file-and-line-information-if-requested.md @@ -0,0 +1,51 @@ +## Stack traces obtained when using portable PDBs now include source file and line information if requested + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +Starting with .NET Framework 4.7.2, stack traces obtained when using portable PDBs include source file and line information when requested. In versions prior to .NET Framework 4.7.2, source file and line information would be unavailable when using portable PDBs even if explicitly requested. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +For applications that target the .NET Framework 4.7.2, you can opt out of the source file and line information when using portable PDBs if it is not desirable by adding the following to the `` section of your `app.config` file: + +```xml + + + +``` + +For applications that target earlier versions of the .NET Framework but run on the .NET Framework 4.7.2 or later, you can opt in to the source file and line information when using portable PDBs by adding the following to the `` section of your `app.config` file: + +```xml + + + +``` + + +### Affected APIs +* `M:System.Diagnostics.StackTrace.#ctor(System.Boolean)` +* `M:System.Diagnostics.StackTrace.#ctor(System.Exception,System.Boolean)` +* `M:System.Diagnostics.StackTrace.#ctor(System.Exception,System.Int32,System.Boolean)` + + +### Category +Core + +[More information]([https://github.com/dotnet/core/blob/master/Documentation/diagnostics/portable_pdb.md]) + + + + diff --git a/Documentation/compatibility/WCF-AddressHeaderCollection-now-throws-an-ArgumentException-if-an-addressHeader-element-is-null.md b/Documentation/compatibility/WCF-AddressHeaderCollection-now-throws-an-ArgumentException-if-an-addressHeader-element-is-null.md new file mode 100644 index 000000000..323b52053 --- /dev/null +++ b/Documentation/compatibility/WCF-AddressHeaderCollection-now-throws-an-ArgumentException-if-an-addressHeader-element-is-null.md @@ -0,0 +1,35 @@ +## WCF AddressHeaderCollection now throws an ArgumentException if an addressHeader element is null + +### Scope +Minor + +### Version Introduced +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +Starting with the .NET Framework 4.7.1, the constructor throws an if one of the elements is `null`. In the .NET Framework 4.7 and earlier versions, no exception is thrown. + +### Recommended Action +If you encounter compatibility issues with this change on the .NET Framework 4.7.1 or a later version, you can opt-out of it by adding the following line to the `` section of the app.config file:: + +```xml + + + + + +``` + +### Affected APIs +* `M:System.ServiceModel.Channels.AddressHeaderCollection.#ctor(System.Collections.Generic.IEnumerable{System.ServiceModel.Channels.AddressHeader})` + +### Category +Windows Communication Foundation (WCF) + + \ No newline at end of file diff --git a/Documentation/compatibility/WCF-Improved-WCF-chain-trust-certificate-validation-for-Net.Tcp-certificate-authentication.md b/Documentation/compatibility/WCF-Improved-WCF-chain-trust-certificate-validation-for-Net.Tcp-certificate-authentication.md new file mode 100644 index 000000000..3445258b5 --- /dev/null +++ b/Documentation/compatibility/WCF-Improved-WCF-chain-trust-certificate-validation-for-Net.Tcp-certificate-authentication.md @@ -0,0 +1,33 @@ +## Improved WCF chain trust certificate validation for Net.Tcp certificate authentication + +### Scope +Minor + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +.NET Framework 4.7.2 improves chain trust certificate validation when using certificate authentication with transport security with WCF. With this improvement, client certificates that are used to authenticate to a server must be configured for client authentication. Similarly server certificates that are for the authenticating a server must be configured for server authentication. With this change, if the root certificate is disabled, the certificate chain validation fails. The same change was also made to .NET Framework 3.5 and later versions via Windows security roll-up. You can find more information [here](https://support.microsoft.com/help/4055269/security-only-update-for-net-framework-3-5-1-4-5-2-4-6-4-6-1-4-6-2-4-7). + +This change is on by default and can be turned off by a configuration setting. + +### Recommended Action + - Validate if your server and client certification has the required EKU OID. If not, update your certification. + - Validate if your root certificate is invalid. If so, update the root certificate. + - How to opt out of the change: + If you can't update the certificate, you can work around the breaking change temporarily with the following configration setting, However, opting out of the change will leave your system vulnerable to the security issue. + +```xml + + + + ``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Runtime \ No newline at end of file diff --git a/Documentation/compatibility/WCF-MsmqSecureHashAlgorithm-default-value-is-now-SHA256.md b/Documentation/compatibility/WCF-MsmqSecureHashAlgorithm-default-value-is-now-SHA256.md new file mode 100644 index 000000000..fec06da34 --- /dev/null +++ b/Documentation/compatibility/WCF-MsmqSecureHashAlgorithm-default-value-is-now-SHA256.md @@ -0,0 +1,36 @@ +## WCF MsmqSecureHashAlgorithm default value is now SHA256 + +### Scope +Minor +### Version Introduced +4.7.1 +### Source Analyzer Status +NotPlanned +### Change Description +Starting with the .NET Framework 4.7.1, the default message signing algorithm in WCF for Msmq messages is SHA256. In the .NET Framework 4.7 and earlier versions, the default message signing algorithm is SHA1. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +If you run into compatibility issues with this change on the .NET Framework 4.7.1 or later, you can opt-out the change by adding the following line to the ``section of your app.config file: + + +```xml + + + + + +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Communication Foundation (WCF) + + diff --git a/Documentation/compatibility/WCF-PipeConnection.GetHashAlgorithm-now-uses-SHA256.md b/Documentation/compatibility/WCF-PipeConnection.GetHashAlgorithm-now-uses-SHA256.md new file mode 100644 index 000000000..f72ca9656 --- /dev/null +++ b/Documentation/compatibility/WCF-PipeConnection.GetHashAlgorithm-now-uses-SHA256.md @@ -0,0 +1,36 @@ +## WCF PipeConnection.GetHashAlgorithm now uses SHA256 + +### Scope +Minor +### Version Introduced +4.7.1 +### Source Analyzer Status +NotPlanned +### Change Description +Starting with the .NET Framework 4.7.1, Windows Communication Foundation uses a SHA256 hash to generate random names for named pipes. In the .NET Framework 4.7 and earlier versions, it used a SHA1 hash. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +If you run into compatibility issue with this change on the .NET Framework 4.7.1 or later, you can opt-out it by adding the following line to the `` section of your app.config file: + +```xml + + + + + +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Communication Foundation (WCF) + + + diff --git a/Documentation/compatibility/WCFSDKToolsAccessibilityChangesIn4.7.1.md b/Documentation/compatibility/WCFSDKToolsAccessibilityChangesIn4.7.1.md new file mode 100644 index 000000000..479458288 --- /dev/null +++ b/Documentation/compatibility/WCFSDKToolsAccessibilityChangesIn4.7.1.md @@ -0,0 +1,35 @@ +## Improved accessibility for some .NET SDK tools + +### Scope +Edge + +### Version Introduced +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description + +In the .NET Framework SDK 4.7.1, the SvcConfigEditor.exe and SvcTraceViewer.exe tools have been improved by fixing varied accessibility issues. Most of these were small issues like a name not being defined or certain UI automation patterns not being implemented correctly. While many users wouldn’t be aware of these incorrect values, customers who use assistive technologies like screen readers will find these SDK tools more accessible. Certainly, these fixes change some previous behaviors, like keyboard focus order. + +In order to get all the accessibility fixes in these tools, you can the following to your app.config file: +```xml + + + +``` + +- [x] Quirked +- [ ] Build-time break + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Communication Foundation (WCF) + + diff --git a/Documentation/compatibility/a-concurrentdictionary-serialized-in-_net-4_5-with-netdatacontractserializer-cannot-be-deserialized-by-_net-4_5_1-or-4_5_2.md b/Documentation/compatibility/a-concurrentdictionary-serialized-in-_net-4_5-with-netdatacontractserializer-cannot-be-deserialized-by-_net-4_5_1-or-4_5_2.md new file mode 100644 index 000000000..dee240375 --- /dev/null +++ b/Documentation/compatibility/a-concurrentdictionary-serialized-in-_net-4_5-with-netdatacontractserializer-cannot-be-deserialized-by-_net-4_5_1-or-4_5_2.md @@ -0,0 +1,51 @@ +## A ConcurrentDictionary serialized in .NET Framework 4.5 with NetDataContractSerializer cannot be deserialized by .NET Framework 4.5.1 or 4.5.2 + +### Scope +Minor + +### Version Introduced +4.5.1 + +### Version Reverted +4.6 + +### Source Analyzer Status +Available + +### Change Description + +Due to internal changes to the type, + objects that are +serialized with the .NET Framework 4.5 using the + +cannot be deserialized in the .NET Framework 4.5.1 or in the .NET Framework +4.5.2. + +Note that moving in the other direction (serializing with the .NET Framework +4.5.x and deserializing with the .NET Framework 4.5) works. Similarly, all 4.x +cross-version serialization works with the .NET Framework 4.6. + +Serializing and deserializing with a single version of the .NET Framework is not +affected. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +If it is necessary to serialize and deserialize a between the .NET Framework 4.5 and .NET Framework 4.5.1/4.5.2, an alternate serializer like the + or serializer should be used instead of the . + +Alternatively, because this issue is addressed in the .NET Framework 4.6, it may be solved by upgrading to that version of the .NET Framework. + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + + + diff --git a/Documentation/compatibility/accessing-a-wpf-datagrid's-selected-items-from-a-handler-of-the-datagrid's-unloadingrow-event-can-cause-a-nullreferenceexception.md b/Documentation/compatibility/accessing-a-wpf-datagrid's-selected-items-from-a-handler-of-the-datagrid's-unloadingrow-event-can-cause-a-nullreferenceexception.md new file mode 100644 index 000000000..6af2ec4d2 --- /dev/null +++ b/Documentation/compatibility/accessing-a-wpf-datagrid's-selected-items-from-a-handler-of-the-datagrid's-unloadingrow-event-can-cause-a-nullreferenceexception.md @@ -0,0 +1,39 @@ +## Accessing a WPF DataGrid's selected items from a handler of the DataGrid's UnloadingRow event can cause a NullReferenceException + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.6 + +### Source Analyzer Status +Planned + +### Change Description + +Due to a bug in the .NET Framework 4.5, event handlers for + events involving the removal of a row +can cause a to be +thrown if they access the +'s + +or +properties. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This issue has been fixed in the .NET Framework 4.6 and may be addressed by upgrading to that version of the .NET Framework. + +### Affected APIs +* `E:System.Windows.Controls.DataGrid.UnloadingRow` +* `E:System.Windows.Controls.DataGrid.UnloadingRowDetails` + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/ado_net-now-attempts-to-automatically-reconnect-broken-sql-connections.md b/Documentation/compatibility/ado_net-now-attempts-to-automatically-reconnect-broken-sql-connections.md new file mode 100644 index 000000000..3cc036a5b --- /dev/null +++ b/Documentation/compatibility/ado_net-now-attempts-to-automatically-reconnect-broken-sql-connections.md @@ -0,0 +1,55 @@ +## ADO.NET now attempts to automatically reconnect broken SQL connections + +### Scope +Edge + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Planned + +### Change Description + +Beginning in the .NET Framework 4.5.1, the .NET Framework will attempt to +automatically reconnect broken SQL connections. Although this will typically +make apps more reliable, there are edge cases in which an app needs to know that +the connection was lost so that it can take some action upon reconnection. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If this feature is undesirable due to compatibility concerns, it can be disabled +by setting the + +property of a connection string (or +) to +0. + +### Affected APIs +* `M:System.Data.IDbConnection.set_ConnectionString(System.String)` +* `M:System.Data.SqlClient.SqlConnection.set_ConnectionString(System.String)` +* `M:System.Configuration.ConnectionStringSettings.set_ConnectionString(System.String)` +* `M:System.Data.Common.DbConnection.set_ConnectionString(System.String)` +* `M:System.Data.Common.DbConnectionStringBuilder.set_ConnectionString(System.String)` +* `M:System.Data.SqlClient.SqlConnectionStringBuilder.#ctor` +* `M:System.Data.SqlClient.SqlConnectionStringBuilder.#ctor(System.String)` +* `M:System.Data.Common.DbConnectionStringBuilder.#ctor` +* `M:System.Data.Common.DbConnectionStringBuilder.#ctor(System.Boolean)` + +### Categories +ADO.NET +Data + +[More information](https://blogs.msdn.com/b/dotnet/archive/2013/10/17/net-framework-4-5-1-rtm-gt-start-coding.aspx) + + + + diff --git a/Documentation/compatibility/aescryptoserviceprovider-decryptor-provides-a-reusable-transform.md b/Documentation/compatibility/aescryptoserviceprovider-decryptor-provides-a-reusable-transform.md new file mode 100644 index 000000000..5e18f71d6 --- /dev/null +++ b/Documentation/compatibility/aescryptoserviceprovider-decryptor-provides-a-reusable-transform.md @@ -0,0 +1,59 @@ +## AesCryptoServiceProvider decryptor provides a reusable transform + +### Scope +Minor + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Investigating + +### Change Description + +Starting with apps that target the .NET Framework 4.6.2, the + decryptor provides +a reusable transform. After a call to +, +the transform is reinitialized and can be reused. For apps that +target earlier versions of the .NET Framework, attempting to reuse the decryptor +by calling + +after a call to +throws a or +produces corrupted data. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +The impact of this change should be minimal, since this is the expected behavior. + +Applications that depend on the previous behavior can opt out of it using it by adding the following configuration setting to the `` section of the application's configuration file: + + ```xml + + + + ``` + +In addition, applications that target a previous version of the .NET Framework but are running under a version of the .NET Framework starting with .NET Framework 4.6.2 can opt in to it by adding the following configuration setting to the `` section of the application's configuration file: + + ```xml + + + + ``` + +### Affected APIs +- `M:System.Security.Cryptography.AesCryptoServiceProvider.CreateDecryptor` + +### Category +Core + + + + diff --git a/Documentation/compatibility/appdomainsetup_dynamicbase-is-no-longer-randomized-by-userandomizedstringhashalgorithm.md b/Documentation/compatibility/appdomainsetup_dynamicbase-is-no-longer-randomized-by-userandomizedstringhashalgorithm.md new file mode 100644 index 000000000..9c520ba05 --- /dev/null +++ b/Documentation/compatibility/appdomainsetup_dynamicbase-is-no-longer-randomized-by-userandomizedstringhashalgorithm.md @@ -0,0 +1,46 @@ +## AppDomainSetup.DynamicBase is no longer randomized by UseRandomizedStringHashAlgorithm + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +Planned + +### Change Description + +Prior to the .NET Framework 4.6, the value of + would be +randomized between application domains, or between processes, if +UseRandomizedStringHashAlgorithm was enabled in the app's config file. Beginning +in the .NET Framework 4.6, + will +return a stable result between different instances of an app running, and +between different app domains. Dynamic bases will still differ for different +apps; this change only removes the random naming element for different instances +of the same app. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Be aware that enabling `UseRandomizedStringHashAlgorithm` will not result in + being +randomized. If a random base is needed, it must be produced in your app's code +rather than via this API. + +### Affected APIs +* `P:System.AppDomainSetup.DynamicBase` + +### Category +Core + + + + diff --git a/Documentation/compatibility/application_filtermessage-no-longer-throws-for-re-entrant-implementations-of-imessagefilter_prefiltermessage.md b/Documentation/compatibility/application_filtermessage-no-longer-throws-for-re-entrant-implementations-of-imessagefilter_prefiltermessage.md new file mode 100644 index 000000000..1c674a420 --- /dev/null +++ b/Documentation/compatibility/application_filtermessage-no-longer-throws-for-re-entrant-implementations-of-imessagefilter_prefiltermessage.md @@ -0,0 +1,57 @@ +## Application.FilterMessage no longer throws for re-entrant implementations of IMessageFilter.PreFilterMessage + +### Scope +Edge + +### Version Introduced +4.6.1 + +### Source Analyzer Status +Planned + +### Change Description + +Prior to the .NET Framework 4.6.1, calling + +with an + +which called + +or +(while also calling +) +would cause an .

+ +Beginning with applications targeting the .NET Framework 4.6.1, this exception is no longer thrown, and re-entrant filters as described above may be used. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +Be aware that + +will no longer throw for the re-entrant + +behavior described above. This only affects applications targeting the .NET +Framework 4.6.1. + +Apps targeting the .NET Framework 4.6.1 can opt out of this change (or apps +targeting older Frameworks may opt in) by using the +[DontSupportReentrantFilterMessage](~/docs/framework/migration-guide/mitigation-custom-imessagefilter-prefiltermessage-implementations.md#mitigation) +compatibility switch. + +### Affected APIs +* `M:System.Windows.Forms.Application.FilterMessage(System.Windows.Forms.Message@)` + +### Category +Windows Forms + + + + diff --git a/Documentation/compatibility/apps-published-with-clickonce-that-use-a-sha-256-code-signing-certificate-may-fail-on-windows-2003.md b/Documentation/compatibility/apps-published-with-clickonce-that-use-a-sha-256-code-signing-certificate-may-fail-on-windows-2003.md new file mode 100644 index 000000000..fbfbf908d --- /dev/null +++ b/Documentation/compatibility/apps-published-with-clickonce-that-use-a-sha-256-code-signing-certificate-may-fail-on-windows-2003.md @@ -0,0 +1,42 @@ +## Apps published with ClickOnce that use a SHA-256 code-signing certificate may fail on Windows 2003 + +### Scope +Edge + +### Version Introduced +4.5 + +### Version Reverted +4.6 + +### Source Analyzer Status +Available + +### Change Description +The executable is signed with SHA256. Previously, it was signed with SHA1 regardless of whether the code-signing certificate was SHA-1 or SHA-256. This applies to: + +- All applications built with Visual Studio 2012 or later. +- Applications built with Visual Studio 2010 or earlier on systems with the .NET Framework 4.5 present. + +In addition, if the .NET Framework 4.5 or later is present, the ClickOnce manifest is also signed with SHA-256 for SHA-256 certificates regardless of the .NET Framework version against which it was compiled. + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action +The change in signing the ClickOnce executable affects only Windows Server 2003 systems; they require that KB 938397 be installed. + +The change in signing the manifest with SHA-256 even when an app targets the .NET Framework 4.0 or earlier versions introduces a runtime dependency on the .NET Framework 4.5 or a later version. + +### Affected APIs +* Investigate applicable APIs + +### Category +ClickOnce + + + + diff --git a/Documentation/compatibility/asp-net-httpruntime-appdomainapppath-throws-nullreferenceexception.md b/Documentation/compatibility/asp-net-httpruntime-appdomainapppath-throws-nullreferenceexception.md new file mode 100644 index 000000000..5915c46f3 --- /dev/null +++ b/Documentation/compatibility/asp-net-httpruntime-appdomainapppath-throws-nullreferenceexception.md @@ -0,0 +1,42 @@ +## HttpRuntime.AppDomainAppPath Throws a NullReferenceException + +### Scope +Edge + +### Version Introduced +4.6.2 + +### Version Reverted +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description +In the .NET Framework 4.6.2, the runtime throws a `T:System.NullReferenceException` when retrieving a `P:System.Web.HttpRuntime.AppDomainAppPath` value that includes null characters. + +In the .NET Framework 4.6.1 and earlier versions, the runtime throws an `T:System.ArgumentNullException`. + +- [ ] Quirked +- [X] Build-time break + +### Recommended Action +You can do either of the follow to respond to this change: + +- Handle the `T:System.NullReferenceException` if you application is running on the .NET Framework 4.6.2. + +- Upgrade to the .NET Framework 4.7, which restores the previous behavior and throws an `T:System.ArgumentNullException`. + +### Affected APIs +`P:System.Web.HttpRuntime.AppDomainAppPath` + +### Category +ASP.NET + + + + + diff --git a/Documentation/compatibility/asp_net-mvc-now-escapes-spaces-in-strings-passed-in-via-route-parameters.md b/Documentation/compatibility/asp_net-mvc-now-escapes-spaces-in-strings-passed-in-via-route-parameters.md new file mode 100644 index 000000000..5f58a9092 --- /dev/null +++ b/Documentation/compatibility/asp_net-mvc-now-escapes-spaces-in-strings-passed-in-via-route-parameters.md @@ -0,0 +1,32 @@ +## ASP.NET MVC now escapes spaces in strings passed in via route parameters + +### Scope +Minor + +### Version Introduced +4.5.2 + +### Source Analyzer Status +Available + +### Change Description +In order to conform to RFC 2396, spaces in route paths are now escaped when populating action parameters from a route. So, whereas `/controller/action/some data` would previously match the route `/controller/action/{data}` and provide `some data` as the data parameter, it will now provide `some%20data` instead. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Code should be updated to unescape string parameters from a route. If the original URI is needed, it can be accessed with the .OriginalString API. + +### Affected APIs +* `M:System.Web.Mvc.RouteAttribute.#ctor(System.String)` + +### Category +ASP.NET + + + + diff --git a/Documentation/compatibility/aspnet-472-compat-doc.md b/Documentation/compatibility/aspnet-472-compat-doc.md new file mode 100644 index 000000000..0c2f1f123 --- /dev/null +++ b/Documentation/compatibility/aspnet-472-compat-doc.md @@ -0,0 +1,29 @@ +## "dataAnnotations:dataTypeAttribute:disableRegEx" app setting is on by default in .NET Framework 4.7.2 + +### Scope +Minor + +### Version Introduced +4.7.2 + +### Change Description +In .NET Framework 4.6.1, an app setting (`"dataAnnotations:dataTypeAttribute:disableRegEx"`) was introduced that allows users to disable the use of regular expressions in data type attributes (such as , , and ). This helps to reduce security vulnerability such as avoiding the possibility of a Denial of Service attack using specific regular expressions.
+ +In .NET Framework 4.6.1, this app setting to disable RegEx usage was set to `false` by default. Staring with .NET Framework 4.7.2, this config switch is set to `true` by default to further reduce secure vulnerability for web applications that target .NET Framework 4.7.2 and above. + + +### Recommended Action +If you find that regular expressions in your web application do not work after upgrading to .NET Framework 4.7.2, you can update the value of the `"dataAnnotations:dataTypeAttribute:disableRegEx"` setting to `false` to revert to the previous behavior. + +```xml + + + ... + + ... + + +``` + +### Category +Web Applications diff --git a/Documentation/compatibility/aspnet-asp.net-validationcontext.membername-is-null-sometimes.md b/Documentation/compatibility/aspnet-asp.net-validationcontext.membername-is-null-sometimes.md new file mode 100644 index 000000000..bc6330aeb --- /dev/null +++ b/Documentation/compatibility/aspnet-asp.net-validationcontext.membername-is-null-sometimes.md @@ -0,0 +1,35 @@ +## ASP.NET ValidationContext.MemberName is not NULL when using custom DataAnnotations.ValidationAttribute + +### Version Introduced +4.8 + +### Change Description +In .NET Framework 4.7.2 and earlier versions, when using a custom , the property returns `null`. In .NET Framework 4.8, it returns the member name. + + +### Recommended Action +The default behavior of the property remains the same. To retrieve a valid value from the `ValidationContext.MemberName` property, add the following setting to your app config file: + +```xml + + + ... + + ... + + +``` + +### Affected APIs + +* `P:System.ComponentModel.DataAnnotations.ValidationContext.MemberName` + +### Category +ASP.NET + + + + diff --git a/Documentation/compatibility/aspnet-fix-handling-input-and-label-attributes-for-webforms-checkbox-control.md b/Documentation/compatibility/aspnet-fix-handling-input-and-label-attributes-for-webforms-checkbox-control.md new file mode 100644 index 000000000..7dfdf32ef --- /dev/null +++ b/Documentation/compatibility/aspnet-fix-handling-input-and-label-attributes-for-webforms-checkbox-control.md @@ -0,0 +1,35 @@ +## ASP.NET Fix handling of InputAttributes and LabelAttributes for WebForms CheckBox control + +### Version Introduced +4.8 + +### Change Description +For applications that target .NET Framework 4.7.2 and earlier versions, and that are programmatically added to a WebForms control are lost +after postback. For applications that target .NET Framework 4.8 or later versions, they are preserved after postback. + +### Recommended Action +For the correct behavior for restoring attributes on postback, set the `targetFrameworkVersion` to 4.8 or higher. For example: + +```xml + + + + + +``` + +Setting it lower, or not at all, preserves the old incorrect behavior. + +### Affected APIs + +* `T:System.Web.UI.WebControls.CheckBox` + +### Category +ASP.NET + + + + diff --git a/Documentation/compatibility/aspnet-invalid-results-from-httprequest.getattributefromheader.md b/Documentation/compatibility/aspnet-invalid-results-from-httprequest.getattributefromheader.md new file mode 100644 index 000000000..631546645 --- /dev/null +++ b/Documentation/compatibility/aspnet-invalid-results-from-httprequest.getattributefromheader.md @@ -0,0 +1,41 @@ +## ASP.NET Incorrect multipart handling may result in lost form data. + +### Version Introduced +4.8 + +### Change Description +In applications that target .NET Framework 4.7.2 and earlier versions, ASP.Net might incorrectly parse multipart boundary values, +resulting in form data being unavailable during request execution. Applications that target .NET Framework 4.8 or later versions +correctly parse multipart data, so form values are available during request execution. + +### Recommended Action +Starting with applications running on .NET Framework 4.8, when targeting .NET Framework 4.8 or later by using the `targetFrameworkVersion` element, the default behavior changes to strip delimiters. When targeting previous framework versions or not using `targetFrameworkVersion`, trailing delimiters for +some values are still returned. + +This behavior can also be explicitly controlled with an `appSetting`: + +```xml + + + ... + + ... + + +``` + +### Affected APIs + +* `P:System.Web.HttpRequest.Form` +* `P:System.Web.HttpRequest.Files` +* `P:System.Web.HttpRequest.ContentEncoding` + +### Category +ASP.NET + + + + diff --git a/Documentation/compatibility/assemblies-compiled-with-regex_compiletoassembly-breaks-between-4_0-and-4_5.md b/Documentation/compatibility/assemblies-compiled-with-regex_compiletoassembly-breaks-between-4_0-and-4_5.md new file mode 100644 index 000000000..2543660a0 --- /dev/null +++ b/Documentation/compatibility/assemblies-compiled-with-regex_compiletoassembly-breaks-between-4_0-and-4_5.md @@ -0,0 +1,32 @@ +## Assemblies compiled with Regex.CompileToAssembly breaks between 4.0 and 4.5 + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description +If an assembly of compiled regular expressions is built with the .NET Framework 4.5 but targets the .NET Framework 4, attempting to use one of the regular expressions in that assembly on a system with .NET Framework 4 installed throws an exception. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +To work around this problem, you can do either of the following: + +- Build the assembly that contains the regular expressions with the .NET Framework 4. +- Use an interpreted regular expression. + +### Affected APIs +* `M:System.Text.RegularExpressions.Regex.CompileToAssembly(System.Text.RegularExpressions.RegexCompilationInfo[],System.Reflection.AssemblyName)` +* `M:System.Text.RegularExpressions.Regex.CompileToAssembly(System.Text.RegularExpressions.RegexCompilationInfo[],System.Reflection.AssemblyName,System.Reflection.Emit.CustomAttributeBuilder[])` +* `M:System.Text.RegularExpressions.Regex.CompileToAssembly(System.Text.RegularExpressions.RegexCompilationInfo[],System.Reflection.AssemblyName,System.Reflection.Emit.CustomAttributeBuilder[],System.String)` + +### Category +Core + + diff --git a/Documentation/compatibility/binaryformatter-can-fail-to-find-type-from-loadfrom-context.md b/Documentation/compatibility/binaryformatter-can-fail-to-find-type-from-loadfrom-context.md new file mode 100644 index 000000000..01042b128 --- /dev/null +++ b/Documentation/compatibility/binaryformatter-can-fail-to-find-type-from-loadfrom-context.md @@ -0,0 +1,57 @@ +## BinaryFormatter can fail to find type from LoadFrom context + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description +As of .NET Framework 4.5, a number of +changes may cause differences in deserialization when using + +to deserialize types that had been loaded in the LoadFrom context. These changes +are due to the new ways +now loads a type which causes different behavior when a + attempts to +deserialize to that type later on. The default serialization binder does not +automatically search the LoadFrom context, although it may have worked in some +circumstances based on the old behavior of XmlSerializer. Due to the changes, +when a type is being loaded from an assembly loaded in a different context, a + may be thrown. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +If this exception is seen, the `Binder` property of the can be set to a custom binder that will find the correct type. + +```csharp +var formatter = new BinaryFormatter { Binder = new TypeFinderBinder() } +``` + +And then the custom binder: +```csharp +public class TypeFinderBinder : SerializationBinder +{ + private static readonly string s_assemblyName = Assembly.GetExecutingAssembly().FullName; + + public override Type BindToType(string assemblyName, string typeName) + { + return Type.GetType(String.Format(CultureInfo.InvariantCulture, "{0}, {1}", typeName, s_assemblyName)); + } +} +``` + +### Affected APIs +* `T:System.Runtime.Serialization.Formatters.Binary.BinaryFormatter` +* `M:System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(System.IO.Stream)` +* `M:System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(System.IO.Stream,System.Runtime.Remoting.Messaging.HeaderHandler)` + +### Category +Serialization + + diff --git a/Documentation/compatibility/binding-a-wpf-selector-property-(such-as-'selecteditem')-to-a-static-property-does-not-work.md b/Documentation/compatibility/binding-a-wpf-selector-property-(such-as-'selecteditem')-to-a-static-property-does-not-work.md new file mode 100644 index 000000000..6168776e3 --- /dev/null +++ b/Documentation/compatibility/binding-a-wpf-selector-property-(such-as-'selecteditem')-to-a-static-property-does-not-work.md @@ -0,0 +1,37 @@ +## Binding a WPF selector property (such as 'SelectedItem') to a static property does not work + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.5 + +### Source Analyzer Status +Planned + +### Change Description +In the .NET Framework 4.5, WPF Selector properties (such as 'SelectedItem' on or ) that are data-bound to static properties do not properly update when their bound property is updated. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This behavior was reverted in a servicing update for the .NET Framework 4.5. To fix this issue, update the .NET Framework 4.5, or upgrade to .NET Framework 4.5.1 or later. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + +[More information](https://social.msdn.microsoft.com/Forums/vstudio/56ff3199-5abc-454e-87f7-bafff43e7422/net-45-critical-selecteditem-not-setting-binding-item?forum=wpf) + + + + diff --git a/Documentation/compatibility/blockingcollection_trytakefromany-does-not-throw-anymore.md b/Documentation/compatibility/blockingcollection_trytakefromany-does-not-throw-anymore.md new file mode 100644 index 000000000..4b4bf9acb --- /dev/null +++ b/Documentation/compatibility/blockingcollection_trytakefromany-does-not-throw-anymore.md @@ -0,0 +1,38 @@ +## BlockingCollection<T>.TryTakeFromAny does not throw anymore + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +If one of the input collections is marked completed, +no longer returns -1 and + +no longer throws an exception. This change makes it possible to work with +collections when one of the collections is either empty or completed, but the +other collection still has items that can be retrieved. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +If TryTakeFromAny returning -1 or TakeFromAny throwing were used for control-flow purposes in cases of a blocking collection being completed, such code should now be changed to use `.Any(b => b.IsCompleted)` to detect that condition. + +### Affected APIs +* ``M:System.Collections.Concurrent.BlockingCollection`1.TakeFromAny(System.Collections.Concurrent.BlockingCollection{`0}[],`0@)`` +* ``M:System.Collections.Concurrent.BlockingCollection`1.TakeFromAny(System.Collections.Concurrent.BlockingCollection{`0}[],`0@,System.Threading.CancellationToken)`` +* ``M:System.Collections.Concurrent.BlockingCollection`1.TryTakeFromAny(System.Collections.Concurrent.BlockingCollection{`0}[],`0@)`` +* ``M:System.Collections.Concurrent.BlockingCollection`1.TryTakeFromAny(System.Collections.Concurrent.BlockingCollection{`0}[],`0@,System.Int32)`` +* ``M:System.Collections.Concurrent.BlockingCollection`1.TryTakeFromAny(System.Collections.Concurrent.BlockingCollection{`0}[],`0@,System.TimeSpan)`` +* ``M:System.Collections.Concurrent.BlockingCollection`1.TryTakeFromAny(System.Collections.Concurrent.BlockingCollection{`0}[],`0@,System.TimeSpan)`` + +### Category +Core + + diff --git a/Documentation/compatibility/building-an-entity-framework-edmx-with-visual-studio-2013-can-fail-with-error-msb4062-if-using-the-entitydeploysplit-or-entityclean-tasks.md b/Documentation/compatibility/building-an-entity-framework-edmx-with-visual-studio-2013-can-fail-with-error-msb4062-if-using-the-entitydeploysplit-or-entityclean-tasks.md new file mode 100644 index 000000000..3685a3426 --- /dev/null +++ b/Documentation/compatibility/building-an-entity-framework-edmx-with-visual-studio-2013-can-fail-with-error-msb4062-if-using-the-entitydeploysplit-or-entityclean-tasks.md @@ -0,0 +1,38 @@ +## Building an Entity Framework edmx with Visual Studio 2013 can fail with error MSB4062 if using the EntityDeploySplit or EntityClean tasks + +### Scope +Major + +### Version Introduced +4.5.1 + +### Version Reverted +4.6 + +### Source Analyzer Status +Available + +### Change Description +MSBuild 12.0 tools (included in Visual Studio 2013) changed MSBuild file +locations, causing older Entity Framework targets files to be invalid. The +result is that `EntityDeploySplit` and `EntityClean` tasks fail because they are +unable to find `Microsoft.Data.Entity.Build.Tasks.dll`. Note that this break is +because of a toolset (MSBuild/VS) change, not because of a .NET Framework +change. It will only occur when upgrading developer tools, not when merely +upgrading the .NET Framework. + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action +Entity Framework targets files are fixed to work with the new MSBuild layout beginning in the .NET Framework 4.6. Upgrading to that version of the Framework will fix this issue. Alternatively, [this workaround](https://stackoverflow.com/a/24249247/131944) can be used to patch the targets files directly. + +### Affected APIs +* Not detectable via API analysis + +### Category +Entity Framework + +[More information](https://stackoverflow.com/questions/20400054/entitydeploysplit-error-microsoft-data-entity-build-tasks-dll-missing/24249247#24249247) + + diff --git a/Documentation/compatibility/calling-attribute_getcustomattributes-on-an-indexer-property-no-longer-throws-ambiguousmatchexception.md b/Documentation/compatibility/calling-attribute_getcustomattributes-on-an-indexer-property-no-longer-throws-ambiguousmatchexception.md new file mode 100644 index 000000000..8011eadc7 --- /dev/null +++ b/Documentation/compatibility/calling-attribute_getcustomattributes-on-an-indexer-property-no-longer-throws-ambiguousmatchexception.md @@ -0,0 +1,46 @@ +## Calling Attribute.GetCustomAttributes on an indexer property no longer throws AmbiguousMatchException if the ambiguity can be resolved by index's type + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +Available + +### Change Description +Prior to the .NET Framework 4.6, calling `GetCustomAttribute(s)` on an indexer +property which differed from another property only by the type of the index +would result in an +. Beginning +in the .NET Framework 4.6, the property's attributes will be correctly returned. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Be aware that GetCustomAttribute(s) will work more frequently now. If an app was previously relying on the , reflection should now be used to explicitly look for multiple indexers, instead. + +### Affected APIs +* `M:System.Attribute.GetCustomAttribute(System.Reflection.MemberInfo,System.Type)` +* `M:System.Attribute.GetCustomAttribute(System.Reflection.MemberInfo,System.Type,System.Boolean)` +* `M:System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo)` +* `M:System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo,System.Boolean)` +* `M:System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo,System.Type)` +* `M:System.Attribute.GetCustomAttributes(System.Reflection.MemberInfo,System.Type,System.Boolean)` +* `M:System.Reflection.CustomAttributeExtensions.GetCustomAttribute(System.Reflection.MemberInfo,System.Type)` +* `M:System.Reflection.CustomAttributeExtensions.GetCustomAttribute(System.Reflection.MemberInfo,System.Type,System.Boolean)` +* `M:System.Reflection.CustomAttributeExtensions.GetCustomAttribute``1(System.Reflection.MemberInfo)` +* `M:System.Reflection.CustomAttributeExtensions.GetCustomAttribute``1(System.Reflection.MemberInfo,System.Boolean)` +* `M:System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.MemberInfo)` +* `M:System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.MemberInfo,System.Boolean)` +* `M:System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.MemberInfo,System.Type)` +* `M:System.Reflection.CustomAttributeExtensions.GetCustomAttributes(System.Reflection.MemberInfo,System.Type,System.Boolean)` +* `M:System.Reflection.CustomAttributeExtensions.GetCustomAttributes``1(System.Reflection.MemberInfo)` +* `M:System.Reflection.CustomAttributeExtensions.GetCustomAttributes``1(System.Reflection.MemberInfo,System.Boolean)` + +### Category +Core + + diff --git a/Documentation/compatibility/calling-createdefaultauthorizationcontext-with-a-null-argument-has-changed.md b/Documentation/compatibility/calling-createdefaultauthorizationcontext-with-a-null-argument-has-changed.md new file mode 100644 index 000000000..f1fbc647d --- /dev/null +++ b/Documentation/compatibility/calling-createdefaultauthorizationcontext-with-a-null-argument-has-changed.md @@ -0,0 +1,34 @@ +## Calling CreateDefaultAuthorizationContext with a null argument has changed + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +Available + +### Change Description +The implementation of the +returned by a call to the + +with a null authorizationPolicies argument has changed its implementation in the +.NET Framework 4.6. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +In rare cases, WCF apps that use custom authentication may see behavioral differences. In such cases, the previous behavior can be restored in either of two ways: + +1. Recompile your app to target an earlier version of the .NET Framework than 4.6. For IIS-hosted services, use the <httpRuntime targetFramework="x.x" /> element to target an earlier version of the .NET Framework. +2. Add the following line to the `` section of your app.config file: `` + +### Affected APIs +* `M:System.IdentityModel.Policy.AuthorizationContext.CreateDefaultAuthorizationContext(System.Collections.Generic.IList{System.IdentityModel.Policy.IAuthorizationPolicy})` + +### Category +Windows Communication Foundation (WCF) + + diff --git a/Documentation/compatibility/calling-datagrid_commitedit-from-a-celleditending-handler-drops-focus.md b/Documentation/compatibility/calling-datagrid_commitedit-from-a-celleditending-handler-drops-focus.md new file mode 100644 index 000000000..38420e616 --- /dev/null +++ b/Documentation/compatibility/calling-datagrid_commitedit-from-a-celleditending-handler-drops-focus.md @@ -0,0 +1,38 @@ +## Calling DataGrid.CommitEdit from a CellEditEnding handler drops focus + +### Scope +Edge + +### Version Introduced +4.5 + +### Version Reverted +4.5.2 + +### Source Analyzer Status +Available + +### Change Description +Calling +from one of the 's + +event handlers causes the +to lose focus. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This bug has been fixed in the .NET Framework 4.5.2, so it can be avoided by +upgrading the .NET Framework. Alternatively, it can be avoided by explicitly +re-selecting the +after calling . + +### Affected APIs +* `M:System.Windows.Controls.DataGrid.CommitEdit` +* `M:System.Windows.Controls.DataGrid.CommitEdit(System.Windows.Controls.DataGridEditingUnit,System.Boolean)` + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/calling-items_refresh-on-a-wpf-listbox-or-listview-or-datagrid-with-items-selected-can-cause-duplicate-items-to-appear-in-the-element.md b/Documentation/compatibility/calling-items_refresh-on-a-wpf-listbox-or-listview-or-datagrid-with-items-selected-can-cause-duplicate-items-to-appear-in-the-element.md new file mode 100644 index 000000000..43fa4cc73 --- /dev/null +++ b/Documentation/compatibility/calling-items_refresh-on-a-wpf-listbox-or-listview-or-datagrid-with-items-selected-can-cause-duplicate-items-to-appear-in-the-element.md @@ -0,0 +1,41 @@ +## Calling Items.Refresh on a WPF ListBox, ListView, or DataGrid with items selected can cause duplicate items to appear in the element + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.6 + +### Source Analyzer Status +Available + +### Change Description +In the .NET Framework 4.5, calling ListBox.Items.Refresh from code while items +are selected in a +can cause the selected items to be duplicated in the list. A similar issue +occurs with and +. This is fixed in +the .NET Framework 4.6. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This issue may be worked around by programatically unselecting items before + is called +and then re-selecting them after the call is completed. Alternatively, this +issue has been fixed in the .NET Framework 4.6 and may be addressed by upgrading +to that version of the .NET Framework. + +### Affected APIs +* `M:System.Windows.Data.CollectionView.Refresh` + +### Category +Windows Presentation Foundation (WPF) + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/873075/on-net-4-5-the-selected-items-in-a-wpf-listbox-listview-control-are-incorrect-when-items-refresh-is-called-from-code-behind) + + diff --git a/Documentation/compatibility/calls-to-claimsidentity-constructors.md b/Documentation/compatibility/calls-to-claimsidentity-constructors.md new file mode 100644 index 000000000..eaa395d3f --- /dev/null +++ b/Documentation/compatibility/calls-to-claimsidentity-constructors.md @@ -0,0 +1,63 @@ +## Calls to ClaimsIdentity constructors + +### Scope +Edge + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Investigating + +### Change Description +Starting with the .NET Framework 4.6.2, there is a change in how +constructors with an +parameter set the +property. If the +argument is a +object, and the +property of that +object is not `null`, the +property is attached by using the +method. In the Framework 4.6.1 and earlier versions, the + +property is attached as an existing reference. + +Because of this change, starting with the .NET Framework 4.6.2, the + property +of the new +object is not equal to the +property of the constructor's +argument. In the .NET Framework 4.6.1 and earlier versions, it is equal. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +If this behavior is undesirable, you can restore the previous behavior by setting +the `Switch.System.Security.ClaimsIdentity.SetActorAsReferenceWhenCopyingClaimsIdentity` +switch in your application configuration file to `true`. This requires that you +add the following to the `` section of your web.config file: + + ```xml + + + + + + ``` + +### Affected APIs +- `M:System.Security.Claims.ClaimsIdentity.#ctor(System.Security.Principal.IIdentity)` +- `M:System.Security.Claims.ClaimsIdentity.#ctor(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable{System.Security.Claims.Claim})` +- `M:System.Security.Claims.ClaimsIdentity.#ctor(System.Security.Principal.IIdentity,System.Collections.Generic.IEnumerable{System.Security.Claims.Claim},System.String,System.String,System.String)` + +### Category +Core + + + + diff --git a/Documentation/compatibility/certificate-eku-oid-validation.md b/Documentation/compatibility/certificate-eku-oid-validation.md new file mode 100644 index 000000000..7cd1f0b68 --- /dev/null +++ b/Documentation/compatibility/certificate-eku-oid-validation.md @@ -0,0 +1,48 @@ +## Certificate EKU OID validation + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +NotPlanned + +### Change Description + +Starting with .NET Framework 4.6, the or classes perform enhanced key use (EKU) object identifier (OID) validation. An enhanced key usage (EKU) extension is a collection of object identifiers (OIDs) that indicate the applications that use the key. EKU OID validation uses remote certificate callbacks to ensure that the remote certificate has the correct OIDs for the intended purpose. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +If this change is undesirable, you can disable certificate EKU OID validation by adding the following switch to the [`\` element](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) in the [`\ section](~/docs/framework/configure-apps/file-schema/runtime/runtime-element.md) of your app configuration file: + +```xml + + + +``` +> [!IMPORTANT] +> This setting is provided for backward compatibility only. Its use is otherwise not recommended. + + +### Affected APIs +* `T:System.Net.Security.SslStream` +* `T:System.Net.ServicePointManager` +* `T:System.Net.Http.HttpClient` +* `T:System.Net.Mail.SmtpClient` +* `T:System.Net.HttpWebRequest` +* `T:System.Net.FtpWebRequest` + +### Category +Networking + + + + diff --git a/Documentation/compatibility/change-in-behavior-for-task_waitall-methods-with-time-out-arguments.md b/Documentation/compatibility/change-in-behavior-for-task_waitall-methods-with-time-out-arguments.md new file mode 100644 index 000000000..af77b8fd1 --- /dev/null +++ b/Documentation/compatibility/change-in-behavior-for-task_waitall-methods-with-time-out-arguments.md @@ -0,0 +1,41 @@ +## Change in behavior for Task.WaitAll methods with time-out arguments + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + behavior was made more consistent in .NET Framework 4.5. + +In the .NET Framework 4, these methods behaved inconsistently. When the time-out +expired, if one or more tasks were completed or canceled before the method call, +the method threw an +exception. When the time-out expired, if no tasks were completed or canceled +before the method call, but one or more tasks entered these states after the +method call, the method returned false.

In the .NET Framework 4.5, +these method overloads now return false if any tasks are still running when the +time-out interval expired, and they throw an + exception only if an input +task was cancelled (regardless of whether it was before or after the method +call) and no other tasks are still running. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +If an was being caught as a means of detecting a task that was cancelled prior to the call being invoked, that code should instead do the same detection via the property (for example: .Any(t => t.IsCanceled)) since .NET Framework 4.6 will only throw in that case if all awaited tasks are completed prior to the timeout. + +### Affected APIs +* `M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[],System.Int32)` +* `M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[],System.Int32,System.Threading.CancellationToken)` +* `M:System.Threading.Tasks.Task.WaitAll(System.Threading.Tasks.Task[],System.TimeSpan)` + +### Category +Core + + diff --git a/Documentation/compatibility/change-in-behavior-in-data-definition-language-(ddl)-apis.md b/Documentation/compatibility/change-in-behavior-in-data-definition-language-(ddl)-apis.md new file mode 100644 index 000000000..dce58a6cd --- /dev/null +++ b/Documentation/compatibility/change-in-behavior-in-data-definition-language-(ddl)-apis.md @@ -0,0 +1,33 @@ +## Change in behavior in Data Definition Language (DDL) APIs + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description +The behavior of DDL APIs when AttachDBFilename is specified has changed as follows: +* Connection strings need not specify an Initial Catalog value. Previously, both AttachDBFilename and Initial Catalog were required. +* If both AttachDBFilename and Initial Catalog are specified and the given MDF file exists, the method returns `true`. Previously, it returned `false`. +* If both AttachDBFilename and Initial Catalog are specified and the given MDF file exists, calling the method deletes the files. +* If is called when the connection string specifies an AttachDBFilename value with an MDF that doesn't exist and an Initial Catalog that doesn't exist, the method throws an exception. Previously, it threw a exception. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +These changes make it easier to build tools and applications that use the DDL APIs. These changes can affect application compatibility in the following scenarios: +- The user writes code that executes a `DROP DATABASE` command directly instead of calling if returns `true`. This breaks existing code If the database is not attached but the MDF file exists. +- The user writes code that expects the method to throw a rather than an when the Initial Catalog and MDF file don't exist. + +### Affected APIs +* Not detectable via API analysis + +### Category +Entity Framework + + diff --git a/Documentation/compatibility/change-in-path-separator-character-in-zip-files.md b/Documentation/compatibility/change-in-path-separator-character-in-zip-files.md new file mode 100644 index 000000000..b810b9caf --- /dev/null +++ b/Documentation/compatibility/change-in-path-separator-character-in-zip-files.md @@ -0,0 +1,51 @@ +## Change in path separator character in FullName property of ZipArchiveEntry objects + +### Scope +Edge + +### Version Introduced +4.6.1 + +### Source Analyzer Status +Planned + +### Change Description +For apps that target the .NET Framework 4.6.1 and later versions, the path separator character has changed from a backslash ("\\") to a forward slash ("/") in the property of objects created by overloads of the method. The change brings the .NET implementation into conformity with section 4.4.17.1 of the [.ZIP File Format Specification](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) and allows .ZIP archives to be decompressed on non-Windows systems.
+ +Decompressing a zip file created by an app that targets a previous version of the .NET Framework on non-Windows operating systems such as the Macintosh fails to preserve the directory structure. For example, on the Macintosh, it creates a set of files whose filename concatenates the directory path, along with any backslash ("\\") characters, and the filename. As a result, the directory structure of decompressed files is not preserved. + + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +The impact of this change on .ZIP files that are decompressed on the Windows operating system by APIs in the .NET Framework namespace should be minimal, since these APIs can seamlessly handle either a forward slash ("/") or a backslash ("\\") as the path separator character.
+ +If this change is undesirable, you can opt out of it by adding a configuration setting to the [\](~/docs/framework/configure-apps/file-schema/runtime/runtime-element.md) section of your application configuration file. The following example shows both the `` section and the `Switch.System.IO.Compression.ZipFile.UseBackslash` opt-out switch: + +```xml + + + +``` + +In addition, apps that target previous versions of the .NET Framework but are running on the .NET Framework 4.6.1 and later versions can opt in to this behavior by adding a configuration setting to the [\](~/docs/framework/configure-apps/file-schema/runtime/runtime-element.md) section of the application configuration file. The following shows both the `` section and the `Switch.System.IO.Compression.ZipFile.UseBackslash` opt-in switch. + +```xml + + + +``` + +### Affected APIs +* `M:System.IO.Compression.ZipFile.CreateFromDirectory(System.String,System.String)` +* `M:System.IO.Compression.ZipFile.CreateFromDirectory(System.String,System.String,System.IO.Compression.CompressionLevel,System.Boolean)` +* `M:System.IO.Compression.ZipFile.CreateFromDirectory(System.String,System.String,System.IO.Compression.CompressionLevel,System.Boolean,System.Text.Encoding)` + +### Category +Core + + + + diff --git a/Documentation/compatibility/changes-in-path-normalization.md b/Documentation/compatibility/changes-in-path-normalization.md new file mode 100644 index 000000000..af98239fc --- /dev/null +++ b/Documentation/compatibility/changes-in-path-normalization.md @@ -0,0 +1,68 @@ +## Changes in path normalization + +### Scope +Minor + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Investigating + +### Change Description +Starting with apps that target the .NET Framework 4.6.2, the way in which the +runtime normalizes paths has changed. + +Normalizing a path involves modifying the string that identifies a path or file +so that it conforms to a valid path on the target operating system. +Normalization typically involves: + +- Canonicalizing component and directory separators. +- Applying the current directory to a relative path. +- Evaluating the relative directory (.) or the parent directory (..) in a path. +- Trimming specified characters. + +Starting with apps that target the .NET Framework 4.6.2, the following changes +in path normalization are enabled by default: + +- The runtime defers to the operating system's [GetFullPathName](https://docs.microsoft.com/windows/desktop/api/fileapi/nf-fileapi-getfullpathnamew) function to normalize paths. +- Normalization no longer involves trimming the end of directory segments (such as a space at the end of a directory name). +- Support for device path syntax in full trust, including `\\.\` and, for file I/O APIs in mscorlib.dll, `\\?\`. +- The runtime does not validate device syntax paths. +- The use of device syntax to access alternate data streams is supported. + +These changes improve performance while allowing methods to access previously inaccessible paths. +Apps that target the .NET Framework 4.6.1 and earlier versions but are running under the .NET Framework 4.6.2 or later are unaffected by this change. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +Apps that target the .NET Framework 4.6.2 or later can opt out of this change and use legacy normalization by adding the following to the `` section of the application configuration file: + + ```xml + + + + ``` + +Apps that target the .NET Framework 4.6.1 or earlier but are running on the .NET Framework 4.6.2 or later can enable the changes to path normalization by adding the following line to the `` section of the application .configuration file: + + ```xml + + + + ``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + + + diff --git a/Documentation/compatibility/changing-the-isenabled-property-of-the-parent-of-a-textblock-control-affects-any-child-controls.md b/Documentation/compatibility/changing-the-isenabled-property-of-the-parent-of-a-textblock-control-affects-any-child-controls.md new file mode 100644 index 000000000..a60ddd8f0 --- /dev/null +++ b/Documentation/compatibility/changing-the-isenabled-property-of-the-parent-of-a-textblock-control-affects-any-child-controls.md @@ -0,0 +1,42 @@ +## Changing the IsEnabled property of the parent of a TextBlock control affects any child controls + +### Scope +Minor + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Investigating + +### Change Description +Starting with the .NET Framework 4.6.2, changing the + property of the +parent of a +control affects any child controls (such as hyperlinks and buttons) of the + control. + +In the .NET Framework 4.6.1 and earlier versions, controls inside a + did not always +reflect the state of the + property of the + parent. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +None. This change conforms to the expected behavior for controls inside a control. + +### Affected APIs +- `P:System.Windows.UIElement.IsEnabled` + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/clickonce-supports-sha-256-on-4_0-targeted-apps.md b/Documentation/compatibility/clickonce-supports-sha-256-on-4_0-targeted-apps.md new file mode 100644 index 000000000..04d42ef7b --- /dev/null +++ b/Documentation/compatibility/clickonce-supports-sha-256-on-4_0-targeted-apps.md @@ -0,0 +1,35 @@ +## ClickOnce supports SHA-256 on 4.0-targeted apps + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +Planned + +### Change Description +Previously, a ClickOnce app with a certificate signed with SHA-256 would require +.NET Framework 4.5 or later to be present, even if the app targeted 4.0. Now, .NET Framework 4.0-targeted +ClickOnce apps can run on .NET Framework 4.0, even if signed with SHA-256. + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action +This change removes that dependency and allows SHA-256 certificates to be used +to sign ClickOnce apps that target .NET Framework 4 and earlier versions. + +### Affected APIs +* Not detectable via API analysis + +### Category +ClickOnce + + + + diff --git a/Documentation/compatibility/clr_critical_section_spin_wait_removal.md b/Documentation/compatibility/clr_critical_section_spin_wait_removal.md new file mode 100644 index 000000000..5eb26b507 --- /dev/null +++ b/Documentation/compatibility/clr_critical_section_spin_wait_removal.md @@ -0,0 +1,42 @@ +## CLR critical section spin-wait removal + +### Scope + +Transparent + +### Version Introduced +4.8 + +### Source Analyzer Status + +NotPlanned + +### Change Description + +By default, when a thread cannot acquire a critical section, it spin-waits for a while before blocking the thread unless it can acquire the critical section. This behavior can lead to poor scalability. + +Starting with applications running under .NET Framework 4.8, it is possible to disable the spin-waiting. This is an opt-in behavior; spin-waiting when a critical section cannot be acquired is the default behavior on all versions of the .NET Framework. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +You can disable the default behavior of spin-waiting when a critical section cannot be acquired, in one of the following ways: + +By setting the following environment variable before starting the process: + `COMPlus_Crst_DisableSpinWait=1` + +By including the runtime configuration option in .exe.config. Example: + ```xml + + + + + + + ``` + +### Affected APIs + +None diff --git a/Documentation/compatibility/code-contracts-and-string-isnullorempty-compiler-warning.md b/Documentation/compatibility/code-contracts-and-string-isnullorempty-compiler-warning.md new file mode 100644 index 000000000..e80517506 --- /dev/null +++ b/Documentation/compatibility/code-contracts-and-string-isnullorempty-compiler-warning.md @@ -0,0 +1,29 @@ +## Contract.Invariant or Contract.Requires\ do not consider String.IsNullOrEmpty to be pure + +### Scope +Minor + +### Version Introduced +4.6.1 + +### Source Analyzer Status +Investigating + +### Change Description +For apps that target the .NET Framework 4.6.1, if the invariant contract for or the precondition contract for calls the method, the rewriter emits compiler warning CC1036: "Detected call to method 'System.String.IsNullOrWhteSpace(System.String)' without [Pure] in method." This is a compiler warning rather than a compiler error. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This behavior was addressed in [GitHub Issue #339](https://github.com/Microsoft/CodeContracts/issues/339). To eliminate this warning, you can download and compile an updated version of the source code for the Code Contracts tool from [GitHub](https://github.com/Microsoft/CodeContracts/blob/master/README.md). Download information is found at the bottom of the page. + +### Affected APIs +- M:System.Diagnostics.Contracts.Contract.Invariant(System.Boolean) +- M:System.Diagnostics.Contracts.Contract.Requires(System.Boolean) + +### Category +Tools + + diff --git a/Documentation/compatibility/coerceisselectionboxhighlighted.md b/Documentation/compatibility/coerceisselectionboxhighlighted.md new file mode 100644 index 000000000..b42395517 --- /dev/null +++ b/Documentation/compatibility/coerceisselectionboxhighlighted.md @@ -0,0 +1,36 @@ +## CoerceIsSelectionBoxHighlighted + +### Scope +Minor + +### Version Introduced +4.6 + +### Version Reverted +4.6.2 + +### Source Analyzer Status +Planned + +### Change Description +Certain sequences of actions involving a +and its data source can result in a . + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +If possible, upgrade to .NET Framework 4.6.2. + +### Affected APIs +* `P:System.Windows.Controls.ComboBox.IsSelectionBoxHighlighted` + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/compiler-support-for-type-forwarding-when-multi-targeting-mscorlib.md b/Documentation/compatibility/compiler-support-for-type-forwarding-when-multi-targeting-mscorlib.md new file mode 100644 index 000000000..80de41009 --- /dev/null +++ b/Documentation/compatibility/compiler-support-for-type-forwarding-when-multi-targeting-mscorlib.md @@ -0,0 +1,31 @@ +## Compiler support for type forwarding when multi-targeting mscorlib + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Not planned + +### Change Description +A new CodeDOM feature allows a compiler to compile against the targeted version +of mscorlib.dll instead of the .NET Framework 4.5 version of mscorlib.dll. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action This change prevents compiler warnings (and compilation +failure in cases where warnings are treated as errors) when CodeDOM finds two +definitions for types that have been type-forwarded. This change may have +unintended side effects only if different versions of reference assemblies are +mixed in a single location. + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + diff --git a/Documentation/compatibility/concurrentqueue_trypeek-can-return-an-erroneous-null-via-its-out-parameter.md b/Documentation/compatibility/concurrentqueue_trypeek-can-return-an-erroneous-null-via-its-out-parameter.md new file mode 100644 index 000000000..3bdfb05b2 --- /dev/null +++ b/Documentation/compatibility/concurrentqueue_trypeek-can-return-an-erroneous-null-via-its-out-parameter.md @@ -0,0 +1,35 @@ +## ConcurrentQueue<T>.TryPeek can return an erroneous null via its out parameter + +### Scope +Major + +### Version Introduced +4.5 + +### Version Reverted +4.5.1 + +### Source Analyzer Status +Available + +### Change Description +In some multi-threaded scenarios, + +can return true, but populate the out parameter with a null value (instead of +the correct, peeked value). + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This issue is fixed in the .NET Framework 4.5.1. Upgrading to that Framework will solve the issue. + +### Affected APIs +* ``M:System.Collections.Concurrent.ConcurrentQueue`1.TryPeek(`0@)`` + +### Category +Core + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/762273/bug-in-concurrentqueue-in-net-4-5-trypeek-returns-true-but-no-real-object-returned) + + diff --git a/Documentation/compatibility/connection-pool-blocking-period-for-azure-sql-databases-is-removed.md b/Documentation/compatibility/connection-pool-blocking-period-for-azure-sql-databases-is-removed.md new file mode 100644 index 000000000..01a79f12b --- /dev/null +++ b/Documentation/compatibility/connection-pool-blocking-period-for-azure-sql-databases-is-removed.md @@ -0,0 +1,67 @@ +## Connection pool blocking period for Azure SQL databases is removed + +### Scope +Minor + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Investigating + +### Change Description +Starting with the .NET Framework 4.6.2, for connection open requests to known +Azure SQL databases (\*.database.windows.net, \*.database.chinacloudapi.cn, +\*.database.usgovcloudapi.net, \*.database.cloudapi.de), the connection pool +blocking period is removed, and connection open errors are not cached. Attempts +to retry connection open requests will occur almost immediately after transient +connection errors. This change allows the connection open attempt to be retried +immediately for Azure SQL databases, thereby improving the performance of cloud- +enabled apps. For all other connection attempts, the connection pool blocking +period continues to be enforced.

+ +In the .NET Framework 4.6.1 and earlier versions, when an app encounters a +transient connection failure when connecting to a database, the connection +attempt cannot be retried quickly, because the connection pool caches the error +and re-throws it for 5 seconds to 1 minute. For more information, see +[SQL Server Connection Pooling (ADO.NET)](~/docs/framework/data/adonet/sql-server-connection-pooling.md). +This behavior is problematic for connections to Azure SQL databases, which often +fail with transient errors that are typically recovered from within a few +seconds. The connection pool blocking feature means that the app cannot connect +to the database for an extensive period, even though the database is available +and the app needs to render within a few seconds. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If this behavior is undesirable, the connection pool blocking period can be +configured by setting the +property introduced in the .NET Framework 4.6.2. The value of the property is a +member of the + enumeration +that can take either of three values: + +- +- +- + +The previous behavior can be restored by setting the + +property to . + +### Affected APIs +- `M:System.Data.Common.DbConnection.OpenAsync` +- `M:System.Data.SqlClient.SqlConnection.Open` +- `M:System.Data.SqlClient.SqlConnection.OpenAsync(System.Threading.CancellationToken)` + +### Category +Data + + + + diff --git a/Documentation/compatibility/contentdisposition-datetimes-returns-slightly-different-string.md b/Documentation/compatibility/contentdisposition-datetimes-returns-slightly-different-string.md new file mode 100644 index 000000000..109cec6d2 --- /dev/null +++ b/Documentation/compatibility/contentdisposition-datetimes-returns-slightly-different-string.md @@ -0,0 +1,44 @@ +## ContentDisposition DateTimes returns slightly different string + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +Available + +### Change Description + +String representations of +'s have been +updated, beginning in 4.6, to always represent the hour component of a + with two digits. This is to comply +with [RFC822](https://www.ietf.org/rfc/rfc0822.txt) and +[RFC2822](https://www.ietf.org/rfc/rfc2822.txt). This causes + +to return a slightly different string in 4.6 in scenarios where one of the +disposition's time elements was before 10:00 AM. Note that +ContentDispositions are sometimes serialized via converting them to strings, +so any +operations, serialization, or GetHashCode calls should be reviewed. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Do not expect that string representations of ContentDispositions from different +.NET Framework versions will correctly compare to one another. Convert the +strings back to ContentDispositions, if possible, before conducting a +comparison. + +### Affected APIs +* `M:System.Net.Mime.ContentDisposition.ToString` +* `M:System.Net.Mime.ContentDisposition.GetHashCode` + +### Category +Networking + + diff --git a/Documentation/compatibility/cor_prf_gc_root_handles-are-not-being-enumerated-by-profilers.md b/Documentation/compatibility/cor_prf_gc_root_handles-are-not-being-enumerated-by-profilers.md new file mode 100644 index 000000000..bd5b29339 --- /dev/null +++ b/Documentation/compatibility/cor_prf_gc_root_handles-are-not-being-enumerated-by-profilers.md @@ -0,0 +1,36 @@ +## COR_PRF_GC_ROOT_HANDLEs are not being enumerated by profilers + +### Scope +Minor + +### Version Introduced +4.5.1 + +### Version Reverted +4.6 + +### Source Analyzer Status +Not planned + +### Change Description + +In the .NET Framework v4.5.1, the profiling API `RootReferences2()` is incorrectly never returning `COR_PRF_GC_ROOT_HANDLE` (they are returned as `COR_PRF_GC_ROOT_OTHER` instead). This issue is fixed beginning in the .NET Framework 4.6. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This issue has been fixed in the .NET Framework 4.6 and may be addressed by upgrading to that version of the .NET Framework. + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + + + diff --git a/Documentation/compatibility/cryptographicexception-not-thrown-in-fips-mode.md b/Documentation/compatibility/cryptographicexception-not-thrown-in-fips-mode.md new file mode 100644 index 000000000..0bfc8f926 --- /dev/null +++ b/Documentation/compatibility/cryptographicexception-not-thrown-in-fips-mode.md @@ -0,0 +1,56 @@ +## Managed cryptography classes do not throw a CryptographyException in FIPS mode + +### Scope +Edge + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description + +In .NET Framework 4.7.2 and earlier versions, managed cryptographic provider classes such as throw a when the system cryptographic libraries are configured in FIPS mode. These exceptions are thrown because the managed versions have not undergone FIPS (Federal Information Processing Standards) 140-2 certification, as well as to block cryptographic algorithms that were not considered to be approved based on the FIPS rules. Because few developers have their development machines in FIPS mode, these exceptions are frequently thrown only on production systems. + +Applications that target .NET Framework 4.8 and later versions automatically switch to the newer, relaxed policy, so that a is no longer thrown by default in such cases. Instead, the managed cryptography classes redirect cryptographic operations to a system cryptography library. This policy change effectively removes a potentially confusing difference between developer environments and the production environments and makes native components and managed components operate under the same cryptographic policy. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +If this behavior is undesirable, you can opt out of it and restore the previous behavior so that a is thrown in FIPS mode by adding the following [AppContextSwitchOverrides](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) configuration setting to the [\](~/docs/framework/configure-apps/file-schema/runtime/runtime-element.md) section of your application configuration file: + +```xml + + + +``` + +If your application targets .NET Framework 4.7.2 or earlier, you can also opt in to this change by adding the following [AppContextSwitchOverrides](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) configuration setting to the [\](~/docs/framework/configure-apps/file-schema/runtime/runtime-element.md) section of your application configuration file: + +```xml + + + +``` + +### Affected APIs + +* `T:System.Security.Cryptography.AesManaged` +* `T:System.Security.Cryptography.MD5Cng` +* `T:System.Security.Cryptography.MD5CryptoServiceProvider` +* `T:System.Security.Cryptography.RC2CryptoServiceProvider` +* `T:System.Security.Cryptography.RijndaelManaged` +* `T:System.Security.Cryptography.RIPEMD160Managed` +* `T:System.Security.Cryptography.SHA1Managed` +* `T:System.Security.Cryptography.SHA256Managed` + +### Category +Core + + diff --git a/Documentation/compatibility/cspparameters_parentwindowhandle-now-expects-hwnd-value.md b/Documentation/compatibility/cspparameters_parentwindowhandle-now-expects-hwnd-value.md new file mode 100644 index 000000000..b9bcb1880 --- /dev/null +++ b/Documentation/compatibility/cspparameters_parentwindowhandle-now-expects-hwnd-value.md @@ -0,0 +1,65 @@ +## CspParameters.ParentWindowHandle now expects HWND value + +### Scope +Minor + +### Version Introduced +4.7 + +### Source Analyzer Status +Investigating + +### Change Description + +The +value, introduced in .NET Framework 2.0, allows an application to register a +parent window handle value such that any UI required to access the key (such as +a PIN prompt or consent dialog) opens as a modal child to the specified window. + +Starting with apps that target the .NET Framework 4.7, a Windows Forms +application can set the +property with code like the following: + +```csharp +cspParameters.ParentWindowHandle = form.Handle; +``` + +In previous versions of the .NET Framework, the value was expected to be an +representing a location in memory where the +[HWND](https://docs.microsoft.com/windows/desktop/WinProg/windows-data-types#HWND) value resided. +Setting the property to form.Handle on Windows 7 and earlier versions had no +effect, but on Windows 8 and later versions, it results in a +": The parameter is incorrect." + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +Applications targeting .NET Framework 4.7 or higher wishing to register a parent window relationship are encouraged to use the simplified form: + +```csharp +cspParameters.ParentWindowHandle = form.Handle; +``` + +Users who had identified that the correct value to pass was the address of a memory location which held the value `form.Handle` can opt out of the +behavior change by setting the AppContext switch `Switch.System.Security.Cryptography.DoNotAddrOfCspParentWindowHandle` to `true`: + +1. By programmatically setting compat switches on the AppContext, as explained [here](https://devblogs.microsoft.com/dotnet/net-announcements-at-build-2015/#dotnet46). +2. By adding the following line to the `` section of the app.config file: + +```xml + + + +``` + +Conversely, users who wish to opt in to the new behavior on the .NET Framework 4.7 runtime when the application loads under older .NET Framework versions +can set the AppContext switch to `false`. + +### Affected APIs +* `P:System.Security.Cryptography.CspParameters.ParentWindowHandle` + +### Category +Security + + diff --git a/Documentation/compatibility/currentculture-flows-across-tasks.md b/Documentation/compatibility/currentculture-flows-across-tasks.md new file mode 100644 index 000000000..aaebc402c --- /dev/null +++ b/Documentation/compatibility/currentculture-flows-across-tasks.md @@ -0,0 +1,64 @@ +## CurrentCulture and CurrentUICulture flow across tasks + +### Scope +Minor + +### Version Introduced +4.6 + +### Version Reverted +4.6.2 + +### Source Analyzer Status +Planned + +### Change Description + +Beginning in the .NET Framework 4.6, + and + +are stored in the thread's +, which flows +across asynchronous operations. + +This means that changes to +or +will be reflected in tasks which are later run asynchronously. This is different +from the behavior of previous .NET Framework versions (which would reset + +and +in all asynchronous tasks). + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +Apps affected by this change may work around it by explicitly setting the desired or + +as the first operation in an async Task. Alternatively, the old behavior (of not +flowing /) +may be opted into by setting the following compatibility switch: + +```csharp +AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true); +``` + +This issue has been fixed by WPF in .NET Framework 4.6.2. It has also been fixed +in .NET Frameworks 4.6, 4.6.1 through [KB 3139549](https://support.microsoft.com/kb/3139549). +Applications targeting .NET Framework 4.6 or later will automatically get the right +behavior in WPF applications - +/) +would be preserved across Dispatcher operations. + +### Affected APIs +* `M:System.Globalization.CultureInfo.set_CurrentCulture(System.Globalization.CultureInfo)` +* `M:System.Threading.Thread.set_CurrentCulture(System.Globalization.CultureInfo)` +* `M:System.Globalization.CultureInfo.set_CurrentUICulture(System.Globalization.CultureInfo)` +* `M:System.Threading.Thread.set_CurrentUICulture(System.Globalization.CultureInfo)` + +### Category +Core + +[More information](https://docs.microsoft.com/dotnet/api/system.globalization.cultureinfo#Async) + + diff --git a/Documentation/compatibility/currentculture-not-preserved-across-wpf-dispatcher-operations.md b/Documentation/compatibility/currentculture-not-preserved-across-wpf-dispatcher-operations.md new file mode 100644 index 000000000..d3676f22e --- /dev/null +++ b/Documentation/compatibility/currentculture-not-preserved-across-wpf-dispatcher-operations.md @@ -0,0 +1,88 @@ +## CurrentCulture is not preserved across WPF Dispatcher operations + +### Scope +Minor + +### Version Introduced +4.6 + +### Version Reverted +4.6.2 + +### Source Analyzer Status +Planned + +### Change Description + +Beginning in the .NET Framework 4.6, changes to + or + +made within a +will be lost at the end of that dispatcher operation. Similarly, changes to + or + +made outside of a Dispatcher operation may not be reflected when that operation +executes. + +Practically speaking, this means that + and + +changes may not flow between WPF UI callbacks and other code in a WPF +application. + +This is due to a change in + that causes + and + to +be stored in the execution context beginning with apps targeting the .NET +Framework 4.6. WPF dispatcher operations store the execution context used to +begin the operation and restore the previous context when the operation is +completed. Because + and + +are now part of that context, changes to them within a dispatcher operation are +not persisted outside of the operation. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +Apps affected by this change may work around it by storing the desired + or + in +a field and checking in all Dispatcher operation bodies (including UI event +callback handlers) that the correct + and + +are set. Alternatively, because the ExecutionContext change underlying this WPF +change only affects apps targeting the .NET Framework 4.6 or newer, this break +can be avoided by targeting the .NET Framework 4.5.2. + +Apps that target .NET Framework 4.6 or later can also work around this by +setting the following compatibility switch: + + ```csharp + AppContext.SetSwitch("Switch.System.Globalization.NoAsyncCurrentCulture", true); + ``` + +This issue has been fixed by WPF in .NET Framework 4.6.2. It has also been fixed +in .NET Frameworks 4.6, 4.6.1 through [KB 3139549](https://support.microsoft.com/kb/3139549). +Applications targeting .NET Framework 4.6 or later will automatically +get the right behavior in WPF applications - +/) +would be preserved across Dispatcher operations. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/data-written-to-printsystemjobinfo-jobstream-must-be-in-xps-format.md b/Documentation/compatibility/data-written-to-printsystemjobinfo-jobstream-must-be-in-xps-format.md new file mode 100644 index 000000000..8d2f99528 --- /dev/null +++ b/Documentation/compatibility/data-written-to-printsystemjobinfo-jobstream-must-be-in-xps-format.md @@ -0,0 +1,39 @@ +## Data written to PrintSystemJobInfo.JobStream must be in XPS format + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +NotPlanned + +### Change Description +The property exposes the stream of a print job. The user can send raw data to the underlying operating system printing components by writing to this stream. + +Starting with the .NET Framework 4.5 on Windows 8 and later versions of the Windows operating system, data written to this stream must be in XPS format as a package stream. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +To output print content, you can do either of the following: + +- Use the class to output print content. This is the recommended alternative. + +- Ensure that the data sent to the stream returned by the property is in XPS format as a package stream. + +### Affected APIs +* `P:System.Printing.PrintSystemJobInfo.JobStream` + +### Category +Printing + + + + diff --git a/Documentation/compatibility/datagridcellspanel_bringintoview-throws-argumentoutofrangeexception.md b/Documentation/compatibility/datagridcellspanel_bringintoview-throws-argumentoutofrangeexception.md new file mode 100644 index 000000000..7ea6623f6 --- /dev/null +++ b/Documentation/compatibility/datagridcellspanel_bringintoview-throws-argumentoutofrangeexception.md @@ -0,0 +1,44 @@ +## DataGridCellsPanel.BringIndexIntoView throws ArgumentOutOfRangeException + +### Scope +Edge + +### Version Introduced +4.6.2 + +### Version Reverted +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description + + +will work asynchronously when column virtualization is enabled but the column +widths have not yet been determined. If columns are removed before the +asynchronous work happens, an + can occur. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Any one of the following: +1. Upgrade to .NET Framework 4.7. +2. Install the latest servicing patch for .NET Framework 4.6.2. +3. Avoid removing columns until the asynchronous response to has completed. + +### Affected APIs +- `M:System.Windows.Controls.DataGrid.ScrollIntoView(System.Object)` +- `M:System.Windows.Controls.DataGrid.ScrollIntoView(System.Object,System.Windows.Controls.DataGridColumn)` + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/dataobject_getdata-now-retrieves-data-as-utf-8.md b/Documentation/compatibility/dataobject_getdata-now-retrieves-data-as-utf-8.md new file mode 100644 index 000000000..a5a9be2a0 --- /dev/null +++ b/Documentation/compatibility/dataobject_getdata-now-retrieves-data-as-utf-8.md @@ -0,0 +1,50 @@ +## DataObject.GetData now retrieves data as UTF-8 + +### Scope +Edge + +### Version Introduced +4.5.2 + +### Source Analyzer Status +Available + +### Change Description + +For apps that target the .NET Framework 4 or that run on the .NET Framework +4.5.1 or earlier versions, `DataObject.GetData` retrieves HTML-formatted data as +an ASCII string. As a result, non-ASCII characters (characters whose ASCII codes +are greater than 0x7F) are represented by two random characters.

+ +For apps that target the .NET Framework 4.5 or later and run on the .NET +Framework 4.5.2, `DataObject.GetData` retrieves HTML-formatted data as UTF-8, +which represents characters greater than 0x7F correctly. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +If you implemented a workaround for the encoding problem with HTML-formatted +strings (for example, by explicitly encoding the HTML string retrieved from the +Clipboard by passing it to +) +and you're retargeting your app from version 4 to 4.5, that workaround should be +removed. + +If the old behavior is needed for some reason, the app can target the .NET Framework 4.0 to get that behavior. + +### Affected APIs +* `M:System.Windows.DataObject.GetData(System.String)` +* `M:System.Windows.DataObject.GetData(System.Type)` +* `M:System.Windows.DataObject.GetData(System.String,System.Boolean)` + +### Category +Windows Forms + + + + diff --git a/Documentation/compatibility/dbparameter_precision-and-dbparameter_scale-are-now-public-virtual-members.md b/Documentation/compatibility/dbparameter_precision-and-dbparameter_scale-are-now-public-virtual-members.md new file mode 100644 index 000000000..5f47e9114 --- /dev/null +++ b/Documentation/compatibility/dbparameter_precision-and-dbparameter_scale-are-now-public-virtual-members.md @@ -0,0 +1,37 @@ +## DbParameter.Precision and DbParameter.Scale are now public virtual members + +### Scope +Minor + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Available + +### Change Description + + and +are implemented as public virtual properties. They replace the corresponding +explicit interface implementations, + and +. + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action + +When re-building an ADO.NET database provider, these differences will require +the 'override' keyword to be applied to the Precision and Scale properties. This +is only needed when re-building the components; existing binaries will continue +to work. + +### Affected APIs +* `P:System.Data.Common.DbParameter.Precision` +* `P:System.Data.Common.DbParameter.Scale` + +### Category +ADO.NET + + diff --git a/Documentation/compatibility/deflatestream-uses-native-apis-for-decompression.md b/Documentation/compatibility/deflatestream-uses-native-apis-for-decompression.md new file mode 100644 index 000000000..66d69a168 --- /dev/null +++ b/Documentation/compatibility/deflatestream-uses-native-apis-for-decompression.md @@ -0,0 +1,51 @@ +## DeflateStream uses native APIs for decompression + +### Scope +Minor + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description + +Starting with the .NET Framework 4.7.2, the implementation of decompression in the `T:System.IO.Compression.DeflateStream` class has changed to use native Windows APIs by default. Typically, this results in a substantial performance improvement. All .NET applications targeting the .NET Framework version 4.7.2 or higher use the native implementation. + +This change might result in some differences in behavior, which include: + +- Exception messages may be different. However, the type of exception thrown remains the same. +- Some special situations, such as not having enough memory to complete an operation, may be handled differently. +- There are known differences for parsing gzip header (note: only `GZipStream` set for decompression is affected): + - Exceptions when parsing invalid headers may be thrown at different times. + - The native implementation enforces that values for some reserved flags inside the gzip header (i.e. [FLG](http://www.zlib.org/rfc-gzip.html#header-trailer)) are set according to the specification, which may cause it to throw an exception where previously invalid values were ignored. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +If decompression with native APIs has adversely affected the behavior of your app, you can opt out of this feature by adding the `Switch.System.IO.Compression.DoNotUseNativeZipLibraryForDecompression` switch to the `runtime` section of your app.config file and setting it to `true`: + +```xml + + + + + + +``` +### Affected APIs +`T:System.IO.Compression.DeflateStream` +`T:System.IO.Compression.GZipStream` + +### Category +Core + + + + diff --git a/Documentation/compatibility/deserialization-of-objects-across-appdomains-can-fail.md b/Documentation/compatibility/deserialization-of-objects-across-appdomains-can-fail.md new file mode 100644 index 000000000..770f48d77 --- /dev/null +++ b/Documentation/compatibility/deserialization-of-objects-across-appdomains-can-fail.md @@ -0,0 +1,27 @@ +## Deserialization of objects across appdomains can fail + +### Scope +Edge + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Not planned + +### Change Description +In some cases, when an app uses two or more app domains with different application bases, trying to deserialize objects in the logical call context across app domains throws an exception. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +See [Mitigation: Deserialization of Objects Across App Domains](~/docs/framework/migration-guide/mitigation-deserialization-of-objects-across-app-domains.md) + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + diff --git a/Documentation/compatibility/different-exception-handling-for-objectcontext_createdatabase-and-dbproviderservices_createdatabase-methods.md b/Documentation/compatibility/different-exception-handling-for-objectcontext_createdatabase-and-dbproviderservices_createdatabase-methods.md new file mode 100644 index 000000000..8b6126f98 --- /dev/null +++ b/Documentation/compatibility/different-exception-handling-for-objectcontext_createdatabase-and-dbproviderservices_createdatabase-methods.md @@ -0,0 +1,37 @@ +## Different exception handling for ObjectContext.CreateDatabase and DbProviderServices.CreateDatabase methods + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Beginning in .NET Framework 4.5, if database creation fails, `CreateDatabase` methods will +attempt to drop the empty database. If that operation succeeds, the original + will be +propagated (instead of the +that was always thrown in .NET Framework 4.0) + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +When catching an +while executing +or +, +SQLExceptions should now also be caught. + +### Affected APIs +* `M:System.Data.Objects.ObjectContext.CreateDatabase` +* `M:System.Data.Common.DbProviderServices.CreateDatabase(System.Data.Common.DbConnection,System.Nullable{System.Int32},System.Data.Metadata.Edm.StoreItemCollection)` + +### Category +Entity Framework + + diff --git a/Documentation/compatibility/ef-no-longer-throws-for-queryviews-with-specific-characteristics.md b/Documentation/compatibility/ef-no-longer-throws-for-queryviews-with-specific-characteristics.md new file mode 100644 index 000000000..dd004ec08 --- /dev/null +++ b/Documentation/compatibility/ef-no-longer-throws-for-queryviews-with-specific-characteristics.md @@ -0,0 +1,41 @@ +## EF no longer throws for QueryViews with specific characteristics + +### Scope +Edge + +### Version Introduced +4.5.2 + +### Source Analyzer Status +Not planned + +### Change Description + +Entity Framework no longer throws a + exception when an app +executes a query that involves a QueryView with a 0..1 navigation property that +attempts to include the related entities as part of the query. For example, by +calling `.Include(e => e.RelatedNavProp)`. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This change only affects code that uses QueryViews with 1-0..1 relationships +when running queries that call .Include. It improves reliability and should be +transparent to almost all apps. However, if it causes unexpected behavior, you +can disable it by adding the following entry to the `` section of +the app's configuration file: + +```xml + +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Entity Framework + + diff --git a/Documentation/compatibility/ef-version-must-match-netfx-version.md b/Documentation/compatibility/ef-version-must-match-netfx-version.md new file mode 100644 index 000000000..a9987f8c4 --- /dev/null +++ b/Documentation/compatibility/ef-version-must-match-netfx-version.md @@ -0,0 +1,35 @@ +## Entity Framework version must match the .NET Framework version + +### Scope +Major + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +The entity framework version should be matched with the .NET framework version. +Entity Framework 5 is recommended for .NET Framework 4.5. There are some known issues with +EF 4.x in a .NET Framework 4.5 project around +. In .NET +4.5, these were moved to a different assembly, so there are issues determining +which annotations to use. + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action +Upgrade to Entity Framework 5 for .NET Framework 4.5 + +### Affected APIs +* Not detectable via API analysis + +### Category +Entity Framework + +[More information](https://forums.asp.net/t/1779042.aspx) + + diff --git a/Documentation/compatibility/encoderparameter-ctor-is-obsolete.md b/Documentation/compatibility/encoderparameter-ctor-is-obsolete.md new file mode 100644 index 000000000..18958e0a4 --- /dev/null +++ b/Documentation/compatibility/encoderparameter-ctor-is-obsolete.md @@ -0,0 +1,34 @@ +## EncoderParameter ctor is obsolete + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description +The +constructor is obsolete now and will introduce build warnings if used. + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action +Although the + + +constructor will continue to work, the following constructor should be used +instead to avoid the obsolete build warning when re-compiling code with .NET Framework 4.5 +tools: +. + +### Affected APIs +* `M:System.Drawing.Imaging.EncoderParameter.#ctor(System.Drawing.Imaging.Encoder,System.Int32,System.Int32,System.Int32,System.Int32)` + +### Category +Windows Forms + + diff --git a/Documentation/compatibility/entityframework-6_0-loads-very-slowly-in-apps-launched-from-visual-studio.md b/Documentation/compatibility/entityframework-6_0-loads-very-slowly-in-apps-launched-from-visual-studio.md new file mode 100644 index 000000000..910931784 --- /dev/null +++ b/Documentation/compatibility/entityframework-6_0-loads-very-slowly-in-apps-launched-from-visual-studio.md @@ -0,0 +1,29 @@ +## EntityFramework 6.0 loads very slowly in apps launched from Visual Studio + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description +Launching an app from Visual Studio 2013 that uses EntityFramework 6.0 can be very slow. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This issue is fixed in EntityFramework 6.0.2. Update EntityFramework to avoid the performance issue. + +### Affected APIs +* Not detectable via API analysis + +### Category +Entity Framework + +[More information](https://entityframework.codeplex.com/workitem/1749) + + diff --git a/Documentation/compatibility/enumerable_empty-always-returns-cached-instance.md b/Documentation/compatibility/enumerable_empty-always-returns-cached-instance.md new file mode 100644 index 000000000..cc4b47798 --- /dev/null +++ b/Documentation/compatibility/enumerable_empty-always-returns-cached-instance.md @@ -0,0 +1,44 @@ +## Enumerable.Empty<TResult> always returns cached instance + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Beginning in .NET Framework 4.5, + always +returns a cached internal instance +. + +Previously, +would cache an empty + at +the time the API was called, meaning that in some conditions in which + was called +rapidly and concurrently, different instances of the type could be returned for +different calls to the API. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Because the previous behavior was non-deterministic, code is unlikely to depend +on it. However, in the unlikely case that empty enumerables are being compared +and expected to sometimes be unequal, explicit empty arrays should be created +(`new T[0]`) instead of using +. + +### Affected APIs +* ```M:System.Linq.Enumerable.Empty``1``` + +### Category +LINQ + + diff --git a/Documentation/compatibility/error-codes-for-maxrequestlength-or-maxreceivedmessagesize-are-different.md b/Documentation/compatibility/error-codes-for-maxrequestlength-or-maxreceivedmessagesize-are-different.md new file mode 100644 index 000000000..2e2b9a68d --- /dev/null +++ b/Documentation/compatibility/error-codes-for-maxrequestlength-or-maxreceivedmessagesize-are-different.md @@ -0,0 +1,40 @@ +## Error codes for maxRequestLength or maxReceivedMessageSize are different + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Not planned + +### Change Description + +Messages in WCF web services hosted in Internet Information Services (IIS) or +ASP.NET Development Server that exceed maxRequestLength (in ASP.NET) or +maxReceivedMessageSize (in WCF) have different error code + +The HTTP status code has changed from 400 (Bad Request) to 413 (Request Entity +Too Large), and messages that exceed either the maxRequestLength or the +maxReceivedMessageSize setting throw a + exception. +This includes cases in which the transfer mode is Streamed. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This change facilitates debugging in cases where the message length exceeds the +limits allowed by ASP.NET or WCF. + +You must modify any code that performs processing based on an HTTP 400 status code. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Communication Foundation (WCF) + + diff --git a/Documentation/compatibility/etw-event-names-cannot-differ-only-by-suffix.md b/Documentation/compatibility/etw-event-names-cannot-differ-only-by-suffix.md new file mode 100644 index 000000000..95e560f80 --- /dev/null +++ b/Documentation/compatibility/etw-event-names-cannot-differ-only-by-suffix.md @@ -0,0 +1,36 @@ +## ETW event names cannot differ only by a "Start" or "Stop" suffix + +### Scope +Edge + +### Version Introduced +4.6 + + +### Version Reverted +4.6.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +In the .NET Framework 4.6 and 4.6.1, the runtime throws an when two Event Tracing for Windows (ETW) event names differ only by a "Start" or "Stop" suffix (as when one event is named `LogUser` and another is named `LogUserStart`). In this case, the runtime cannot construct the event source, which cannot emit any logging. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +To prevent the exception, ensure that no two event names differ only by a "Start" or "Stop" suffix. + +This requirement is removed starting with the .NET Framework 4.6.2; the runtime can disambiguate event names that differ only by the "Start" and "Stop" suffix. + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + + + diff --git a/Documentation/compatibility/etw-eventlisteners-do-not-capture-events-from-providers-with-explicit-keywords.md b/Documentation/compatibility/etw-eventlisteners-do-not-capture-events-from-providers-with-explicit-keywords.md new file mode 100644 index 000000000..627e0dff0 --- /dev/null +++ b/Documentation/compatibility/etw-eventlisteners-do-not-capture-events-from-providers-with-explicit-keywords.md @@ -0,0 +1,43 @@ +## ETW EventListeners do not capture events from providers with explicit keywords (like the TPL provider) + +### Scope +Edge + +### Version Introduced +4.5 + +### Version Reverted +4.6 + +### Source Analyzer Status +Available + +### Change Description + +ETW EventListeners with a blank keyword mask do not properly capture events from +providers with explicit keywords. In the .NET Framework 4.5, the TPL provider +began providing explicit keywords and triggered this issue. In the .NET +Framework 4.6, EventListeners have been updated to no longer have this issue. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +To work around this problem, replace calls to + +with calls to the EnableEvents overload that explicitly specifies the "any +keywords" mask to use: `EnableEvents(eventSource, level, unchecked((EventKeywords)0xFFFFffffFFFFffff))`. + +Alternatively, this issue has been fixed in the .NET Framework 4.6 and may be +addressed by upgrading to that version of the .NET Framework. + +### Affected APIs +* `M:System.Diagnostics.Tracing.EventListener.EnableEvents(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel)` + +### Category +Core + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/816989/tpl-etw-events-for-task-not-captured-by-eventlistener-anymore) + + diff --git a/Documentation/compatibility/eventlistener-truncates-strings-with-embedded-nulls.md b/Documentation/compatibility/eventlistener-truncates-strings-with-embedded-nulls.md new file mode 100644 index 000000000..6b9087c20 --- /dev/null +++ b/Documentation/compatibility/eventlistener-truncates-strings-with-embedded-nulls.md @@ -0,0 +1,39 @@ +## EventListener truncates strings with embedded nulls + +### Scope +Edge + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Available + +### Change Description + + truncates +strings with embedded nulls. Null characters are not supported by the + class. The +change only affects apps that use + to read + data in +process and that use null characters as delimiters. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + + data should +be updated, if possible, to not use embedded null characters. + +### Affected APIs +* `M:System.Diagnostics.Tracing.EventListener.#ctor` +* `M:System.Diagnostics.Tracing.EventListener.EnableEvents(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel)` +* `M:System.Diagnostics.Tracing.EventListener.EnableEvents(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel,System.Diagnostics.Tracing.EventKeywords)` +* `M:System.Diagnostics.Tracing.EventListener.EnableEvents(System.Diagnostics.Tracing.EventSource,System.Diagnostics.Tracing.EventLevel,System.Diagnostics.Tracing.EventKeywords,System.Collections.Generic.IDictionary{System.String,System.String})` + +### Category +Core + + diff --git a/Documentation/compatibility/eventsource_writeevent-impls-must-pass-writeevent-the-same-parameters-that-it-received-(plus-id).md b/Documentation/compatibility/eventsource_writeevent-impls-must-pass-writeevent-the-same-parameters-that-it-received-(plus-id).md new file mode 100644 index 000000000..b12f41cb2 --- /dev/null +++ b/Documentation/compatibility/eventsource_writeevent-impls-must-pass-writeevent-the-same-parameters-that-it-received-(plus-id).md @@ -0,0 +1,36 @@ +## EventSource.WriteEvent impls must pass WriteEvent the same parameters that it received (plus ID) + +### Scope +Minor + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Available + +### Change Description + +The runtime now enforces the contract that specifies the following: A class +derived from +that defines an ETW event method must call the base class `EventSource.WriteEvent` +method with the event ID followed by the same arguments that the ETW event +method was passed. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +An exception is +thrown if an +reads data in +process for an event source that violates this contract. + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + diff --git a/Documentation/compatibility/exception-message-has-changed-for-failed-datacontract-serialization-in-case-of-an-unknown-type.md b/Documentation/compatibility/exception-message-has-changed-for-failed-datacontract-serialization-in-case-of-an-unknown-type.md new file mode 100644 index 000000000..29c5f6c47 --- /dev/null +++ b/Documentation/compatibility/exception-message-has-changed-for-failed-datacontract-serialization-in-case-of-an-unknown-type.md @@ -0,0 +1,58 @@ +## Exception message has changed for failed DataContract serialization in case of an unknown type + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +Planned + +### Change Description + +Beginning in the .NET Framework 4.6, the exception message given if a + +or +fails to serialize or deserialize due to missing 'known types' has been clarified. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Apps should not depend on specific exception messages. If an app depends on +this message, either update it to expect the new message or (preferably) +change it to depend only on the exception type. + +### Affected APIs +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.#ctor(System.Type)` +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.#ctor(System.Type,System.Collections.Generic.IEnumerable{System.Type})` +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.#ctor(System.Type,System.Runtime.Serialization.Json.DataContractJsonSerializerSettings)` +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.#ctor(System.Type,System.String)` +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.#ctor(System.Type,System.String,System.Collections.Generic.IEnumerable{System.Type})` +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.#ctor(System.Type,System.Xml.XmlDictionaryString)` +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.#ctor(System.Type,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable{System.Type})` +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.#ctor(System.Type,System.Collections.Generic.IEnumerable{System.Type},System.Int32,System.Boolean,System.Runtime.Serialization.IDataContractSurrogate,System.Boolean)` +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.#ctor(System.Type,System.String,System.Collections.Generic.IEnumerable{System.Type},System.Int32,System.Boolean,System.Runtime.Serialization.IDataContractSurrogate,System.Boolean)` +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.#ctor(System.Type,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable{System.Type},System.Int32,System.Boolean,System.Runtime.Serialization.IDataContractSurrogate,System.Boolean)` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type)` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.Runtime.Serialization.DataContractSerializerSettings)` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.Collections.Generic.IEnumerable{System.Type})` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.String,System.String)` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable{System.Type})` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString)` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable{System.Type})` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.Collections.Generic.IEnumerable{System.Type},System.Int32,System.Boolean,System.Boolean,System.Runtime.Serialization.IDataContractSurrogate)` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.Collections.Generic.IEnumerable{System.Type},System.Int32,System.Boolean,System.Boolean,System.Runtime.Serialization.IDataContractSurrogate,System.Runtime.Serialization.DataContractResolver)` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable{System.Type},System.Int32,System.Boolean,System.Boolean,System.Runtime.Serialization.IDataContractSurrogate)` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.String,System.String,System.Collections.Generic.IEnumerable{System.Type},System.Int32,System.Boolean,System.Boolean,System.Runtime.Serialization.IDataContractSurrogate,System.Runtime.Serialization.DataContractResolver)` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable{System.Type},System.Int32,System.Boolean,System.Boolean,System.Runtime.Serialization.IDataContractSurrogate)` +* `M:System.Runtime.Serialization.DataContractSerializer.#ctor(System.Type,System.Xml.XmlDictionaryString,System.Xml.XmlDictionaryString,System.Collections.Generic.IEnumerable{System.Type},System.Int32,System.Boolean,System.Boolean,System.Runtime.Serialization.IDataContractSurrogate,System.Runtime.Serialization.DataContractResolver)` + +### Category +Serialization + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/806395/misleading-exception-with-datacontractjsonserializer) + + diff --git a/Documentation/compatibility/exceptions-during-unobserved-processing-in-system_threading_tasks_task-no-longer-propagate-on-finalizer-thread.md b/Documentation/compatibility/exceptions-during-unobserved-processing-in-system_threading_tasks_task-no-longer-propagate-on-finalizer-thread.md new file mode 100644 index 000000000..918b4fa17 --- /dev/null +++ b/Documentation/compatibility/exceptions-during-unobserved-processing-in-system_threading_tasks_task-no-longer-propagate-on-finalizer-thread.md @@ -0,0 +1,49 @@ +## Exceptions during unobserved processing in System.Threading.Tasks.Task no longer propagate on finalizer thread + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +Because the class +represents an asynchronous operation, it catches all non-severe exceptions that +occur during asynchronous processing. In the .NET Framework 4.5, if an exception +is not observed and your code never waits on the task, the exception will no +longer propagate on the finalizer thread and crash the process during garbage +collection. This change enhances the reliability of applications that use the +Task class to perform unobserved asynchronous processing. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If an app depends on unobserved asynchronous exceptions propagating to the +finalizer thread, the previous behavior can be restored by providing an +appropriate handler for the + +event, or by setting a +[runtime configuration element](~/docs/framework/configure-apps/file-schema/runtime/throwunobservedtaskexceptions-element.md). + +### Affected APIs +* `M:System.Threading.Tasks.Task.Run(System.Action)` +* `M:System.Threading.Tasks.Task.Run(System.Action,System.Threading.CancellationToken)` +* `M:System.Threading.Tasks.Task.Run(System.Func{System.Threading.Tasks.Task})` +* `M:System.Threading.Tasks.Task.Run(System.Func{System.Threading.Tasks.Task},System.Threading.CancellationToken)` +* ```M:System.Threading.Tasks.Task.Run``1(System.Func{``0})``` +* ```M:System.Threading.Tasks.Task.Run``1(System.Func{``0},System.Threading.CancellationToken)``` +* ```M:System.Threading.Tasks.Task.Run``1(System.Func{System.Threading.Tasks.Task{``0}})``` +* ```M:System.Threading.Tasks.Task.Run``1(System.Func{System.Threading.Tasks.Task{``0}},System.Threading.CancellationToken)``` +* `M:System.Threading.Tasks.Task.Start` +* `M:System.Threading.Tasks.Task.Start(System.Threading.Tasks.TaskScheduler)` + +### Category +Core + + diff --git a/Documentation/compatibility/flowdocument-may-show-an-extra-line-of-text.md b/Documentation/compatibility/flowdocument-may-show-an-extra-line-of-text.md new file mode 100644 index 000000000..ef8ee3cdb --- /dev/null +++ b/Documentation/compatibility/flowdocument-may-show-an-extra-line-of-text.md @@ -0,0 +1,46 @@ +## FlowDocument may show an extra line of text + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +In some cases, a + +element will display an extra line of text when running on the .NET Framework +4.5 compared to how it displayed when run on the .NET Framework 4.0. There are +no known cases of the change causing any text to be displayed poorly or +illegibly, but it could cause text to appear that previously was omitted from a +'s +view. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +In some cases, decreasing the display element's PageHeight property by one can +restore the previous number of displayed lines. + +### Affected APIs +* `M:System.Windows.Documents.FlowDocument.#ctor` +* `M:System.Windows.Documents.FlowDocument.#ctor(System.Windows.Documents.Block)` +* `M:System.Windows.Controls.FlowDocumentReader.#ctor` +* `M:System.Windows.Controls.FlowDocumentPageViewer.#ctor` +* `M:System.Windows.Controls.Primitives.DocumentPageView.#ctor` + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/foreach-iterator-variable-is-now-scoped-within-the-iteration.md b/Documentation/compatibility/foreach-iterator-variable-is-now-scoped-within-the-iteration.md new file mode 100644 index 000000000..1227d0ee7 --- /dev/null +++ b/Documentation/compatibility/foreach-iterator-variable-is-now-scoped-within-the-iteration.md @@ -0,0 +1,29 @@ +## Foreach iterator variable is now scoped within the iteration, so closure capturing semantics are different (in C#5) + +### Scope +Major + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description +Beginning with C# 5 (Visual Studio 2012), `foreach` iterator variables are scoped within the iteration. This can cause breaks if code was previously depending on the variables to not be included in the `foreach`'s closure. The symptom of this change is that an iterator variable passed to a delegate is treated as the value it has at the time the delegate is created, rather than the value it has at the time the delegate is invoked. + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action +Ideally, code should be updated to expect the new compiler behavior. If the old semantics are required, the iterator variable can be replaced with a separate variable which is explicitly placed outside of the loop's scope. + +### Affected APIs +* Not detectable via API analysis + +### Categories +Core + +[More information](https://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx) + + diff --git a/Documentation/compatibility/glyphrun-computeinkboundingbox-and-formattedtext-extent-return-different-values-beginning-in-dotnet-4-5.md b/Documentation/compatibility/glyphrun-computeinkboundingbox-and-formattedtext-extent-return-different-values-beginning-in-dotnet-4-5.md new file mode 100644 index 000000000..69ee227e6 --- /dev/null +++ b/Documentation/compatibility/glyphrun-computeinkboundingbox-and-formattedtext-extent-return-different-values-beginning-in-dotnet-4-5.md @@ -0,0 +1,48 @@ +## GlyphRun.ComputeInkBoundingBox() and FormattedText.Extent return different values beginning in .NET Framework 4.5 + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Improvements were made to + +and + in +the .NET Framework 4.5 to address issues where the boxes were too small for the +contained glyphs in some cases in the .NET Framework 4.0. As a result of this, +some bounding boxes will be larger beginning in the .NET Framework 4.5, +resulting in subtle differences in UI layout. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Be aware that some glyph bounding box sizes have increased. These changes will +usually improve presentation and hit box testing, but if the older (pre-.NET +4.5) behavior is desired, it can be opted into by adding the following entry to +the app.config file: + +```xml + + + +``` + +### Affected APIs +* `M:System.Windows.Media.GlyphRun.ComputeInkBoundingBox` +* `P:System.Windows.Media.FormattedText.Extent` + +### Category +Windows Presentation Foundation (WPF) + +[More information](https://support.microsoft.com/kb/3009678) + + diff --git a/Documentation/compatibility/gridviews-with-allowcustompaging-set-to-true-may-fire-the-pageindexchanging-event-when-leaving-the-final-page-of-the-view.md b/Documentation/compatibility/gridviews-with-allowcustompaging-set-to-true-may-fire-the-pageindexchanging-event-when-leaving-the-final-page-of-the-view.md new file mode 100644 index 000000000..5b3ed7087 --- /dev/null +++ b/Documentation/compatibility/gridviews-with-allowcustompaging-set-to-true-may-fire-the-pageindexchanging-event-when-leaving-the-final-page-of-the-view.md @@ -0,0 +1,52 @@ +## GridViews with AllowCustomPaging set to true may fire the PageIndexChanging event when leaving the final page of the view + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.6 + +### Source Analyzer Status +Planned + +### Change Description + +A bug in the .NET Framework 4.5 causes + +to sometimes not fire for +s that have +enabled . + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This issue has been fixed in the .NET Framework 4.6 and may be addressed by +upgrading to that version of the .NET Framework. As a work-around, the app can +do an explicit BindGrid on any `Page_Load` that would hit these conditions (the + is on the last +page and +Last is +different from +). +Alternatively, the app can be modified to allow paging (instead of custom +paging), as that scenario does not demonstrate the problem. + +### Affected APIs +* `P:System.Web.UI.WebControls.GridView.AllowCustomPaging` + +### Category +ASP.NET + +[More information](https://stackoverflow.com/questions/18793795/asp-net-4-5-gridview-postback-of-last-page) + + + + diff --git a/Documentation/compatibility/horizontal-scrolling-and-virtualization.md b/Documentation/compatibility/horizontal-scrolling-and-virtualization.md new file mode 100644 index 000000000..b83429d43 --- /dev/null +++ b/Documentation/compatibility/horizontal-scrolling-and-virtualization.md @@ -0,0 +1,78 @@ +## Horizontal scrolling and virtualization + +### Scope +Minor + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Planned + +### Change Description + +This change applies to an + that does its +own virtualization in the direction orthogonal to the main scrolling direction +(the chief example is + with +EnableColumnVirtualization="True"). The outcome of certain horizontal scrolling +operations has been changed to produce results that are more intuitive and more +analogous to the results of comparable vertical operations.

+ +The operations include "Scroll Here" and "Right Edge", to use the names from the +menu obtained by right-clicking a horizontal scrollbar. Both of these compute a +candidate offset and call +.

+ +After scrolling to the new offset, the notion of "here" or "right edge" may have +changed because newly de-virtualized content has changed the value of +.

+ +Prior to .NET Framework 4.6.2, the scroll operation simply uses the candidate offset, even +though it may not be "here" or at the "right edge" any more. This results in +effects like "bouncing" the scroll thumb, best illustrated by example. Suppose a + has +ExtentWidth=1000 and Width=200. A scroll to "Right Edge" uses candidate offset +1000 - 200 = 800. While scrolling to that offset, new columns are de- +virtualized; let's suppose they are very wide, so that the + +changes to 2000. The scroll ends with HorizontalOffset=800, and the thumb +"bounces" back to near the middle of the scrollbar - precisely at 800/2000 = +40%.

+ +The change is to recompute a new candidate offset when this situation occurs, +and try again. (This is how vertical scrolling works already.)

+ +The change produces a more predictable and intuitive experience for the end +user, but it could also affect any app that depends on the exact value of + +after a horizontal scroll, whether invoked by the end user or by an explicit +call to +. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +An app that uses a predicted value for + +should be changed to fetch the actual value (and the value of +) +after any horizontal scroll that could change + +due to de-virtualization. + +### Affected APIs +* `T:System.Windows.Controls.Primitives.IScrollInfo` + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/htmltextwriter-does-not-render-br-element-correctly.md b/Documentation/compatibility/htmltextwriter-does-not-render-br-element-correctly.md new file mode 100644 index 000000000..c6179fb8d --- /dev/null +++ b/Documentation/compatibility/htmltextwriter-does-not-render-br-element-correctly.md @@ -0,0 +1,40 @@ +## HtmlTextWriter does not render `
` element correctly + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +Available + +### Change Description + +Beginning in the .NET Framework 4.6, calling + +and + +with a `
` element will correctly insert only one `
` (instead of two) + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +If an app depended on the extra `
` tag, + +should be called a second time. Note that this behavior change only affects apps +that target the .NET Framework 4.6 or later, so another option is to target a +previous version of the .NET Framework in order to get the old behavior. + +### Affected APIs +* `M:System.Web.UI.HtmlTextWriter.RenderBeginTag(System.String)` +* `M:System.Web.UI.HtmlTextWriter.RenderBeginTag(System.Web.UI.HtmlTextWriterTag)` + +### Category +ASP.NET + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/813061/htmltextwriter-does-not-render-br-element-correctly) + + diff --git a/Documentation/compatibility/httprequest_contentencoding-property-prohibits-utf7.md b/Documentation/compatibility/httprequest_contentencoding-property-prohibits-utf7.md new file mode 100644 index 000000000..162d521f1 --- /dev/null +++ b/Documentation/compatibility/httprequest_contentencoding-property-prohibits-utf7.md @@ -0,0 +1,37 @@ +## HttpRequest.ContentEncoding property prohibits UTF7 + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Beginning in .NET Framework 4.5, UTF-7 encoding is prohibited in +s' +bodies. Data for applications that depend on incoming UTF-7 data will not decode +properly in some cases. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Ideally, applications should be updated to not use UTF-7 encoding in +s. Alternatively, legacy +behavior can be restored by using the `aspnet:AllowUtf7RequestContentEncoding` +attribute of the +[appSettings](~/docs/framework/configure-apps/file-schema/appsettings/appsettings-element-for-configuration.md) +element. + +### Affected APIs +* `P:System.Web.HttpRequest.ContentEncoding` + +### Category +ASP.NET + + diff --git a/Documentation/compatibility/httputility_javascriptstringencode-escapes-ampersand.md b/Documentation/compatibility/httputility_javascriptstringencode-escapes-ampersand.md new file mode 100644 index 000000000..0aafffe85 --- /dev/null +++ b/Documentation/compatibility/httputility_javascriptstringencode-escapes-ampersand.md @@ -0,0 +1,34 @@ +## HttpUtility.JavaScriptStringEncode escapes ampersand + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description +Starting with the .NET Framework 4.5, + +escapes the ampersand (&) character. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If your app depends on the previous behavior of this method, you can add an +aspnet:JavaScriptDoNotEncodeAmpersand setting to the +[ASP.NET appSettings element](https://docs.microsoft.com/previous-versions/aspnet/hh975440(v=vs.120)) +in your configuration file. + +### Affected APIs +* `M:System.Web.HttpUtility.JavaScriptStringEncode(System.String)` +* `M:System.Web.HttpUtility.JavaScriptStringEncode(System.String,System.Boolean)` + +### Category +ASP.NET + + diff --git a/Documentation/compatibility/iasyncresult_completedsynchronously-property-must-be-correct-for-the-resulting-task-to-complete.md b/Documentation/compatibility/iasyncresult_completedsynchronously-property-must-be-correct-for-the-resulting-task-to-complete.md new file mode 100644 index 000000000..3cbe12852 --- /dev/null +++ b/Documentation/compatibility/iasyncresult_completedsynchronously-property-must-be-correct-for-the-resulting-task-to-complete.md @@ -0,0 +1,60 @@ +## IAsyncResult.CompletedSynchronously property must be correct for the resulting task to complete + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +When calling TaskFactory.FromAsync, the implementation of the + +property must be correct for the resulting task to complete. That is, the +property must return true if, and only if, the implementation completed +synchronously. Previously, the property was not checked. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +If implementations correctly +return true for the + property +only when a task completed synchronously, then no break will be observed. Users +should review implementations +they own (if any) to ensure that they correctly evaluate whether a task +completed synchronously or not. + +### Affected APIs +* ```M:System.Threading.Tasks.TaskFactory.FromAsync(System.IAsyncResult,System.Action{System.IAsyncResult})``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync(System.IAsyncResult,System.Action{System.IAsyncResult},System.Threading.Tasks.TaskCreationOptions)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync(System.IAsyncResult,System.Action{System.IAsyncResult},System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.IAsyncResult,System.Func{System.IAsyncResult,``0})``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync(System.Func{System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},System.Object)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync(System.Func{System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},System.Object,System.Threading.Tasks.TaskCreationOptions)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.Func{``0,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,System.Object)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.Func{``0,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,System.Object,System.Threading.Tasks.TaskCreationOptions)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.Func{System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``0},System.Object)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.Func{System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``0},System.Object,System.Threading.Tasks.TaskCreationOptions)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.IAsyncResult,System.Func{System.IAsyncResult,``0},System.Threading.Tasks.TaskCreationOptions)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``1(System.IAsyncResult,System.Func{System.IAsyncResult,``0},System.Threading.Tasks.TaskCreationOptions,System.Threading.Tasks.TaskScheduler)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``2(System.Func{``0,``1,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,``1,System.Object)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``2(System.Func{``0,``1,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,``1,System.Object,System.Threading.Tasks.TaskCreationOptions)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``2(System.Func{``0,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``1},``0,System.Object)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``2(System.Func{``0,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``1},``0,System.Object,System.Threading.Tasks.TaskCreationOptions)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``3(System.Func{``0,``1,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``2},``0,``1,System.Object)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``3(System.Func{``0,``1,``2,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,``1,``2,System.Object)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``3(System.Func{``0,``1,``2,System.AsyncCallback,System.Object,System.IAsyncResult},System.Action{System.IAsyncResult},``0,``1,``2,System.Object,System.Threading.Tasks.TaskCreationOptions)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``3(System.Func{``0,``1,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``2},``0,``1,System.Object,System.Threading.Tasks.TaskCreationOptions)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``4(System.Func{``0,``1,``2,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``3},``0,``1,``2,System.Object)``` +* ```M:System.Threading.Tasks.TaskFactory.FromAsync``4(System.Func{``0,``1,``2,System.AsyncCallback,System.Object,System.IAsyncResult},System.Func{System.IAsyncResult,``3},``0,``1,``2,System.Object,System.Threading.Tasks.TaskCreationOptions)``` + +### Category +Core + + diff --git a/Documentation/compatibility/icommand_canexecutechanged-event-behaviour-changed-in-_net-4_5.md b/Documentation/compatibility/icommand_canexecutechanged-event-behaviour-changed-in-_net-4_5.md new file mode 100644 index 000000000..9b7aeceda --- /dev/null +++ b/Documentation/compatibility/icommand_canexecutechanged-event-behaviour-changed-in-_net-4_5.md @@ -0,0 +1,43 @@ +## ICommand.CanExecuteChanged event behaviour changed in .NET Framework 4.5 + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +In the .NET Framework 4.5, a + was +ignored unless the sender of the event was the same object as the object that +raised the event. This bug was fixed in .NET Framework 4.5 servicing updates. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This bug has been fixed in the .NET Framework 4.5 servicing releases, so it can +be avoided by making sure that the .NET Framework is up-to-date or by upgrading +to .NET Framework 4.5.1. Alternatively, application code using + can be modified to +make sure that the sender when raising a + +command is the same as the object raising the event. + +### Affected APIs +* `E:System.Windows.Input.ICommand.CanExecuteChanged` + +### Category +Windows Presentation Foundation (WPF) + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/751429/wpf-icommand-canexecutechanged-behaviour-change-in-net-4-5) + + diff --git a/Documentation/compatibility/il-ret-not-allowed-in-a-try-region.md b/Documentation/compatibility/il-ret-not-allowed-in-a-try-region.md new file mode 100644 index 000000000..df01e2cbe --- /dev/null +++ b/Documentation/compatibility/il-ret-not-allowed-in-a-try-region.md @@ -0,0 +1,32 @@ +## IL ret not allowed in a try region + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +Planned + +### Change Description +Unlike the JIT64 just-in-time compiler, RyuJIT (used in .NET Framework 4.6) does not allow an IL ret instruction in a try region. Returning from a try region is disallowed by the ECMA-335 specification, and no known managed compiler generates such IL. However, the JIT64 compiler will execute such IL if it is generated using reflection emit. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +If an app is generating IL that includes a ret opcode in a try region, the app may target .NET Framework 4.5 to use the old JIT and avoid this break. Alternatively, the generated IL may be updated to return after the try region. + +### Affected APIs +* Not detectable via API analysis + +### Category +JIT + + + + diff --git a/Documentation/compatibility/incorrect-code-generation-when-passing-and-comparing-uint16-values.md b/Documentation/compatibility/incorrect-code-generation-when-passing-and-comparing-uint16-values.md new file mode 100644 index 000000000..05a34c4fe --- /dev/null +++ b/Documentation/compatibility/incorrect-code-generation-when-passing-and-comparing-uint16-values.md @@ -0,0 +1,35 @@ +## Incorrect code generation when passing and comparing UInt16 values + +### Scope +Edge + +### Version Introduced +4.7 + +### Version Reverted +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +Because of changes introduced in the .NET Framework 4.7, in some cases the code generated by the JIT compiler in applications running on the .NET Framework 4.7 incorrectly compares two `T:System.UInt16` values. For more information, see [Issue #11508: Silent bad codegen when passing and comparing ushort args](https://github.com/dotnet/coreclr/issues/11508) on GitHub.com. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If you encounter issues in the comparison of 16-bit unsigned values in the .NET Framework 4.7, upgrade to the .NET Framework 4.7.1. + +### Affected APIs +- * Not detectable via API analysis + +### Category +JIT + + + + diff --git a/Documentation/compatibility/incorrect-implementation-of-memberdescriptor_equals.md b/Documentation/compatibility/incorrect-implementation-of-memberdescriptor_equals.md new file mode 100644 index 000000000..73a646f09 --- /dev/null +++ b/Documentation/compatibility/incorrect-implementation-of-memberdescriptor_equals.md @@ -0,0 +1,51 @@ +## Incorrect implementation of MemberDescriptor.Equals + +### Scope +Edge + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Planned + +### Change Description +The original implementation of the method compares two different string properties from +the objects being compared: the category name and the description string. The fix is to compare +the of the first object to the of the second one, and the of the first to the of the second. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +If your application depends on sometimes returning `false` when descriptors +are equivalent, and you are targeting the .NET Framework 4.6.2 or later, you have several options: + +1. Make code changes to compare the and fields manually in addition to +calling the method. + +2. Opt out of this change by adding the following value to the app.config file: + + ```xml + + + + ``` + +If your application targets .NET Framework 4.6.1 or earlier and is running on the .NET Framework 4.6.2 or later and you want this change +enabled, you can set the compatibility switch to `false` by adding the following value to the +app.config file: + +```xml + + + +``` + +### Affected APIs +* `M:System.ComponentModel.MemberDescriptor.Equals(System.Object)` + +### Category +Windows Forms + + diff --git a/Documentation/compatibility/intermittently-unable-to-scroll-to-bottom-item-in-itemscontrols-when-using-customer-datatemplates.md b/Documentation/compatibility/intermittently-unable-to-scroll-to-bottom-item-in-itemscontrols-when-using-customer-datatemplates.md new file mode 100644 index 000000000..88bb8db3b --- /dev/null +++ b/Documentation/compatibility/intermittently-unable-to-scroll-to-bottom-item-in-itemscontrols-when-using-customer-datatemplates.md @@ -0,0 +1,46 @@ +## Intermittently unable to scroll to bottom item in ItemsControls (like ListBox and DataGrid) when using custom DataTemplates + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.5.2 + +### Source Analyzer Status +Available + +### Change Description + +In some instances, a bug in the .NET Framework 4.5 is causing ItemsControls +(like , +, +, etc.) +to not scroll to their bottom item when using custom DataTemplates. If the +scrolling is attempted a second time (after scrolling back up), it will work +then. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This issue has been fixed in the .NET Framework 4.5.2 and may be addressed by +upgrading to that version (or a later version) of the .NET Framework. +Alternatively, users can still drag scroll bars to the final items in these +collections, but may need to try twice to do so successfully. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/interop-enable-winrt-iagileobject.md b/Documentation/compatibility/interop-enable-winrt-iagileobject.md new file mode 100644 index 000000000..58f750910 --- /dev/null +++ b/Documentation/compatibility/interop-enable-winrt-iagileobject.md @@ -0,0 +1,58 @@ +## .NET Interop will now QueryInterface for IAgileObject (a WinRT interface) + +### Scope +Edge + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +When using a WinRT event with a .NET delegate, Windows will QI for IAgileObject starting with the .NET Framework 4.8. In previous versions of the .NET Framework, the runtime would fail that QI, and the event could not be subscribed. + +- [ x ] Quirked +- [ ] Build-time break + +### Recommended Action +If enabling the QI for IAgileObject breaks execution, you can disable this code by setting the following configuration. + +#### Method 1: Environment variable + +Set the following environment variable: + + COMPLUS_DisableCCWSupportIAgileObject=1 + + This method affects any environment that inherits this environment variable. This might be just a single + console session, or it might affect the entire machine if you set the environment variable globally. + + The environment variable name is not case-sensitive. + +#### Method 2: Registry + +Using Registry Editor (regedit.exe), find either of the following subkeys: + + HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework + HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework + + Then add the following: + + Value name: DisableCCWSupportIAgileObject + Type: DWORD (32-bit) Value (also called REG_WORD) + Value: 1 + + You can use the Windows REG.EXE tool to add this value from a command-line or scripting environment. For example: + +```console +reg add HKLM\SOFTWARE\Microsoft\.NETFramework /v DisableCCWSupportIAgileObject /t REG_DWORD /d 1 +``` + + In this case, `HKLM` is used instead of `HKEY_LOCAL_MACHINE`. Use `reg add /?` to see help on this syntax. + + The registry value name is not case-sensitive. + +### Category +Core + + diff --git a/Documentation/compatibility/interop-event-handlers-safearray.md b/Documentation/compatibility/interop-event-handlers-safearray.md new file mode 100644 index 000000000..db356a1e2 --- /dev/null +++ b/Documentation/compatibility/interop-event-handlers-safearray.md @@ -0,0 +1,28 @@ +## .NET COM successfully marshals ByRef SafeArray parameters on events + +### Scope +Minor + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +In the .NET Framework 4.7.2 and earlier versions, a ByRef [SafeArray](https://docs.microsoft.com/windows/desktop/api/oaidl/ns-oaidl-safearray) parameter on a COM event would fail to marshal back to native code. With this change the [SafeArray](https://docs.microsoft.com/windows/desktop/api/oaidl/ns-oaidl-safearray) is now marshalled successfully. + +- [ x ] Quirked +- [ ] Build-time break + +### Recommended Action +If properly marshalling ByRef SafeArray parameters on COM Events breaks execution, you can disable this code by adding the following configuration switch to your application config: + +```xml + + + +``` + +### Category +Core diff --git a/Documentation/compatibility/ipad-should-not-be-used-in-custom-capabilities-file-because-it-is-now-a-browser-capability.md b/Documentation/compatibility/ipad-should-not-be-used-in-custom-capabilities-file-because-it-is-now-a-browser-capability.md new file mode 100644 index 000000000..6fd681909 --- /dev/null +++ b/Documentation/compatibility/ipad-should-not-be-used-in-custom-capabilities-file-because-it-is-now-a-browser-capability.md @@ -0,0 +1,32 @@ +## IPad should not be used in custom capabilities file because it is now a browser capability + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description +Beginning in .NET Framework 4.5, iPad is an identifier in the default ASP.NET browser capabilities file, so it should not be used in a custom capabilities file + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +If iPad-specific capabilities are required, it is necessary to modify iPad behavior by setting capabilities on the pre-defined gateway refID "IPad" instead of by generating a new "IPad" ID by user agent matching. + +### Affected APIs +* Not detectable via API analysis + +### Category +ASP.NET + + + + diff --git a/Documentation/compatibility/item-scrolling-a-flat-list-with-items-of-different-pixel-height.md b/Documentation/compatibility/item-scrolling-a-flat-list-with-items-of-different-pixel-height.md new file mode 100644 index 000000000..0b2e5c2bc --- /dev/null +++ b/Documentation/compatibility/item-scrolling-a-flat-list-with-items-of-different-pixel-height.md @@ -0,0 +1,62 @@ +## Item-scrolling a flat list with items of different pixel-height + +### Scope +Minor + +### Version Introduced +4.6.1 + +### Version Reverted +4.6.2 + +### Source Analyzer Status +Planned + +### Change Description + +When an +displays a collection using virtualization (`IsVirtualizing=true`) and item- +scrolling (`ScrollUnit=Item`), and when the control scrolls to display an item +whose height in pixels differs from its neighbors, the + +iterates over all items in the collection. The UI is unresponsive during this +iteration; if the collection is large, this can be perceived as a hang. + +The iteration occurs in other circumstances, even in previous .NET Framework releases. For +example, it occurs when pixel-scrolling (`ScrollUnit=Pixel`) upon encountering +an item with different pixel height, and when item-scrolling hierarchical data +(such as a or an + with grouping +enabled) upon encountering an item with a different number of descendant items +than its neighbors. + +For the case of item-scrolling and different pixel height, the iteration was +introduced in .NET Framework 4.6.1 to fix bugs in the layout of hierarchical data. It is +not needed if the data is flat (no hierarchy), and .NET Framework 4.6.2 does not do it in +that case. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If the iteration occurs in .NET Framework 4.6.1 but not in earlier releases - that is, if +the is item- +scrolling a flat list with items of different pixel height - there are two +remedies: + +1. Install .NET Framework 4.6.2. +2. Install hotfix HR 1605 for .NET Framework 4.6.1. + +### Affected APIs +* `T:System.Windows.Controls.VirtualizingStackPanel` + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/items_clear-does-not-remove-duplicates-from-selecteditems.md b/Documentation/compatibility/items_clear-does-not-remove-duplicates-from-selecteditems.md new file mode 100644 index 000000000..18a1b7a07 --- /dev/null +++ b/Documentation/compatibility/items_clear-does-not-remove-duplicates-from-selecteditems.md @@ -0,0 +1,46 @@ +## Items.Clear does not remove duplicates from SelectedItems + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.6.2 + +### Source Analyzer Status +NotPlanned + +### Change Description + +Suppose a Selector (with multiple selection enabled) has duplicates in its + +collection - the same item appears more than once. Removing those items from the +data source (e.g. by calling Items.Clear) fails to remove them from +; +only the first instance is removed. Furthermore, subsequent use of + +(e.g. SelectedItems.Clear()) can encounter problems such as +, because + +contains items that are no longer in the data source. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Upgrade if possible to .NET Framework 4.6.2. + +### Affected APIs +* `P:System.Windows.Controls.Primitives.MultiSelector.SelectedItems` + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/keytips-behavior-improved-in-wpf.md b/Documentation/compatibility/keytips-behavior-improved-in-wpf.md new file mode 100644 index 000000000..3f0c6f871 --- /dev/null +++ b/Documentation/compatibility/keytips-behavior-improved-in-wpf.md @@ -0,0 +1,30 @@ +## Keytips behavior improved in WPF + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +Keytips behavior has been modified to bring parity with behavior on Microsoft Word and Windows Explorer. By checking whether keytip state is enabled or not in the case of a [SystemKey](xref:System.Windows.Input.KeyEventArgs.SystemKey) (in particular, [Alt](xref:System.Windows.Input.Key) or [F11](xref:System.Windows.Input.Key.F11)) being pressed, WPF handles keytip keys appropriately. Keytips now dismiss a menu even when it is opened by mouse. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +N/A + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/linq-to-ef-join-throws-argumentoutofrangeexception.md b/Documentation/compatibility/linq-to-ef-join-throws-argumentoutofrangeexception.md new file mode 100644 index 000000000..2f9b46f22 --- /dev/null +++ b/Documentation/compatibility/linq-to-ef-join-throws-argumentoutofrangeexception.md @@ -0,0 +1,44 @@ +## Linq to EF Join throws ArgumentOutOfRangeException + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.5 + +### Source Analyzer Status +Not planned + +### Change Description + +Linq queries or enumerables that call 'Join' on Entity Framework entities can +cause an in .NET +Framework 4.5 + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This issue was fixed in a servicing update. Update the .NET Framework +4.5, or upgrade to .NET Framework 4.5.1 or later, to fix this issue. + +### Affected APIs +* ```M:System.Linq.Enumerable.Join``4(System.Collections.Generic.IEnumerable{``0},System.Collections.Generic.IEnumerable{``1},System.Func{``0,``2},System.Func{``1,``2},System.Func{``0,``1,``3})``` +* ```M:System.Linq.Enumerable.Join``4(System.Collections.Generic.IEnumerable{``0},System.Collections.Generic.IEnumerable{``1},System.Func{``0,``2},System.Func{``1,``2},System.Func{``0,``1,``3},System.Collections.Generic.IEqualityComparer{``2})``` +* ```M:System.Linq.ParallelEnumerable.Join``4(System.Linq.ParallelQuery{``0},System.Collections.Generic.IEnumerable{``1},System.Func{``0,``2},System.Func{``1,``2},System.Func{``0,``1,``3})``` +* ```M:System.Linq.ParallelEnumerable.Join``4(System.Linq.ParallelQuery{``0},System.Collections.Generic.IEnumerable{``1},System.Func{``0,``2},System.Func{``1,``2},System.Func{``0,``1,``3},System.Collections.Generic.IEqualityComparer{``2})``` +* ```M:System.Linq.ParallelEnumerable.Join``4(System.Linq.ParallelQuery{``0},System.Linq.ParallelQuery{``1},System.Func{``0,``2},System.Func{``1,``2},System.Func{``0,``1,``3})``` +* ```M:System.Linq.ParallelEnumerable.Join``4(System.Linq.ParallelQuery{``0},System.Linq.ParallelQuery{``1},System.Func{``0,``2},System.Func{``1,``2},System.Func{``0,``1,``3},System.Collections.Generic.IEqualityComparer{``2})``` +* ```M:System.Linq.Queryable.Join``4(System.Linq.IQueryable{``0},System.Collections.Generic.IEnumerable{``1},System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``1,``2}},System.Linq.Expressions.Expression{System.Func{``0,``1,``3}})``` +* ```M:System.Linq.Queryable.Join``4(System.Linq.IQueryable{``0},System.Collections.Generic.IEnumerable{``1},System.Linq.Expressions.Expression{System.Func{``0,``2}},System.Linq.Expressions.Expression{System.Func{``1,``2}},System.Linq.Expressions.Expression{System.Func{``0,``1,``3}},System.Collections.Generic.IEqualityComparer{``2})``` + +### Category +LINQ + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/763986/linq-to-ef-join-throws-index-was-out-of-range-after-upgrade-from-vs2010-to-vs2012) + + diff --git a/Documentation/compatibility/list_foreach-can-throw-exception-when-modifying-list-item.md b/Documentation/compatibility/list_foreach-can-throw-exception-when-modifying-list-item.md new file mode 100644 index 000000000..c6c718c28 --- /dev/null +++ b/Documentation/compatibility/list_foreach-can-throw-exception-when-modifying-list-item.md @@ -0,0 +1,36 @@ +## List<T>.ForEach can throw exception when modifying list item + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Beginning in .NET Framework 4.5, a + +enumerator will throw an + exception if an +element in the calling collection is modified. Previously, this would not throw +an exception but could lead to race conditions. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +Ideally, code should be fixed to not modify lists while enumerating their +elements because that is never a safe operation. To revert to the previous +behavior, though, an app may target .NET Framework 4.0. + +### Affected APIs +* ``M:System.Collections.Generic.List`1.ForEach(System.Action{`0})`` + +### Category +Core + + diff --git a/Documentation/compatibility/list_sort-algorithm-changed.md b/Documentation/compatibility/list_sort-algorithm-changed.md new file mode 100644 index 000000000..b9c3c075b --- /dev/null +++ b/Documentation/compatibility/list_sort-algorithm-changed.md @@ -0,0 +1,44 @@ +## List.Sort algorithm changed + +### Scope +Transparent + +### Version Introduced +4.5 + +### Source Analyzer Status +Not planned + +### Change Description + +Beginning in .NET Framework 4.5, +'s sort algorithm +has changed (to be an introspective sort instead of a quick sort). +'s sort has never +been stable, but this change may cause different scenarios to sort in unstable +ways. That simply means that equivalent items may sort in different orders in +subsequent calls of the API. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Because the old sort algorithm was also unstable (though in slightly different +ways), there should be no code that depends on equivalent items always sorting +in a particular order. If there are instances of code depending upon that and +being lucky with the old behavior, that code should be updated to use a comparer +that will deterministically sort the items in the desired order. + +### Affected APIs +* ``M:System.Collections.Generic.List`1.Sort`` +* ``M:System.Collections.Generic.List`1.Sort(System.Collections.Generic.IComparer{`0})`` +* ``M:System.Collections.Generic.List`1.Sort(System.Comparison{`0})`` +* ``M:System.Collections.Generic.List`1.Sort(System.Int32,System.Int32,System.Collections.Generic.IComparer{`0})`` + +### Category +Core + +[More information](https://stackoverflow.com/questions/12461328/behaviour-of-listt-sort-in-net-4-5-changed-from-net-4-0?rq=1) + + diff --git a/Documentation/compatibility/listboxitem-isselected-binding-issue-with-observablecollection_move.md b/Documentation/compatibility/listboxitem-isselected-binding-issue-with-observablecollection_move.md new file mode 100644 index 000000000..e23970549 --- /dev/null +++ b/Documentation/compatibility/listboxitem-isselected-binding-issue-with-observablecollection_move.md @@ -0,0 +1,48 @@ +## ListBoxItem IsSelected binding issue with ObservableCollection<T>.Move + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.6 + +### Source Analyzer Status +Planned + +### Change Description + +Calling +or + +on a collection bound to a + with items selected +can lead to erratic behavior with future selection or unselection of + items. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Calling +and + +instead of + +will work around this issue. Alternatively, this issue has been fixed in the +.NET Framework 4.6 and may be addressed by upgrading to that version of the .NET +Framework. + +### Affected APIs +* ``M:System.Collections.ObjectModel.ObservableCollection`1.Move(System.Int32,System.Int32)`` +* ``M:System.Collections.ObjectModel.ObservableCollection`1.MoveItem(System.Int32,System.Int32)`` + +### Category +Windows Presentation Foundation (WPF) + +[More information](https://social.msdn.microsoft.com/Forums/afcbc8b3-a2f2-41e4-b402-2efc9eab1ffe/listboxitem-isselected-binding-issue-with-observablecollectionlttgtmove?forum=wpf) + + diff --git a/Documentation/compatibility/log-file-name-created-by-the-objectcontext_createdatabase-method-has-changed-to-match-sql-server-specifications.md b/Documentation/compatibility/log-file-name-created-by-the-objectcontext_createdatabase-method-has-changed-to-match-sql-server-specifications.md new file mode 100644 index 000000000..cddbd8a44 --- /dev/null +++ b/Documentation/compatibility/log-file-name-created-by-the-objectcontext_createdatabase-method-has-changed-to-match-sql-server-specifications.md @@ -0,0 +1,36 @@ +## Log file name created by the ObjectContext.CreateDatabase method has changed to match SQL Server specifications + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +When the + +method is called either directly or by using Code First with the SqlClient +provider and an AttachDBFilename value in the connection string, it creates a +log file named filename_log.ldf instead of filename.ldf (where filename is the +name of the file specified by the AttachDBFilename value). This change improves +debugging by providing a log file named according to SQL Server specifications. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If the log file name is important for an app, the app should be updated to +expect the standard _log.ldf file name format. + +### Affected APIs +* `M:System.Data.Objects.ObjectContext.CreateDatabase` + +### Category +Entity Framework + + diff --git a/Documentation/compatibility/long-path-support.md b/Documentation/compatibility/long-path-support.md new file mode 100644 index 000000000..2a0e943cf --- /dev/null +++ b/Documentation/compatibility/long-path-support.md @@ -0,0 +1,67 @@ +## Long path support + +### Scope +Minor + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Investigating + +### Change Description + +Starting with apps that target the .NET Framework 4.6.2, long paths (of up to +32K characters) are supported, and the 260-character (or `MAX_PATH`) limitation +on path lengths has been removed. + +For apps that are recompiled to target the .NET Framework 4.6.2, code paths that +previously threw a +because a path exceeded 260 characters will now throw a + only under the +following conditions: + +- The length of the path is greater than (32,767) characters. +- The operating system returns `COR_E_PATHTOOLONG` or its equivalent. + +For apps that target the .NET Framework 4.6.1 and earlier versions, the runtime +automatically throws a + whenever a path +exceeds 260 characters. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +For apps that target the .NET Framework 4.6.2, you can opt out of long path +support if it is not desirable by adding the following to the `` +section of your `app.config` file: + + ```xml + + + + ``` + +For apps that target earlier versions of the .NET Framework but run on the .NET +Framework 4.6.2 or later, you can opt in to long path support by adding the +following to the `` section of your `app.config` file: + + ```xml + + + + ``` +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + + + diff --git a/Documentation/compatibility/machinekey_encode-and-machinekey_decode-methods-are-now-obsolete.md b/Documentation/compatibility/machinekey_encode-and-machinekey_decode-methods-are-now-obsolete.md new file mode 100644 index 000000000..f87c60ed9 --- /dev/null +++ b/Documentation/compatibility/machinekey_encode-and-machinekey_decode-methods-are-now-obsolete.md @@ -0,0 +1,36 @@ +## MachineKey.Encode and MachineKey.Decode methods are now obsolete + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +These methods are now obsolete. Compilation of code that calls these methods +produces a compiler warning. + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action + +The recommended alternatives are + +and +. +Alternatively, the build warnings can be suppressed, or they can be avoided by +using an older compiler. The APIs are still supported. + +### Affected APIs +* `M:System.Web.Security.MachineKey.Encode(System.Byte[],System.Web.Security.MachineKeyProtection)` +* `M:System.Web.Security.MachineKey.Decode(System.String,System.Web.Security.MachineKeyProtection)` + +### Category +ASP.NET + + diff --git a/Documentation/compatibility/managed-browser-hosting-controls-from-the-_net-framework-1_1-and-2_0-are-blocked.md b/Documentation/compatibility/managed-browser-hosting-controls-from-the-_net-framework-1_1-and-2_0-are-blocked.md new file mode 100644 index 000000000..65820a4ee --- /dev/null +++ b/Documentation/compatibility/managed-browser-hosting-controls-from-the-_net-framework-1_1-and-2_0-are-blocked.md @@ -0,0 +1,27 @@ +## Managed browser hosting controls from the .NET Framework 1.1 and 2.0 are blocked + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Not planned + +### Change Description +Hosting these controls is blocked in Internet Explorer. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Internet Explorer will fail to launch an application that uses managed browser hosting controls. The previous behavior can be restored by setting the EnableIEHosting value of the registry subkey `HKLM/SOFTWARE/MICROSOFT/.NETFramework` to `1` for x86 systems and for 32-bit processes on x64 systems, and by setting the `EnableIEHosting` value of the registry subkey `HKLM/SOFTWARE/Wow6432Node/Microsoft/.NETFramework` to `1` for 64-bit processes on x64 systems. + +### Affected APIs +* Not detectable via API analysis + +### Category +Web Applications + + diff --git a/Documentation/compatibility/marshal_sizeof-and-marshal_ptrtostructure-overloads-break-dynamic-code.md b/Documentation/compatibility/marshal_sizeof-and-marshal_ptrtostructure-overloads-break-dynamic-code.md new file mode 100644 index 000000000..724684164 --- /dev/null +++ b/Documentation/compatibility/marshal_sizeof-and-marshal_ptrtostructure-overloads-break-dynamic-code.md @@ -0,0 +1,50 @@ +## Marshal.SizeOf and Marshal.PtrToStructure overloads break dynamic code + +### Scope +Minor + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Available + +### Change Description +Beginning in the .NET Framework 4.5.1, dynamically binding to the methods +, +, +, +, +, +or +, +(via Windows PowerShell, IronPython, or the C# dynamic keyword, for example) can +result in `MethodInvocationExceptions` because new overloads of these methods +have been added that may be ambiguous to the scripting engines. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Update scripts to clearly indicate which overload should be used. This can +typically done by explicitly casting the methods' type parameters as +. See [this link](https://support.microsoft.com/kb/2909958/) +for more detail and examples of how to workaround the issue. + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + +[More information](https://support.microsoft.com/kb/2909958/) + + + + diff --git a/Documentation/compatibility/mef-catalogs-implement-ienumerable-and-therefore-can-no-longer-be-used-to-create-a-serializer.md b/Documentation/compatibility/mef-catalogs-implement-ienumerable-and-therefore-can-no-longer-be-used-to-create-a-serializer.md new file mode 100644 index 000000000..7bf533bb5 --- /dev/null +++ b/Documentation/compatibility/mef-catalogs-implement-ienumerable-and-therefore-can-no-longer-be-used-to-create-a-serializer.md @@ -0,0 +1,32 @@ +## MEF catalogs implement IEnumerable and therefore can no longer be used to create a serializer + +### Scope +Major + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Starting with the .NET Framework 4.5, MEF catalogs implement IEnumerable and +therefore can no longer be used to create a serializer +( object). +Trying to serialize a MEF catalog throws an exception. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Can no longer use MEF to create a serializer + +### Affected APIs +* Not detectable via API analysis + +### Category +Managed Extensibility Framework (MEF) + + diff --git a/Documentation/compatibility/minfreememorypercentagetoactiveservice-is-now-respected.md b/Documentation/compatibility/minfreememorypercentagetoactiveservice-is-now-respected.md new file mode 100644 index 000000000..06be6b9eb --- /dev/null +++ b/Documentation/compatibility/minfreememorypercentagetoactiveservice-is-now-respected.md @@ -0,0 +1,36 @@ +## MinFreeMemoryPercentageToActiveService is now respected + +### Scope +Minor + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Available + +### Change Description + +This setting establishes the minimum memory that must be available on the server +before a WCF service can be activated. It is designed to prevent + exceptions. In the .NET +Framework 4.5, this setting had no effect. In the .NET Framework 4.5.1, the +setting is observed. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +An exception occurs if the free memory available on the web server is less than +the percentage defined by the configuration setting. Some WCF services that +successfully started and ran in a constrained memory environment may now fail. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Communication Foundation (WCF) + + + diff --git a/Documentation/compatibility/missing-target-framework-moniker-results-in-4_0-behavior.md b/Documentation/compatibility/missing-target-framework-moniker-results-in-4_0-behavior.md new file mode 100644 index 000000000..4fa40649f --- /dev/null +++ b/Documentation/compatibility/missing-target-framework-moniker-results-in-4_0-behavior.md @@ -0,0 +1,41 @@ +## Missing Target Framework Moniker results in 4.0 behavior + +### Scope +Major + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Applications without a + +applied at the assembly level will automatically run using the semantics +(quirks) of the .NET Framework 4.0. To ensure high quality, it is recommended +that all binaries be explicitly attributed with a + +indicating the version of the .NET Framework they were built with. Note that +using a target framework moniker in a project file will cause MSBuild to +automatically apply a +. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +A +should be supplied, either through adding the attribute directly to the assembly +or by specifying a target framework in the +[project file or through Visual Studio's project properties GUI](https://devblogs.microsoft.com/visualstudio/visual-studio-managed-multi-targeting-part-1-concepts-target-framework-moniker-target-framework/). + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + diff --git a/Documentation/compatibility/multi-line-asp_net-textbox-spacing-changed-when-using-antixssencoder.md b/Documentation/compatibility/multi-line-asp_net-textbox-spacing-changed-when-using-antixssencoder.md new file mode 100644 index 000000000..6fdd07ff0 --- /dev/null +++ b/Documentation/compatibility/multi-line-asp_net-textbox-spacing-changed-when-using-antixssencoder.md @@ -0,0 +1,43 @@ +## Multi-line ASP.Net TextBox spacing changed when using AntiXSSEncoder + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +In .NET Framework 4.0, extra lines were inserted between lines of a multi-line +text box on postback, if using the +. In .NET +Framework 4.5, those extra line breaks are not included, but only if the web app +is targeting .NET Framework 4.5 + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +Be aware that 4.0 web apps retargeted to .NET Framework 4.5 may have multi-line text boxes +improved to no longer insert extra line breaks. If this is not desirable, the +app can have the old behavior when running on .NET Framework 4.5 by targeting +the .NET Framework 4.0. + +### Affected APIs +* Not detectable via API analysis + +### Category +ASP.NET + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/748052/textbox-with-multiline-textmode-adds-additional-linebreak-to-the-output) + + + + diff --git a/Documentation/compatibility/multiple-items-in-a-single-tablelayoutpanel-cell-may-be-rearranged.md b/Documentation/compatibility/multiple-items-in-a-single-tablelayoutpanel-cell-may-be-rearranged.md new file mode 100644 index 000000000..1e7d5e710 --- /dev/null +++ b/Documentation/compatibility/multiple-items-in-a-single-tablelayoutpanel-cell-may-be-rearranged.md @@ -0,0 +1,44 @@ +## Multiple items in a single TableLayoutPanel cell may be rearranged + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.5 + +### Source Analyzer Status +Available + +### Change Description + +In the .NET Framework 4.5, if multiple items are placed in the same + cell, they may +be displayed in a different order than they were in the .NET Framework 4.0. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This behavior was reverted in a servicing update for the .NET Framework 4.5. +Update the .NET Framework 4.5, or upgrade to .NET Framework 4.5.1 or +later, to fix this issue. Alternatively, avoid the ambiguous case of multiple +items in the same + cell. + +### Affected APIs +* `M:System.Windows.Forms.TableLayoutControlCollection.Add(System.Windows.Forms.Control,System.Int32,System.Int32)` + +### Category +Windows Forms + + + + diff --git a/Documentation/compatibility/netdatacontractserializer-fails-to-deserialize-a-concurrentdictionary-serialized-with-a-different-_net-version.md b/Documentation/compatibility/netdatacontractserializer-fails-to-deserialize-a-concurrentdictionary-serialized-with-a-different-_net-version.md new file mode 100644 index 000000000..9cdfd6443 --- /dev/null +++ b/Documentation/compatibility/netdatacontractserializer-fails-to-deserialize-a-concurrentdictionary-serialized-with-a-different-_net-version.md @@ -0,0 +1,43 @@ +## NetDataContractSerializer fails to deserialize a ConcurrentDictionary serialized with a different .NET version + +### Scope +Minor + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Planned + +### Change Description + +By design, the +can be used only if both the serializing and deserializing ends share the same +CLR types. Therefore, it is not guaranteed that an object serialized with one +version of the .NET Framework can be deserialized by a different version. + + +is a type that is known to not to deserialize correctly if serialized with the +.NET Framework 4.5 or earlier and deserialized with the .NET Framework 4.5.1 or +later. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +There are a number of possible work-arounds for this issue: + +- Upgrade the serializing computer to use the .NET Framework 4.5.1, as well. +- Use instead of as this does not expect the exact same CLR types at both serializing and deserializing ends. +- Use instead of since it does not exhibit this particular 4.5->4.5.1 break. + +### Affected APIs +* `M:System.Runtime.Serialization.NetDataContractSerializer.Deserialize(System.IO.Stream)` + +### Category +Serialization + +[More information](https://stackoverflow.com/questions/19585791/net-4-5-1-wcf-serialization-exception) + + diff --git a/Documentation/compatibility/new-(ambiguous)-dispatcher_invoke-overloads-could-result-in-different-behavior.md b/Documentation/compatibility/new-(ambiguous)-dispatcher_invoke-overloads-could-result-in-different-behavior.md new file mode 100644 index 000000000..c136783e9 --- /dev/null +++ b/Documentation/compatibility/new-(ambiguous)-dispatcher_invoke-overloads-could-result-in-different-behavior.md @@ -0,0 +1,44 @@ +## New (ambiguous) Dispatcher.Invoke overloads could result in different behavior + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +The .NET Framework 4.5 adds new overloads to that include a +parameter of type . When existing code is recompiled, compilers +may resolve calls to Dispatcher.Invoke methods that have a +parameter as calls to Dispatcher.Invoke methods with an +parameter. If a call to a Dispatcher.Invoke overload with a +parameter is resolved as a call to a Dispatcher.Invoke overload with an + parameter, the following differences in behavior may occur: + +- If an exception occurs, the and events are not raised. Instead, exceptions are handled by the event. +- Calls to some members, such as , block until the operation has completed. + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action + +To avoid ambiguity (and potential differences in exception handling or blocking +behaviors), code calling Dispatcher.Invoke can pass an empty object[] as a +second parameter to the Invoke call to be sure of resolving to the .NET Framework 4.0 +method overload. + +### Affected APIs +* `M:System.Windows.Threading.Dispatcher.Invoke(System.Delegate,System.Object[])` +* `M:System.Windows.Threading.Dispatcher.Invoke(System.Delegate,System.TimeSpan,System.Object[])` +* `M:System.Windows.Threading.Dispatcher.Invoke(System.Delegate,System.TimeSpan,System.Windows.Threading.DispatcherPriority,System.Object[])` +* `M:System.Windows.Threading.Dispatcher.Invoke(System.Delegate,System.Windows.Threading.DispatcherPriority,System.Object[])` + +### Category +Windows Workflow Foundation (WF) + + diff --git a/Documentation/compatibility/new-64-bit-jit-compiler.md b/Documentation/compatibility/new-64-bit-jit-compiler.md new file mode 100644 index 000000000..47de343d6 --- /dev/null +++ b/Documentation/compatibility/new-64-bit-jit-compiler.md @@ -0,0 +1,63 @@ +## New 64-bit JIT compiler in the .NET Framework 4.6 + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +NotPlanned + +### Change Description +Starting with the .NET Framework 4.6, a new 64-bit JIT compiler is used for just-in-time compilation. In some cases, an unexpected exception is thrown or a different behavior is observed than if an app is run using the 32-bit compiler or the older 64-bit JIT compiler. This change does not affect the 32-bit JIT compiler. + +The known differences include the following: + +- Under certain conditions, an unboxing operation may throw a in Release builds with optimization turned on. +- In some cases, execution of production code in a large method body may throw a . +- Under certain conditions, structures passed to a method are treated as reference types rather than as value types in Release builds. One of the manifestations of this issue is that the individual items in a collection appear in an unexpected order. +- Under certain conditions, the comparison of values with their high bit set is incorrect if optimization is enabled. +- Under certain conditions, particularly when initializing array values, memory initialization by the IL instruction may initialize memory with an incorrect value. This can result either in an unhandled exception or incorrect output. +- Under certain rare conditions, a conditional bit test can return the incorrect value or throw an exception if compiler optimizations are enabled. +- Under certain conditions, if an `if` statement is used to test for a condition before entering a `try` block and in the exit from the `try` block, and the same condition is evaluated in the `catch` or `finally` block, the new 64-bit JIT compiler removes the `if` condition from the `catch` or `finally` block when it optimizes code. As a result, code inside the `if` statement in the `catch` or `finally` block is executed unconditionally. + + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +**Mitigation of known issues**
+If you encounter the issues listed above, you can address them by doing any of the following: + +- Upgrade to the .NET Framework 4.6.2. The new 64-bit compiler included with the .NET Framework 4.6.2 addresses each of these known issues. +- Ensure that your version of Windows is up to date by running Windows Update. Service updates to the .NET Framework 4.6 and 4.6.1 address each of these issues except the in an unboxing operation. +- Compile with the older 64-bit JIT compiler. See the **Mitigation of other issues** section for more information on how to do this. + +**Mitigation of other issues**
+If you encounter any other difference in behavior between code compiled with the older 64-bit compiler and the new 64-bit JIT compiler, or between the debug and release versions of your app that are both compiled with the new 64-bit JIT compiler, you can do the following to compile your app with the older 64-bit JIT compiler: + +- On a per-application basis, you can add the [\](~/docs/framework/configure-apps/file-schema/runtime/uselegacyjit-element.md) element to your application's configuration file. The following disables compilation with the new 64-bit JIT compiler and instead uses the legacy 64-bit JIT compiler. + + ```xml + + + + + + + ``` + +- On a per-user basis, you can add a `REG_DWORD` value named `useLegacyJit` to the `HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework` key of the registry. A value of 1 enables the legacy 64-bit JIT compiler; a value of 0 disables it and enables the new 64-bit JIT compiler. +- On a per-machine basis, you can add a `REG_DWORD` value named `useLegacyJit` to the `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework` key of the registry. A value of `1` enables the legacy 64-bit JIT compiler; a value of `0` disables it and enables the new 64-bit JIT compiler. + +You can also let us know about the problem by reporting a bug on [Microsoft Connect](https://connect.microsoft.com/VisualStudio). + +### Affected APIs +* Not detectable via API analysis + +### Category +JIT + + + diff --git a/Documentation/compatibility/new-enum-values-in-wpf's-pagerangeselection.md b/Documentation/compatibility/new-enum-values-in-wpf's-pagerangeselection.md new file mode 100644 index 000000000..be1a727f5 --- /dev/null +++ b/Documentation/compatibility/new-enum-values-in-wpf's-pagerangeselection.md @@ -0,0 +1,43 @@ +## New enum values in WPF's PageRangeSelection + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Two new members ( +and +) +have been added to the + enum. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +In most cases, these changes won't impact user code. Code that depends on a +particular number of elements existing in + or + calls on +the type +should be modified, though. + +### Affected APIs +* `T:System.Windows.Controls.PageRangeSelection` + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/no-longer-able-to-set-enableviewstatemac-to-false.md b/Documentation/compatibility/no-longer-able-to-set-enableviewstatemac-to-false.md new file mode 100644 index 000000000..5c4607a80 --- /dev/null +++ b/Documentation/compatibility/no-longer-able-to-set-enableviewstatemac-to-false.md @@ -0,0 +1,27 @@ +## No longer able to set EnableViewStateMac to false + +### Scope +Major + +### Version Introduced +4.5.2 + +### Source Analyzer Status +Available + +### Change Description +ASP.NET no longer allows developers to specify `` or `<@Page EnableViewStateMac="false" %>`. The view state message authentication code (MAC) is now enforced for all requests with embedded view state. Only apps that explicitly set the EnableViewStateMac property to `false` are affected. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +EnableViewStateMac must be assumed to be true, and any resulting MAC errors must be resolved (as explained in [this guidance](https://support.microsoft.com/kb/2915218), which contains multiple resolutions depending on the specifics of what is causing MAC errors). + +### Affected APIs +* Not detectable via API analysis + +### Category +ASP.NET + + diff --git a/Documentation/compatibility/non-pooled-sql-connections-will-leak-memory-if-not-explicitly-disposed.md b/Documentation/compatibility/non-pooled-sql-connections-will-leak-memory-if-not-explicitly-disposed.md new file mode 100644 index 000000000..7878fc8e2 --- /dev/null +++ b/Documentation/compatibility/non-pooled-sql-connections-will-leak-memory-if-not-explicitly-disposed.md @@ -0,0 +1,39 @@ +## Non-pooled SQL connections will leak memory if not explicitly disposed + +### Scope +Edge + +### Version Introduced +4.5 + +### Version Reverted +4.5 + +### Source Analyzer Status +Not planned + +### Change Description +In the .NET Framework 4.5, non-pooled SQL connections which are not explicitly exposed (via Dispose, Close, or using) will leak memory + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This issue is fixed in a .NET Framework 4.5 servicing update. Update the +.NET Framework 4.5, or upgrade to .NET Framework 4.5.1 or later, to fix this +issue. Alternatively, this issue may be avoided by using the + in a 'using' +pattern (which is a best practice) or by explicitly calling Dispose or Close +when the connection is no longer needed. + +### Affected APIs +* `M:System.Data.SqlClient.SqlConnection.#ctor(System.String)` +* `M:System.Data.SqlClient.SqlConnection.#ctor(System.String,System.Data.SqlClient.SqlCredential)` + +### Category +Data + +[More information](https://support.microsoft.com/kb/2748720) + + diff --git a/Documentation/compatibility/null-coalescer-values-are-not-visible-in-debugger-until-one-step-later.md b/Documentation/compatibility/null-coalescer-values-are-not-visible-in-debugger-until-one-step-later.md new file mode 100644 index 000000000..e14b09101 --- /dev/null +++ b/Documentation/compatibility/null-coalescer-values-are-not-visible-in-debugger-until-one-step-later.md @@ -0,0 +1,32 @@ +## Null coalescer values are not visible in debugger until one step later + +### Scope +Edge + +### Version Introduced +4.5 + +### Version Reverted +4.6 + +### Source Analyzer Status +Not planned + +### Change Description +A bug in the .NET Framework 4.5 causes values set via a null coalescing operation to not be visible in the debugger immediately after the assignment operation is executed when running on the 64-bit version of the Framework. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Stepping one additional time in the debugger will cause the local/field's value to be correctly updated. Also, this issue has been fixed in the .NET Framework 4.6; upgrading to that version of the Framework should solve the issue. + +### Affected APIs +* Not detectable via API analysis + +### Category +Debugger + +[More information](https://stackoverflow.com/questions/19352130/why-doesnt-the-null-coalescing-operator-work-in-this-situation) + + diff --git a/Documentation/compatibility/objectcontext_translate-and-objectcontext_executestorequery-now-support-enum-type.md b/Documentation/compatibility/objectcontext_translate-and-objectcontext_executestorequery-now-support-enum-type.md new file mode 100644 index 000000000..9200443ad --- /dev/null +++ b/Documentation/compatibility/objectcontext_translate-and-objectcontext_executestorequery-now-support-enum-type.md @@ -0,0 +1,30 @@ +## ObjectContext.Translate and ObjectContext.ExecuteStoreQuery now support enum type + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description +In .NET Framework 4.0, the generic parameter `T` of `ObjectContext.Translate` and `ObjectContext.ExecuteStoreQuery` methods could not be an enum. That scenario is now supported. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +If Translate or ExecuteStoreQuery was called on an enum type in .NET Framework 4.0, '0' was returned. If that behavior was desirable, the calls should be replaced with a constant 0 (or the enum equivalent of it). + +### Affected APIs +* ```M:System.Data.Objects.ObjectContext.Translate``1(System.Data.Common.DbDataReader)``` +* ```M:System.Data.Objects.ObjectContext.Translate``1(System.Data.Common.DbDataReader,System.String,System.Data.Objects.MergeOption)``` +* ``M:System.Data.Objects.ObjectContext.ExecuteStoreQuery``1(System.String,System.Object[])``` +* ```M:System.Data.Objects.ObjectContext.ExecuteStoreQuery``1(System.String,System.String,System.Data.Objects.MergeOption,System.Object[])``` + +### Category +Entity Framework + + diff --git a/Documentation/compatibility/objectdisposedexception-thrown-by-wpf-spellchecker.md b/Documentation/compatibility/objectdisposedexception-thrown-by-wpf-spellchecker.md new file mode 100644 index 000000000..c30b63a39 --- /dev/null +++ b/Documentation/compatibility/objectdisposedexception-thrown-by-wpf-spellchecker.md @@ -0,0 +1,41 @@ +## ObjectDisposedException thrown by WPF spellchecker + +### Scope +Edge + +### Version Introduced +4.6.1 + +### Version Reverted +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description + +WPF applications occasionally crash during application shutdown with an + thrown by the +spellchecker. This is fixed in .NET Framework 4.7 WPF by handling the exception +gracefully, and thus ensuring that applications are no longer adversely +affected. It should be noted that occasional first-chance exceptions would +continue to be observed in applications running under a debugger. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Upgrade to .NET Framework 4.7 + +### Affected APIs +Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/obsoleteattribute-exports-as-both-obsoleteattribute-and-deprecatedattribute-in-winmd-scenarios.md b/Documentation/compatibility/obsoleteattribute-exports-as-both-obsoleteattribute-and-deprecatedattribute-in-winmd-scenarios.md new file mode 100644 index 000000000..f67eb9d75 --- /dev/null +++ b/Documentation/compatibility/obsoleteattribute-exports-as-both-obsoleteattribute-and-deprecatedattribute-in-winmd-scenarios.md @@ -0,0 +1,39 @@ +## ObsoleteAttribute exports as both ObsoleteAttribute and DeprecatedAttribute in WinMD scenarios + +### Scope +Edge + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Available + +### Change Description + +When you create a Windows Metadata library (.winmd file), the + attribute is exported as +both and +[Windows.Foundation.DeprecatedAttribute](https://docs.microsoft.com/uwp/api/windows.foundation.metadata.deprecatedattribute). + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action + +Recompilation of existing source code that uses the + attribute may generate +warnings when consuming that code from C++/CX or JavaScript. + +We do not recommend applying both + and +[Windows.Foundation.DeprecatedAttribute](https://docs.microsoft.com/uwp/api/windows.foundation.metadata.deprecatedattribute) to code in managed assemblies; it may +result in build warnings. + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + diff --git a/Documentation/compatibility/only-tls-1_0-1_1-and-1_2-protocols-supported-in-system_net_servicepointmanager-and-system_net_security_sslstream.md b/Documentation/compatibility/only-tls-1_0-1_1-and-1_2-protocols-supported-in-system_net_servicepointmanager-and-system_net_security_sslstream.md new file mode 100644 index 000000000..f8056e504 --- /dev/null +++ b/Documentation/compatibility/only-tls-1_0-1_1-and-1_2-protocols-supported-in-system_net_servicepointmanager-and-system_net_security_sslstream.md @@ -0,0 +1,46 @@ +## Only Tls 1.0, 1.1 and 1.2 protocols supported in System.Net.ServicePointManager and System.Net.Security.SslStream + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +Planned + +### Change Description + +Starting with the .NET Framework 4.6, the + and + classes are only +allowed to use one of the following three protocols: Tls1.0, Tls1.1, or Tls1.2. +The SSL3.0 protocol and RC4 cipher are not supported. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +The recommended mitigation is to upgrade the sever-side app to Tls1.0, Tls1.1, +or Tls1.2. If this is not feasible, or if client apps are broken, the + class can be used to opt out of +this feature in either of two ways: + +1. By programmatically setting compat switches on the , as explained [here](https://devblogs.microsoft.com/dotnet/net-announcements-at-build-2015/#dotnet46). +2. By adding the following line to the `` section of the app.config file: + + ```xml + + ``` + +### Affected APIs +* `F:System.Net.SecurityProtocolType.Ssl3` +* `F:System.Security.Authentication.SslProtocols.None` +* `F:System.Security.Authentication.SslProtocols.Ssl2` +* `F:System.Security.Authentication.SslProtocols.Ssl3` + +### Category +Networking + + diff --git a/Documentation/compatibility/operationcontext-current-returns-null-in-a-using-clause.md b/Documentation/compatibility/operationcontext-current-returns-null-in-a-using-clause.md new file mode 100644 index 000000000..00191d5dc --- /dev/null +++ b/Documentation/compatibility/operationcontext-current-returns-null-in-a-using-clause.md @@ -0,0 +1,77 @@ +## OperationContext.Current may return null when called in a using clause + +### Scope +Edge + +### Version Introduced +4.6.2 + +### Version Reverted + +### Source Analyzer Status +Investigating + +### Change Description + + may return `null` and a may result if all of the following conditions are true: + +- You retrieve the value of the property in a method that returns a or . + +- You instantiate the object in a `using` clause. + +- You retrieve the value of the property within the `using statement`. For example: + + ```csharp + using (new OperationContextScope(OperationContext.Current)) + { + OperationContext context = OperationContext.Current; // OperationContext.Current is null. + // ... + } + ``` + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +To address this issue, you can do the following: + +- Modify your code as follows to instantiate a new non-`null` object: + + ```csharp + OperationContext ocx = OperationContext.Current; + using (new OperationContextScope(OperationContext.Current)) + { +    OperationContext.Current = new OperationContext(ocx.Channel); +    // ... + } + ``` + +- Install the latest update to the .NET Framework 4.6.2, or upgrade to a later version of the .NET Framework. This disables the flow of the in and restores the behavior of WCF applications in the .NET Framework 4.6.1 and earlier versions. This behavior is configurable; it is equivalent to adding the following app setting to your configuration file: + + ```xml + + + + ``` + + If this change is undesirable and your application depends on execution context flowing between operation contexts, you can enable its flow as follows: + + ```xml + + + + ``` + +### Affected APIs +- `P:System.ServiceModel.OperationContext.Current` + +### Category +Windows Communication Foundation (WCF) + + + + diff --git a/Documentation/compatibility/opt-in-break-to-revert-from-different-4_5-sql-generation-to-simpler-4_0-sql-generation.md b/Documentation/compatibility/opt-in-break-to-revert-from-different-4_5-sql-generation-to-simpler-4_0-sql-generation.md new file mode 100644 index 000000000..bef1b439a --- /dev/null +++ b/Documentation/compatibility/opt-in-break-to-revert-from-different-4_5-sql-generation-to-simpler-4_0-sql-generation.md @@ -0,0 +1,34 @@ +## Opt-in break to revert from different 4.5 SQL generation to simpler 4.0 SQL generation + +### Scope +Transparent + +### Version Introduced +4.5.2 + +### Source Analyzer Status +Not planned + +### Change Description +Queries that produce JOIN statements and contain a call to a limiting operation without first using OrderBy now produce simpler SQL. After upgrading to .NET Framework 4.5, these queries produced more complicated SQL than previous versions. + +- [ ] Quirked +- [x] Optional +- [ ] Build-time break + +### Recommended Action +This feature is disabled by default. If Entity Framework generates extra JOIN statements that cause performance degradation, you can enable this feature by adding the following entry to the `` section of the application configuration (app.config) file: + +```xml + +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Entity Framework + + + + diff --git a/Documentation/compatibility/page_loadcomplete-event-no-longer-causes-system_web_ui_webcontrols_entitydatasource-control-to-invoke-data-binding.md b/Documentation/compatibility/page_loadcomplete-event-no-longer-causes-system_web_ui_webcontrols_entitydatasource-control-to-invoke-data-binding.md new file mode 100644 index 000000000..06659b082 --- /dev/null +++ b/Documentation/compatibility/page_loadcomplete-event-no-longer-causes-system_web_ui_webcontrols_entitydatasource-control-to-invoke-data-binding.md @@ -0,0 +1,46 @@ +## Page.LoadComplete event no longer causes System.Web.UI.WebControls.EntityDataSource control to invoke data binding + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +The event no +longer causes the + control +to invoke data binding for changes to create/update/delete parameters. This +change eliminates an extraneous trip to the database, prevents the values of +controls from being reset, and produces behavior that is consistent with other +data controls, such as + and +. This +change produces different behavior in the unlikely event that applications rely +on invoking data binding in the + event. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If there is a need for databinding, manually invoke databind in an event that is +earlier in the post-back. + +### Affected APIs +* Investigate applicable APIs + +### Category +ASP.NET + + + + diff --git a/Documentation/compatibility/path-colon-checks-are-stricter.md b/Documentation/compatibility/path-colon-checks-are-stricter.md new file mode 100644 index 000000000..432a30fbb --- /dev/null +++ b/Documentation/compatibility/path-colon-checks-are-stricter.md @@ -0,0 +1,39 @@ +## Path colon checks are stricter + +### Scope +Edge + +### Version Introduced +4.6.2 + +### Source Analyzer Status +NotPlanned + +### Change Description + +In .NET Framework 4.6.2, a number of changes were made to support previously +unsupported paths (both in length and format). Checks for proper drive separator +(colon) syntax were made more correct, which had the side effect of blocking +some URI paths in a few select Path APIs where they used to be tolerated. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +If passing a URI to affected APIs, modify the string to be a legal path first. + +- Remove the scheme from URLs manually (e.g. remove `file://` from URLs) +- Pass the URI to the class and use + +Alternatively, you can opt out of the new path normalization by setting the `Switch.System.IO.UseLegacyPathHandling` AppContext switch to true. + +### Affected APIs + +* `M:System.IO.Path.GetDirectoryName(System.String)` +* `M:System.IO.Path.GetPathRoot(System.String)` + +### Category +Core + + diff --git a/Documentation/compatibility/persian-calendar-now-uses-the-hijri-solar-algorithm.md b/Documentation/compatibility/persian-calendar-now-uses-the-hijri-solar-algorithm.md new file mode 100644 index 000000000..d69781a6a --- /dev/null +++ b/Documentation/compatibility/persian-calendar-now-uses-the-hijri-solar-algorithm.md @@ -0,0 +1,36 @@ +## Persian calendar now uses the Hijri solar algorithm + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +Available + +### Change Description + +Starting with the .NET Framework 4.6, the + class uses the +Hijri solar algorithm. Converting dates between the + and other +calendars may produce a slightly different result beginning with the .NET +Framework 4.6 for dates earlier than 1800 or later than 2023 (Gregorian). + +Also, +is now `March 22, 0622` instead of `March 21, 0622`. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Be aware that some early or late dates may be slightly different when using the PersianCalendar in .NET Framework 4.6. Also, when serializing dates between processes which may run on different .NET Framework versions, do not store them as PersianCalendar date strings (since those values may be different). + +### Affected APIs +* `T:System.Globalization.PersianCalendar` + +### Category +Core + + diff --git a/Documentation/compatibility/previewlostkeyboardfocus-is-called-repeatedly-if-its-handler-shows-a-message-box.md b/Documentation/compatibility/previewlostkeyboardfocus-is-called-repeatedly-if-its-handler-shows-a-message-box.md new file mode 100644 index 000000000..84d654797 --- /dev/null +++ b/Documentation/compatibility/previewlostkeyboardfocus-is-called-repeatedly-if-its-handler-shows-a-message-box.md @@ -0,0 +1,46 @@ +## PreviewLostKeyboardFocus is called repeatedly if its handler shows a Windows Forms message box + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Beginning in the .NET Framework 4.5, calling + from a + +handler will cause the handler to re-fire when the message box is closed, +potentially resulting in an infinite loop of message boxes. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +There are two options to work around this issue: + +1. It may be avoided by calling instead of . +2. It may be avoided by showing the message box from a event handler (as opposed to a event handler). + +### Affected APIs +* `M:System.Windows.ContentElement.add_PreviewLostKeyboardFocus(System.Windows.Input.KeyboardFocusChangedEventHandler)` +* `M:System.Windows.IInputElement.add_PreviewLostKeyboardFocus(System.Windows.Input.KeyboardFocusChangedEventHandler)` +* `M:System.Windows.UIElement.add_PreviewLostKeyboardFocus(System.Windows.Input.KeyboardFocusChangedEventHandler)` +* `M:System.Windows.UIElement3D.add_PreviewLostKeyboardFocus(System.Windows.Input.KeyboardFocusChangedEventHandler)` + +### Categories +Windows Forms +Windows Presentation Foundation (WPF) + +[More information](https://stackoverflow.com/questions/17988219/system-windows-forms-messagebox-in-netversion-4-0-4-5-behaves-differently-in-wi) + + + + diff --git a/Documentation/compatibility/product-versioning-changes-in-net-framework-4-6-and-later.md b/Documentation/compatibility/product-versioning-changes-in-net-framework-4-6-and-later.md new file mode 100644 index 000000000..8f6c2c3ac --- /dev/null +++ b/Documentation/compatibility/product-versioning-changes-in-net-framework-4-6-and-later.md @@ -0,0 +1,54 @@ +## Product versioning changes in the .NET Framework 4.6 and later versions + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +NotPlanned + +### Change Description + +Product versioning has changed from the previous releases of the .NET Framework, and particularly from the .NET Framework 4, 4.5, 4.5.1, and 4.5.2. + +The following are the detailed changes: + +- The value of the `Version` entry in the `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full` key has changed to `4.6.xxxxx` for the .NET Framework 4.6 and its point releases, to `4.7.xxxxx` for the .NET Framework 4.7 and its point releases, and to `4.8.xxxxx` for .NET Framework 4.8. In the .NET Framework 4.5, 4.5.1, and 4.5.2, it had the format `4.5.xxxxx`. + +- The file and product versioning for .NET Framework files has changed from the earlier versioning scheme of 4.0.30319.x to 4.6.X.0 for the .NET Framework 4.6 and its point releases, and to 4.7.X.0 for the .NET Framework 4.7 and its point releases, and to 4.8.X.0 for .NET Framework 4.8. You can see these new values when you view the file's Properties after right-clicking on a file. + +- The and attributes for managed assemblies have Version values in the form 4.6.X.0 for the .NET Framework 4.6 and its point releases, 4.7.X.0 for the .NET Framework 4.7 and its point releases, and 4.8.X.0 for .NET Framework 4.8. + + +- In the .NET Framework 4.6 and later versions, the property returns the fixed version string `4.0.30319.42000`. In the .NET Framework 4, 4.5, 4.5.1, and 4.5.2, it returns version strings in the format `4.0.30319.xxxxx`, where `xxxxx` is less than 42000 (for example, "4.0.30319.18010"). Note that we do not recommend application code taking any new dependency on the Environment.Version property. + +For more information, see [How to: Determine which .NET Framework Versions Are Installed](~/docs/framework/migration-guide/how-to-determine-which-versions-are-installed.md). + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +In general, applications should depend on the recommended techniques for detecting such things as the runtime version of the .NET Framework and the installation directory: + +- To detect the runtime version of the .NET Framework, see [How to: Determine Which .NET Framework Versions Are Installed](~/docs/framework/migration-guide/how-to-determine-which-versions-are-installed.md). + +- To determine the installation path for the .NET Framework, use the value of the `InstallPath` entry in the `HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full` key. + +> [!IMPORTANT] +> The subkey name is `NET Framework Setup`, not `.NET Framework Setup`. + +- To determine the directory path to the .NET Framework common language runtime, call the method. + +- To get the CLR version, call the method. For the .NET Framework 4 and its point releases (the .NET Framework 4.5, 4.5.1, 4.5.2, and .NET Framework 4.6, 4.6.1, 4.6.2, 4.7, and 4.7.1), it returns the string v4.0.30319. + +### Affected APIs +* Not detectable via API analysis + +### Category +Setup and Deployment + + + + diff --git a/Documentation/compatibility/profiling-asp_net-mvc4-apps-can-lead-to-fatal-execution-engine-error.md b/Documentation/compatibility/profiling-asp_net-mvc4-apps-can-lead-to-fatal-execution-engine-error.md new file mode 100644 index 000000000..321550a71 --- /dev/null +++ b/Documentation/compatibility/profiling-asp_net-mvc4-apps-can-lead-to-fatal-execution-engine-error.md @@ -0,0 +1,32 @@ +## Profiling ASP.Net MVC4 apps can lead to Fatal Execution Engine Error + +### Scope +Edge + +### Version Introduced +4.5 + +### Version Reverted +4.5.2 + +### Source Analyzer Status +Not planned + +### Change Description +Profilers using NGEN /Profile assemblies may crash profiled ASP.NET MVC4 applications on startup with a 'Fatal Execution Engine Exception' + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This issue is fixed in the .NET Framework 4.5.2. Alternatively, the profiler may avoid this issue by specifying `COR_PRF_DISABLE_ALL_NGEN_IMAGES` in its event mask. + +### Affected APIs +* Not detectable via API analysis + +### Category +ASP.NET + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/793730/clr-profiler-crashes-any-asp-net-mvc4-app-on-startup-due-to-ngen-profile-images) + + diff --git a/Documentation/compatibility/reflection-objects-can-no-longer-be-passed-from-managed-code-to-out-of-process-dcom-clients.md b/Documentation/compatibility/reflection-objects-can-no-longer-be-passed-from-managed-code-to-out-of-process-dcom-clients.md new file mode 100644 index 000000000..209523ae3 --- /dev/null +++ b/Documentation/compatibility/reflection-objects-can-no-longer-be-passed-from-managed-code-to-out-of-process-dcom-clients.md @@ -0,0 +1,37 @@ +## Reflection objects can no longer be passed from managed code to out-of-process DCOM clients + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +Available + +### Change Description + +Reflection objects can no longer be passed from managed code to out-of-process +DCOM clients. The following types are affected: + +- +- (and its derived types, including , , , and ) +- +- +- . + +Calls to `IMarshal` for the object return `E_NOINTERFACE`. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Update marshaling code to work with non-reflection objects + +### Affected APIs +* Investigate applicable APIs + +### Category +Core + + diff --git a/Documentation/compatibility/remove-ssl3-from-the-wcf-transportdefaults.md b/Documentation/compatibility/remove-ssl3-from-the-wcf-transportdefaults.md new file mode 100644 index 000000000..81added02 --- /dev/null +++ b/Documentation/compatibility/remove-ssl3-from-the-wcf-transportdefaults.md @@ -0,0 +1,40 @@ +## Remove Ssl3 from the WCF TransportDefaults + +### Scope +Edge + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Planned + +### Change Description + +When using NetTcp with transport security and a credential type of certificate, +the SSL 3 protocol is no longer a default protocol used for negotiating a secure +connection. In most cases there should be no impact to existing apps as TLS 1.0 +has always been included in the protocol list for NetTcp. All existing clients +should be able to negotiate a connection using at least TLS1.0. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If Ssl3 is required, use one of the following configuration mechanisms to add +Ssl3 to the list of negotiated protocols. + +* +* +* [\ section of \](~/docs/framework/configure-apps/file-schema/wcf/transport-of-nettcpbinding.md) +* [\ section of \]~/docs/framework/configure-apps/file-schema/wcf/sslstreamsecurity.md) + +### Affected APIs +* `P:System.ServiceModel.Channels.SslStreamSecurityBindingElement.SslProtocols` +* `P:System.ServiceModel.TcpTransportSecurity.SslProtocols` + +### Category +Windows Communication Foundation (WCF) + + diff --git a/Documentation/compatibility/resgen-block-mark-of-the-web-content.md b/Documentation/compatibility/resgen-block-mark-of-the-web-content.md new file mode 100644 index 000000000..cabf932ac --- /dev/null +++ b/Documentation/compatibility/resgen-block-mark-of-the-web-content.md @@ -0,0 +1,33 @@ +## Resgen refuses to load content from the web + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +.resx files may contain binary formatted input. If you attempt to use resgen to load a file that was downloaded from an untrusted location, it will fail to load the input by default. + +- [x] Quirked +- [x] Build-time break + +### Recommended Action +Resgen users who require loading binary formatted input from untrusted locations can either remove the mark of the web from the input file or apply the opt-out quirk. + +Add the following registry setting to apply the machine wide opt-out quirk: +[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\SDK] +"AllowProcessOfUntrustedResourceFiles"="true" + +### Category +Core + + + + diff --git a/Documentation/compatibility/resolveassemblyreference-task-now-warns-of-dependencies-with-the-wrong-architecture.md b/Documentation/compatibility/resolveassemblyreference-task-now-warns-of-dependencies-with-the-wrong-architecture.md new file mode 100644 index 000000000..212cc9faa --- /dev/null +++ b/Documentation/compatibility/resolveassemblyreference-task-now-warns-of-dependencies-with-the-wrong-architecture.md @@ -0,0 +1,30 @@ +## ResolveAssemblyReference task now warns of dependencies with the wrong architecture + +### Scope +Minor + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Planned + +### Change Description +The task emits a warning, MSB3270, which indicates that a reference or any of its dependencies does not match the app's architecture. For example, this occurs if an app that was compiled with the `AnyCPU` option includes an x86 reference. Such a scenario could result in an app failure at run time (in this case, if the app is deployed as an x64 process). + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action +There are two areas of impact: + +* Recompilation generates warnings that did not appear when the app was compiled under a previous version of MSBuild. However, because the warning identifies a possible source of runtime failure, it should be investigated and addressed. +* If warnings are treated as errors, the app will fail to compile. + +### Affected APIs +* Not detectable via API analysis + +### Category +MSBuild + + diff --git a/Documentation/compatibility/ribbongroup-background-is-set-to-transparent-in-localized-builds.md b/Documentation/compatibility/ribbongroup-background-is-set-to-transparent-in-localized-builds.md new file mode 100644 index 000000000..678102375 --- /dev/null +++ b/Documentation/compatibility/ribbongroup-background-is-set-to-transparent-in-localized-builds.md @@ -0,0 +1,41 @@ +## RibbonGroup background is set to transparent in localized builds + +### Scope +Edge + +### Version Introduced +4.6.2 + +### Version Reverted +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description + + +background on localized builds was always painted with Transparent brush, +resulting in poor UI experience. This is fixed in .NET Framework 4.7 WPF fix by updating +the localized resources for +, which in +turn ensures that the correct brush is selected. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Upgrade to .NET Framework 4.7 + +### Affected APIs +Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/right-clicking-on-a-wpf-datagrid-row-header-changes-the-datagrid-selection.md b/Documentation/compatibility/right-clicking-on-a-wpf-datagrid-row-header-changes-the-datagrid-selection.md new file mode 100644 index 000000000..88c7eb929 --- /dev/null +++ b/Documentation/compatibility/right-clicking-on-a-wpf-datagrid-row-header-changes-the-datagrid-selection.md @@ -0,0 +1,38 @@ +## Right clicking on a WPF DataGrid row header changes the DataGrid selection + +### Scope +Edge + +### Version Introduced +4.5 + +### Version Reverted +4.6 + +### Source Analyzer Status +Planned + +### Change Description + +Right-clicking a selected + row header while +multiple rows are selected results in the 's selection changing to only +that row. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This issue has been fixed in the .NET Framework 4.6 and may be addressed by +upgrading to that version of the .NET Framework. + +### Affected APIs +* `M:System.Windows.Controls.DataGrid.#ctor` + +### Category +Windows Presentation Foundation (WPF) + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/1001771/right-clicking-on-wpf-data-grid-row-header-changes-selection) + + diff --git a/Documentation/compatibility/rsacng-now-correctly-loads-rsa-keys-of-non-standard-keysize.md b/Documentation/compatibility/rsacng-now-correctly-loads-rsa-keys-of-non-standard-keysize.md new file mode 100644 index 000000000..ba58e8d7f --- /dev/null +++ b/Documentation/compatibility/rsacng-now-correctly-loads-rsa-keys-of-non-standard-keysize.md @@ -0,0 +1,47 @@ +## RSACng now correctly loads RSA keys of non-standard key size + +### Scope +Edge + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Planned + +### Change Description + +In .NET Framework versions prior to 4.6.2, customers with non-standard key sizes +for RSA certificates are unable to access those keys via the + +and + +extension methods. A + +with the message "The requested key size is not supported" is thrown. In .NET +Framework 4.6.2 this issue has been fixed. Similarly, + +and + +now work with non-standard key sizes without throwing a . + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +If there is any exception handling logic that relies on the previous behavior +where a + +is thrown when non-standard key sizes are used, consider removing the logic. + +### Affected APIs +* `M:System.Security.Cryptography.RSA.ImportParameters(System.Security.Cryptography.RSAParameters)` +* `M:System.Security.Cryptography.RSACng.ImportParameters(System.Security.Cryptography.RSAParameters)` +* `M:System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPrivateKey(System.Security.Cryptography.X509Certificates.X509Certificate2)` +* `M:System.Security.Cryptography.X509Certificates.RSACertificateExtensions.GetRSAPublicKey(System.Security.Cryptography.X509Certificates.X509Certificate2)` + +### Category +Security + + diff --git a/Documentation/compatibility/rsacng_verifyhash-now-returns-false-for-any-verification-failure.md b/Documentation/compatibility/rsacng_verifyhash-now-returns-false-for-any-verification-failure.md new file mode 100644 index 000000000..08f164e7c --- /dev/null +++ b/Documentation/compatibility/rsacng_verifyhash-now-returns-false-for-any-verification-failure.md @@ -0,0 +1,42 @@ +## RSACng.VerifyHash now returns False for any verification failure + +### Scope +Minor + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Investigating + +### Change Description + +Starting with the .NET Framework 4.6.2, this method returns **False** if the +signature itself is badly formatted. It now returns false for any verification +failure. + +In the .NET Framework 4.6 and 4.6.1, the method throws a + +if the signature itself is badly formatted. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Any code whose execution depends on handling the + +should instead execute if validation fails and the method returns **False**. + +### Affected APIs +* `M:System.Security.Cryptography.RSACng.VerifyHash(System.Byte[],System.Byte[],System.Security.Cryptography.HashAlgorithmName,System.Security.Cryptography.RSASignaturePadding)` + +### Category +Security + + + + diff --git a/Documentation/compatibility/scrolling-a-wpf-treeview-or-grouped-listbox-in-a-virtualizingstackpanel-can-cause-a-hang.md b/Documentation/compatibility/scrolling-a-wpf-treeview-or-grouped-listbox-in-a-virtualizingstackpanel-can-cause-a-hang.md new file mode 100644 index 000000000..1fd71792c --- /dev/null +++ b/Documentation/compatibility/scrolling-a-wpf-treeview-or-grouped-listbox-in-a-virtualizingstackpanel-can-cause-a-hang.md @@ -0,0 +1,43 @@ +## Scrolling a WPF TreeView or grouped ListBox in a VirtualizingStackPanel can cause an application to become unresponsive + +### Scope +Major + +### Version Introduced +4.5 + +### Version Reverted +4.5.1 + +### Source Analyzer Status +Planned + +### Change Description + +In .NET Framework 4.5, scrolling a WPF + in a virtualized +stack panel can cause an application to become unresponsive if there are margins in the viewport (between the +items in the , for +example, or on an ItemsPresenter element). Additionally, in some cases, +different sized items in the view can cause instability even if there are no +margins. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This bug can be avoided by upgrading to .NET Framework 4.5.1. Alternatively, +margins can be removed from view collections (like +s) within +virtualized stack panels if all contained items are the same size. + +### Affected APIs +* `M:System.Windows.Controls.VirtualizingStackPanel.SetIsVirtualizing(System.Windows.DependencyObject,System.Boolean)` + +### Category +Windows Presentation Foundation (WPF) + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/763639/wpf-application-built-on-net-4-0-freezes-under-system-with-net-4-5-while-scrolling-the--under-specific-conditions) + + diff --git a/Documentation/compatibility/serialization-deserialization-of-mailmessage-objects.md b/Documentation/compatibility/serialization-deserialization-of-mailmessage-objects.md new file mode 100644 index 000000000..7019da700 --- /dev/null +++ b/Documentation/compatibility/serialization-deserialization-of-mailmessage-objects.md @@ -0,0 +1,33 @@ +## Deserialization of MailMessage objects serialized under the .NET Framework 4.5 may fail + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Investigating + +### Change Description +Starting with the .NET Framework 4.5, objects can include non-ASCII characters. In the .NET Framework 4, only ASCII characters are supported. objects that contain non-ASCII characters and that are serialized under the .NET Framework 4.5 or later cannot be deserialized under the .NET Framework 4. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Ensure that your code provides exception handling when deserializing a object. + +### Affected APIs + + +### Category +Networking + + + + diff --git a/Documentation/compatibility/serialization-of-control-characters-with-datacontractjsonserializer-is-now-compatible-with-ecmascript-v6-and-v8.md b/Documentation/compatibility/serialization-of-control-characters-with-datacontractjsonserializer-is-now-compatible-with-ecmascript-v6-and-v8.md new file mode 100644 index 000000000..95ad659b9 --- /dev/null +++ b/Documentation/compatibility/serialization-of-control-characters-with-datacontractjsonserializer-is-now-compatible-with-ecmascript-v6-and-v8.md @@ -0,0 +1,44 @@ +## Serialization of control characters with DataContractJsonSerializer is now compatible with ECMAScript V6 and V8 + +### Scope +Edge + +### Version Introduced +4.7 + +### Source Analyzer Status +Planned + +### Change Description + +In the .NET framework 4.6.2 and earlier versions, the + +did not serialize some special control characters, such as \b, \f, and \t, in a +way that was compatible with the ECMAScript V6 and V8 standards. Starting with +the .NET Framework 4.7, serialization of these control characters is compatible +with ECMAScript V6 and V8. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +For apps that target the .NET Framework 4.7, this feature is enabled by default. +If this behavior is not desirable, you can opt out of this feature by adding the +following line to the `` section of the app.config or web.config file: + + ```xml + + + + ``` + +### Affected APIs +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject(System.IO.Stream,System.Object)` +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject(System.Xml.XmlDictionaryWriter,System.Object)` +* `M:System.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject(System.Xml.XmlWriter,System.Object)` + +### Category +Windows Communication Foundation (WCF) + + diff --git a/Documentation/compatibility/servicepointmanager.securityprotocol-defaults-to-securityprotocoltype.systemdefault.md b/Documentation/compatibility/servicepointmanager.securityprotocol-defaults-to-securityprotocoltype.systemdefault.md new file mode 100644 index 000000000..a1bbf4244 --- /dev/null +++ b/Documentation/compatibility/servicepointmanager.securityprotocol-defaults-to-securityprotocoltype.systemdefault.md @@ -0,0 +1,41 @@ +## Default value of ServicePointManager.SecurityProtocol is SecurityProtocolType.System.Default + +### Scope +Minor + +### Version Introduced +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description +Starting with apps that target the .NET Framework 4.7, the default value of the property is . This change allows .NET Framework networking APIs based on SslStream (such as FTP, HTTPS, and SMTP) to inherit the default security protocols from the operating system instead of using hard-coded values defined by the .NET Framework. The default varies by operating system and any custom configuration performed by the system administrator. For information on the default SChannel protocol in each version of the Windows operating system, see [Protocols in TLS/SSL (Schannel SSP)](https://docs.microsoft.com/windows/desktop/SecAuthN/protocols-in-tls-ssl--schannel-ssp-).

+ +For applications that target an earlier version of the .NET Framework, the default value of the property depends on the version of the .NET Framework targeted. See the [Networking section of Retargeting Changes for Migration from .NET Framework 4.5.2 to 4.6](~/docs/framework/migration-guide/retargeting/4.5.2-4.6.md#networking) for more information. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +This change affects applications that target the .NET Framework 4.7 or later versions.
+ +If you prefer to use a defined protocol rather than relying on the system default, you can explicitly set the value of the property.
+ +If this change is undesirable, you can opt out of it by adding a configuration setting to the [``](~/docs/framework/configure-apps/file-schema/runtime/runtime-element.md) section of your application configuration file. The following example shows both the `` section and the `Switch.System.Net.DontEnableSystemDefaultTlsVersions` opt-out switch: + +```xml + + + +``` + +### Affected APIs +- `P:System.Net.ServicePointManager.SecurityProtocol` + +### Category +Networking + + + + diff --git a/Documentation/compatibility/sharing-session-state-with-asp_net-stateserver-requires-all-servers-in-the-web-farm-to-use-the-same-_net-framework-version.md b/Documentation/compatibility/sharing-session-state-with-asp_net-stateserver-requires-all-servers-in-the-web-farm-to-use-the-same-_net-framework-version.md new file mode 100644 index 000000000..460ffb3c3 --- /dev/null +++ b/Documentation/compatibility/sharing-session-state-with-asp_net-stateserver-requires-all-servers-in-the-web-farm-to-use-the-same-_net-framework-version.md @@ -0,0 +1,40 @@ +## Sharing session state with Asp.Net StateServer requires all servers in the web farm to use the same .NET Framework version + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +When enabling + +session state, all of the servers in the given web farm must use the same +version of the .NET Framework in order for state to be properly shared. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Be sure to upgrade .NET Framework versions on web servers that share state at +the same time. + +### Affected APIs +* `F:System.Web.SessionState.SessionStateMode.StateServer` + +### Category +ASP.NET + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/823803/asp-net-stateserver-requests-are-not-compatible-between-4-0-and-4-5-1-versions-of-net-framework) + + + + diff --git a/Documentation/compatibility/soapformatter-cannot-deserialize-hashtable-and-similar-ordered-collection-objects.md b/Documentation/compatibility/soapformatter-cannot-deserialize-hashtable-and-similar-ordered-collection-objects.md new file mode 100644 index 000000000..7b687eb5c --- /dev/null +++ b/Documentation/compatibility/soapformatter-cannot-deserialize-hashtable-and-similar-ordered-collection-objects.md @@ -0,0 +1,43 @@ +## SoapFormatter cannot deserialize Hashtable and similar ordered collection objects + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +The +does not guarantee that objects serialized under one .NET Framework version will +successfully deserialize under a different version. Specifically, some ordered +collections (like ) +added members between 4.0 and 4.5 such that objects of these types cannot +deserialize with .NET Framework 4.0 if they were serialized with .NET Framework 4.5. Note that if +the serialized data is both serialized and deserialized with the same .NET +Framework version, no issue will occur. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + + +serialization should be replaced with + +serialization or +to be resilient to .NET Framework changes. + +### Affected APIs +* `M:System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Serialize(System.IO.Stream,System.Object)` +* `M:System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Serialize(System.IO.Stream,System.Object,System.Runtime.Remoting.Messaging.Header[])` +* `M:System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(System.IO.Stream)` +* `M:System.Runtime.Serialization.Formatters.Soap.SoapFormatter.Deserialize(System.IO.Stream,System.Runtime.Remoting.Messaging.HeaderHandler)` + +### Category +Serialization + + diff --git a/Documentation/compatibility/some-_net-apis-cause-first-chance-(handled)-entrypointnotfoundexceptions.md b/Documentation/compatibility/some-_net-apis-cause-first-chance-(handled)-entrypointnotfoundexceptions.md new file mode 100644 index 000000000..8114ed2c1 --- /dev/null +++ b/Documentation/compatibility/some-_net-apis-cause-first-chance-(handled)-entrypointnotfoundexceptions.md @@ -0,0 +1,45 @@ +## Some .NET APIs cause first chance (handled) EntryPointNotFoundExceptions + +### Scope +Edge + +### Version Introduced +4.5 + +### Version Reverted +4.5.1 + +### Source Analyzer Status +Available + +### Change Description + +In the .NET Framework 4.5, a small number of .NET methods began throwing first +chance s. These +exceptions were handled within the .NET Framework, but could break test +automation that did not expect the first chance exceptions. These same APIs +break some ApiVerifier scenarios when HighVersionLie is enabled. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This bug can be avoided by upgrading to .NET Framework 4.5.1. Alternatively, +test automation can be updated to not break on first-chance +s. + +### Affected APIs +* `M:System.Diagnostics.Debug.Assert(System.Boolean)` +* `M:System.Diagnostics.Debug.Assert(System.Boolean,System.String)` +* `M:System.Diagnostics.Debug.Assert(System.Boolean,System.String,System.String)` +* `M:System.Diagnostics.Debug.Assert(System.Boolean,System.String,System.String,System.Object[])` +* `M:System.Xml.Serialization.XmlSerializer.#ctor(System.Type)` +* Investigate applicable APIs + +### Category +Core + +[More information](https://connect.microsoft.com/VisualStudio/feedback/details/732334/unable-to-find-an-entry-point-named-getcurrentpackageid-in-dll-kernel32-dll) + + diff --git a/Documentation/compatibility/some-workflow-drag-and-drop-apis-are-obsolete.md b/Documentation/compatibility/some-workflow-drag-and-drop-apis-are-obsolete.md new file mode 100644 index 000000000..8ef567ba1 --- /dev/null +++ b/Documentation/compatibility/some-workflow-drag-and-drop-apis-are-obsolete.md @@ -0,0 +1,34 @@ +## Some WorkFlow drag-and-drop APIs are obsolete + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description +This WorkFlow drag-and-drop API is obsolete and will cause compiler warnings if the app is rebuilt against 4.5. + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action + +New +APIs that support operations with multiple objects should be used instead. +Alternatively, the build warnings can be suppressed or they can be avoided by +using an older compiler. The APIs are still supported. + +### Affected APIs +* `M:System.Activities.Presentation.DragDropHelper.DoDragMove(System.Activities.Presentation.WorkflowViewElement,System.Windows.Point)` +* `M:System.Activities.Presentation.DragDropHelper.GetCompositeView(System.Windows.DragEventArgs)` +* `M:System.Activities.Presentation.DragDropHelper.GetDraggedModelItem(System.Windows.DragEventArgs)` +* `M:System.Activities.Presentation.DragDropHelper.GetDroppedObject(System.Windows.DependencyObject,System.Windows.DragEventArgs,System.Activities.Presentation.EditingContext)` + +### Category +Windows Workflow Foundation (WF) + + diff --git a/Documentation/compatibility/sql-server-database-connection-that-resolves-to-localhost.md b/Documentation/compatibility/sql-server-database-connection-that-resolves-to-localhost.md new file mode 100644 index 000000000..cccb03cf0 --- /dev/null +++ b/Documentation/compatibility/sql-server-database-connection-that-resolves-to-localhost.md @@ -0,0 +1,33 @@ +## Attempting a TCP/IP connection to a SQL Server database that resolves to `localhost` fails + +### Scope +Minor + +### Version Introduced +4.6 + +### Version Reverted +4.6.2 + +### Source Analyzer Status +NotPlanned + +### Change Description + +In the .NET Framework 4.6 and 4.6.1, attempting a TCP/IP connection to a SQL Server database that resolves to `localhost` fails with the error, "A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified)" + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This issue has been addressed and the previous behavior restored in the .NET Framework 4.6.2. To connect to a SQL Server databsae that resolves to `localhost`, upgrade to the .NET Framework 4.6.2. + +### Affected APIs +* Not detectable via API analysis + +### Category +Data + + + diff --git a/Documentation/compatibility/sql_variant-data-uses-sql_variant-collation-rather-than-database-collation.md b/Documentation/compatibility/sql_variant-data-uses-sql_variant-collation-rather-than-database-collation.md new file mode 100644 index 000000000..2e27f7223 --- /dev/null +++ b/Documentation/compatibility/sql_variant-data-uses-sql_variant-collation-rather-than-database-collation.md @@ -0,0 +1,27 @@ +## Sql_variant data uses sql_variant collation rather than database collation + +### Scope +Transparent + +### Version Introduced +4.5 + +### Source Analyzer Status +Not planned + +### Change Description +`sql_variant` data uses `sql_variant` collation rather than database collation. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This change addresses possible data corruption if the database collation differs from the `sql_variant` collation. Applications that rely on the corrupted data may experience failure. + +### Affected APIs +* Not detectable via API analysis + +### Category +Data + + diff --git a/Documentation/compatibility/sqlbulkcopy-uses-destination-column-encoding-for-strings.md b/Documentation/compatibility/sqlbulkcopy-uses-destination-column-encoding-for-strings.md new file mode 100644 index 000000000..f4127e57b --- /dev/null +++ b/Documentation/compatibility/sqlbulkcopy-uses-destination-column-encoding-for-strings.md @@ -0,0 +1,41 @@ +## SqlBulkCopy uses destination column encoding for strings + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +When inserting data into a column, + uses the encoding +of the destination column rather than the default encoding for `VARCHAR` and +`CHAR` types. This change eliminates the possibility of data corruption caused +by using the default encoding when the destination column does not use the +default encoding. In rare cases, an existing application may throw a +SqlException exception if the change in encoding produces data that is too big +to fit into the destination column. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Expect that will +no longer corrupt data due to encoding differences. If strings near the +destination column's size limit are being copied, it may be necessary to either +pre-encode data (to be copied to check that the data will fit in the destination +column) or catch s. + +### Affected APIs +* `T:System.Data.SqlClient.SqlBulkCopy` +* `M:System.Data.SqlClient.SqlBulkCopy.#ctor(System.Data.SqlClient.SqlConnection)` + +### Category +Data + + diff --git a/Documentation/compatibility/sqlconnection-can-no-longer-connect-to-sql-server-1997-or-databases-using-the-via-adapter.md b/Documentation/compatibility/sqlconnection-can-no-longer-connect-to-sql-server-1997-or-databases-using-the-via-adapter.md new file mode 100644 index 000000000..85970dd07 --- /dev/null +++ b/Documentation/compatibility/sqlconnection-can-no-longer-connect-to-sql-server-1997-or-databases-using-the-via-adapter.md @@ -0,0 +1,32 @@ +## SqlConnection can no longer connect to SQL Server 1997 or databases using the VIA adapter + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description +Connections to SQL Server databases using the [Virtual Interface Adapter (VIA) protocol](https://technet.microsoft.com/library/ms191229%28v=sql.105%29.aspx) are no longer supported. +The protocol used to connect to a SQL Server database is visible in the connection string. A VIA connection will contain via:\. +If this app is connecting to SQL via a protocol other than VIA (tcp: or np: for example), then no breaking change will be encountered. + +Also, connections to SQL Server 7 (1997) are no longer supported. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +The VIA protocol is deprecated, so an alternative protocol should be used to connect to SQL databases. The most common protocol used is TCP/IP. For more information about connecting through TCP/IP, see [Enable the TCP/IP protocol for a database instance](https://docs.microsoft.com/previous-versions/visualstudio/visual-studio-2008/bb909712(v=vs.90)). If the database is only accessed from within an intranet, the shared pipes protocol may provide better performance if the network is slow. + +### Affected APIs +* `M:System.Data.SqlClient.SqlConnection.#ctor(System.String)` +* `M:System.Data.SqlClient.SqlConnection.#ctor(System.String,System.Data.SqlClient.SqlCredential)` + +### Category +Data + + diff --git a/Documentation/compatibility/sqlconnection_open-fails-on-windows-7-with-non-ifs-winsock-bsp-or-lsp-present.md b/Documentation/compatibility/sqlconnection_open-fails-on-windows-7-with-non-ifs-winsock-bsp-or-lsp-present.md new file mode 100644 index 000000000..9b31f6df2 --- /dev/null +++ b/Documentation/compatibility/sqlconnection_open-fails-on-windows-7-with-non-ifs-winsock-bsp-or-lsp-present.md @@ -0,0 +1,46 @@ +## SqlConnection.Open fails on Windows 7 with non-IFS Winsock BSP or LSP present + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.5.2 + +### Source Analyzer Status +Planned + +### Change Description + + and + +fail in the .NET Framework 4.5 if running on a Windows 7 machine with a non-IFS +Winsock BSP or LSP are present on the computer. + +To determine whether a non-IFS BSP or LSP is installed, use the `netsh WinSock +Show Catalog` command, and examine every `Winsock Catalog Provider Entry` item +that is returned. If the Service Flags value has the `0x20000` bit set, the +provider uses IFS handles and will work correctly. If the `0x20000` bit is clear +(not set), it is a non-IFS BSP or LSP. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This bug has been fixed in the .NET Framework 4.5.2, so it can be avoided by +upgrading the .NET Framework. Alternatively, it can be avoided by removing any +installed non-IFS Winsock LSPs. + +### Affected APIs +* `M:System.Data.SqlClient.SqlConnection.Open` +* `M:System.Data.SqlClient.SqlConnection.OpenAsync(System.Threading.CancellationToken)` + +### Category +Data + +[More information](https://connect.microsoft.com/VisualStudio/feedback/details/729323) + + diff --git a/Documentation/compatibility/sslstream-support-for-tls-alerts.md b/Documentation/compatibility/sslstream-support-for-tls-alerts.md new file mode 100644 index 000000000..a317d283f --- /dev/null +++ b/Documentation/compatibility/sslstream-support-for-tls-alerts.md @@ -0,0 +1,88 @@ +## SslStream supports TLS Alerts + +### Scope +Edge + +### Version Introduced +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description + +After a failed TLS handshake, an + with an inner + exception will +be thrown by the first I/O Read/Write operation. The + +code for the +can be mapped to the TLS Alert from the remote party using the +[Schannel error codes for TLS and SSL alerts](https://docs.microsoft.com/windows/desktop/SecAuthN/schannel-error-codes-for-tls-and-ssl-alerts). + +For more information, see +[RFC 2246: Section 7.2.2 Error alerts](https://tools.ietf.org/html/rfc2246#section-7.2.2).
+ +The behavior in .NET Framework 4.6.2 and earlier is that the transport channel (usually TCP +connection) will timeout during either Write or Read if the other party failed +the handshake and immediately afterwards rejected the connection. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +Applications calling network I/O APIs such as / +should handle or +.
+ +The TLS Alerts feature is enabled by default starting with .NET Framework 4.7. +Applications targeting versions of the .NET Framework from 4.0 through 4.6.2 running on a .NET Framework 4.7 or higher +system will have the feature disabled to preserve compatibility.
+ +The following configuration API is available to enable or disable the feature +for .NET Framework 4.6 and later applications running on .NET Framework 4.7 or later. + +- Programmatically: + + Must be the very first thing the application does since ServicePointManager will initialize only once: +   + ```csharp + AppContext.SetSwitch("TestSwitch.LocalAppContext.DisableCaching", true); + AppContext.SetSwitch("Switch.System.Net.DontEnableTlsAlerts", true); // Set to 'false' to enable the feature in .NET Framework 4.6 - 4.6.2. + ``` + +- AppConfig: + + ```xml + + + + + ``` + +- Registry key (machine global): + + Set the Value to `false` to enable the feature in .NET Framework 4.6 - 4.6.2. + + - Key: HKLM\SOFTWARE\Wow6432Node\Microsoft\\.NETFramework\AppContext\Switch.System.Net.DontEnableTlsAlerts + - Type: String + - Value: "true" + +### Affected APIs +* `T:System.Net.Security.SslStream` +* `T:System.Net.WebRequest` +* `T:System.Net.HttpWebRequest` +* `T:System.Net.FtpWebRequest` +* `T:System.Net.Mail.SmtpClient` +* `N:System.Net.Http` + +### Category +Networking +Security + + + + diff --git a/Documentation/compatibility/system_activities-is-now-aptca.md b/Documentation/compatibility/system_activities-is-now-aptca.md new file mode 100644 index 000000000..a95925146 --- /dev/null +++ b/Documentation/compatibility/system_activities-is-now-aptca.md @@ -0,0 +1,33 @@ +## System.Activities is now APTCA + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +The assembly is marked with the attribute. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Derived classes cannot be marked with the +. +Previously, derived types had to be marked with the +. However, +this change should have no real impact. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Workflow Foundation (WF) + + diff --git a/Documentation/compatibility/system_net_peertopeer_collaboration-unavailable-on-windows-8.md b/Documentation/compatibility/system_net_peertopeer_collaboration-unavailable-on-windows-8.md new file mode 100644 index 000000000..bcf250ebe --- /dev/null +++ b/Documentation/compatibility/system_net_peertopeer_collaboration-unavailable-on-windows-8.md @@ -0,0 +1,28 @@ +## System.Net.PeerToPeer.Collaboration unavailable on Windows 8 + +### Scope +Major + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +The System.Net.PeerToPeer.Collaboration namespace is unavailable on Windows 8 or above. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Apps that support Windows 8 or above must be updated to not depend on this namespace or its members. + +### Affected APIs +* `N:System.Net.PeerToPeer.Collaboration` + +### Category +Networking + + diff --git a/Documentation/compatibility/system_servicemodel_web_webservicehost-object-no-longer-adds-a-default-endpoint.md b/Documentation/compatibility/system_servicemodel_web_webservicehost-object-no-longer-adds-a-default-endpoint.md new file mode 100644 index 000000000..72f834f8b --- /dev/null +++ b/Documentation/compatibility/system_servicemodel_web_webservicehost-object-no-longer-adds-a-default-endpoint.md @@ -0,0 +1,50 @@ +## System.ServiceModel.Web.WebServiceHost object no longer adds a default endpoint + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +The +object no longer adds a default endpoint if an explicit endpoint has been added +by application code. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If users will expect to be able to connect to a default endpoint and other +explicit endpoints have been added to the +, default +endpoints should also be added explicitly (using ). + +### Affected APIs +* `M:System.ServiceModel.ServiceHost.AddServiceEndpoint(System.Type,System.ServiceModel.Channels.Binding,System.String)` +* `M:System.ServiceModel.ServiceHost.AddServiceEndpoint(System.Type,System.ServiceModel.Channels.Binding,System.Uri)` +* `M:System.ServiceModel.ServiceHost.AddServiceEndpoint(System.Type,System.ServiceModel.Channels.Binding,System.String,System.Uri)` +* `M:System.ServiceModel.ServiceHost.AddServiceEndpoint(System.Type,System.ServiceModel.Channels.Binding,System.Uri,System.Uri)` +* `M:System.ServiceModel.ServiceHost.AddServiceEndpoint(System.Type,System.ServiceModel.Channels.Binding,System.Uri,System.Uri)` +* `M:System.ServiceModel.ServiceHostBase.AddServiceEndpoint(System.ServiceModel.Description.ServiceEndpoint)` +* `M:System.ServiceModel.ServiceHostBase.AddServiceEndpoint(System.String,System.ServiceModel.Channels.Binding,System.String)` +* `M:System.ServiceModel.ServiceHostBase.AddServiceEndpoint(System.String,System.ServiceModel.Channels.Binding,System.Uri)` +* `M:System.ServiceModel.ServiceHostBase.AddServiceEndpoint(System.String,System.ServiceModel.Channels.Binding,System.String,System.Uri)` +* `M:System.ServiceModel.ServiceHostBase.AddServiceEndpoint(System.String,System.ServiceModel.Channels.Binding,System.Uri,System.Uri)` + +### Category +Windows Communication Foundation (WCF) + + + + diff --git a/Documentation/compatibility/system_threading_monitor_lock_acquisition_scalability_improvement.md b/Documentation/compatibility/system_threading_monitor_lock_acquisition_scalability_improvement.md new file mode 100644 index 000000000..de0f7f35e --- /dev/null +++ b/Documentation/compatibility/system_threading_monitor_lock_acquisition_scalability_improvement.md @@ -0,0 +1,49 @@ +## System.Threading.Monitor lock acquision scalability improvement + +### Scope + +Transparent + +### Version Introduced +4.8 + +### Source Analyzer Status + +NotPlanned + +### Change Description + +In applications running on .NET Framework 4.7.2 and earlier versions, when a thread, `T`, cannot acquire a lock, and other threads are also waiting to acquire it, thread `T` performs a spin-wait that may make it more difficult for other threads to acquire the lock. This behavior can cause a positive feedback loop that leads to a perpetual lock convoy. + +Starting with applications running on the .NET Framework 4.8, a thread attempting to acquire a lock when there is a waiter present skips the portion of spin-waiting that makes it more difficult for other threads to acquire the lock. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +For applications running on the .NET Framework 4.8, the spin-waiting behavior described above can be reverted to the behavior in .NET Framework 4.7.2 in one of the following ways: + +By setting the following environment variable before starting the process: + `COMPlus_Monitor_SpinWithoutSleepWhenWaiterIsPresent=1` + +By including the runtime configuration option in .exe.config. Example: + ```xml + + + + + + + ``` + +### Affected APIs + +* `M:System.Threading.Monitor.Enter(System.Object)` +* `M:System.Threading.Monitor.Enter(System.Object,System.Boolean)` +* `M:System.Threading.Monitor.TryEnter(System.Object) +* `M:System.Threading.Monitor.TryEnter(System.Object,System.Boolean@) +* `M:System.Threading.Monitor.TryEnter(System.Object,System.Int32) +* `M:System.Threading.Monitor.TryEnter(System.Object,System.Int32,System.Boolean@) +* `M:System.Threading.Monitor.TryEnter(System.Object,System.TimeSpan) +* `M:System.Threading.Monitor.TryEnter(System.Object,System.TimeSpan,System.Boolean@) diff --git a/Documentation/compatibility/system_threading_tasks_task-no-longer-throw-objectdisposedexception-after-object-is-disposed.md b/Documentation/compatibility/system_threading_tasks_task-no-longer-throw-objectdisposedexception-after-object-is-disposed.md new file mode 100644 index 000000000..9137707a4 --- /dev/null +++ b/Documentation/compatibility/system_threading_tasks_task-no-longer-throw-objectdisposedexception-after-object-is-disposed.md @@ -0,0 +1,42 @@ +## System.Threading.Tasks.Task no longer throw ObjectDisposedException after object is disposed + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Except for +, + methods no longer throw +an exception after +the object is disposed. + +This change supports the use of cached tasks. For example, a method can return a +cached task to represent an already completed operation instead of allocating a +new task. This was impossible in previous .NET Framework versions, because any +consumer of the task could dispose of it, which rendered it unusable. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Be aware that Task methods may no longer throw + in cases when the +object is disposed. If an app was depending on this exception to know that a +task was disposed, it should be updated to explicitly check the task's status +using . + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + diff --git a/Documentation/compatibility/system_threading_timer_lock_contention_improvement.md b/Documentation/compatibility/system_threading_timer_lock_contention_improvement.md new file mode 100644 index 000000000..3b2fdb074 --- /dev/null +++ b/Documentation/compatibility/system_threading_timer_lock_contention_improvement.md @@ -0,0 +1,30 @@ +## System.Threading.Timer lock contention improvement + +### Scope + +Transparent + +### Version Introduced +4.8 + +### Source Analyzer Status + +NotPlanned + +### Change Description + +Timers use a lock, and multiple timers can contend with one another for a lock, which can result in excessive CPU usage. + +For apps that run under .NET Framework 4.8, an opt-in configuration section may reduce the impact of timers contending for a lock. This change is especially important for high-performance applications. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Applications running on .NET Framework 4.8 can opt into this change by setting the following [`AppContext` switch](https://docs.microsoft.com/dotnet/api/system.appcontext?view=netframework-4.7.2#appcontext-for-library-consumers): + `Switch.System.Threading.UseNetCoreTimer=true` + +### Affected APIs + +* `T:System.Threading.Timer` diff --git a/Documentation/compatibility/system_uri-escaping-now-supports-rfc-3986.md b/Documentation/compatibility/system_uri-escaping-now-supports-rfc-3986.md new file mode 100644 index 000000000..e31281173 --- /dev/null +++ b/Documentation/compatibility/system_uri-escaping-now-supports-rfc-3986.md @@ -0,0 +1,37 @@ +## System.Uri escaping now supports RFC 3986 + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +URI escaping has changed in .NET Framework 4.5 to support +[RFC 3986](https://tools.ietf.org/html/rfc3986). Specific changes include: + +- escapes reserved characters based on RFC 3986. +- does not escape reserved characters. +- does not throw an exception if it encounters an invalid escape sequence. +- Unreserved escaped characters are un-escaped. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +* Update applications to not rely on to throw in the case of an invalid escape sequence. Such sequences must be detected directly now. +* Similarly, expect that Escaped and Unescaped URI and Data strings may vary from .NET Framework 4.0 and .NET Framework 4.5 and should not be compared across .NET versions directly. Instead, they should be parsed and normalized in a single .NET version before any comparisons are made. + +### Affected APIs +* `M:System.Uri.EscapeDataString(System.String)` +* `M:System.Uri.EscapeUriString(System.String)` +* `M:System.Uri.UnescapeDataString(System.String)` + +### Category +Core + + diff --git a/Documentation/compatibility/system_uri-parsing-adheres-to-rfc-3987.md b/Documentation/compatibility/system_uri-parsing-adheres-to-rfc-3987.md new file mode 100644 index 000000000..01f4490c8 --- /dev/null +++ b/Documentation/compatibility/system_uri-parsing-adheres-to-rfc-3987.md @@ -0,0 +1,49 @@ +## System.Uri parsing adheres to RFC 3987 + +### Scope +Major + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +URI parsing has changed in several ways in .NET Framework 4.5. Note, however, that these +changes only affect code targeting .NET Framework 4.5. If a binary targets .NET Framework 4.0, the +old behavior will be observed. Changes to URI parsing in .NET Framework 4.5 include: + +- URI parsing will perform normalization and character checking according to the latest IRI rules in RFC 3987. +- Unicode normalization form C will only be performed on the host portion of the URI. +- Invalid mailto: URIs will now cause an exception. +- Trailing dots at the end of a path segment are now preserved. +- `file://` URIs do not escape the `?` character. +- Unicode control characters `U+0080` through `U+009F` are not supported. +- Comma characters `,` or `%2c` are not automatically unescaped. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +If the old .NET Framework 4.0 URI parsing semantics are necessary (they often aren't), +they can be used by targeting .NET Framework 4.0. This can be accomplished by using a + +on the assembly, or through Visual Studio's project system UI in the 'project +properties' page. + +### Affected APIs +* `M:System.Uri.#ctor(System.String)` +* `M:System.Uri.#ctor(System.String,System.Boolean)` +* `M:System.Uri.#ctor(System.String,System.UriKind)` +* `M:System.Uri.#ctor(System.Uri,System.String)` +* `M:System.Uri.TryCreate(System.String,System.UriKind,System.Uri@)` +* `M:System.Uri.TryCreate(System.Uri,System.String,System.Uri@)` +* `M:System.Uri.TryCreate(System.Uri,System.Uri,System.Uri@)` + +### Category +Core + + diff --git a/Documentation/compatibility/system_uri_iswellformeduristring-method-returns-false-for-relative-uris-with-a-colon-char-in-first-segment.md b/Documentation/compatibility/system_uri_iswellformeduristring-method-returns-false-for-relative-uris-with-a-colon-char-in-first-segment.md new file mode 100644 index 000000000..fd5025c42 --- /dev/null +++ b/Documentation/compatibility/system_uri_iswellformeduristring-method-returns-false-for-relative-uris-with-a-colon-char-in-first-segment.md @@ -0,0 +1,42 @@ +## System.Uri.IsWellFormedUriString method returns false for relative URIs with a colon char in first segment + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +Beginning with the .NET Framework 4.5, + +will treat relative URIs with a `:` in their first segment as not well formed. +This is a change from + +behavior in the .NET Framework 4.0 that was made to conform to RFC3986. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +This change (like many other URI changes) will only affect applications +targeting the .NET Framework 4.5 (or later). To keep using the old behavior, +target the app against the .NET Framework 4.0. Alternatively, scan URI's prior +to calling + +looking for `:` characters that you may want to remove for validation purposes, +if the old behavior is desirable. + +### Affected APIs +* `M:System.Uri.IsWellFormedUriString(System.String,System.UriKind)` + +### Category +Core + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/788841/net-4-5-system-uri-iswellformeduristring-method-returns-false-for-relative-uris-with-a-colon-char-in-first-segment) + + diff --git a/Documentation/compatibility/targetframeworkname-for-default-app-domain-no-longer-defaults-to-null-if-not-set.md b/Documentation/compatibility/targetframeworkname-for-default-app-domain-no-longer-defaults-to-null-if-not-set.md new file mode 100644 index 000000000..1cad31c78 --- /dev/null +++ b/Documentation/compatibility/targetframeworkname-for-default-app-domain-no-longer-defaults-to-null-if-not-set.md @@ -0,0 +1,41 @@ +## TargetFrameworkName for default app domain no longer defaults to null if not set + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +Planned + +### Change Description + +The was +previously null in the default app domain, unless it was explicitly set. +Beginning in 4.6, the + property +for the default app domain will have a default value derived from the +TargetFrameworkAttribute (if one is present). Non-default app domains will +continue to inherit their + from the +default app domain (which will not default to null in 4.6) unless it is +explicitly overridden. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Code should be updated to not depend on + +defaulting to null. If it is required that this property continue to evaluate to +null, it can be explicitly set to that value. + +### Affected APIs +* `M:System.AppDomainSetup.get_TargetFrameworkName` + +### Category +Core + + diff --git a/Documentation/compatibility/the-_net-framework-4_6-does-not-use-a-4_5_x_x-version-when-registering-itself-in-the-registry.md b/Documentation/compatibility/the-_net-framework-4_6-does-not-use-a-4_5_x_x-version-when-registering-itself-in-the-registry.md new file mode 100644 index 000000000..d63f0871f --- /dev/null +++ b/Documentation/compatibility/the-_net-framework-4_6-does-not-use-a-4_5_x_x-version-when-registering-itself-in-the-registry.md @@ -0,0 +1,29 @@ +## The .NET Framework 4.6 does not use a 4.5.x.x version when registering itself in the registry + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +Not planned + +### Change Description +As one might expect, the version key set in the registry (at `HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\NET Framework Setup\NDP\v4\Full`) for the .NET Framework 4.6 begins with '4.6', not '4.5'. Apps that depend on these registry keys to know which .NET Framework versions are installed on a machine should be updated to understand that 4.6 is a new possible version, and one that is compatible with previous 4.5.x releases. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Update apps probing for a .NET Framework 4.5 install by looking for 4.5 registry keys to also accept 4.6. + +### Affected APIs +* Not detectable via API analysis + +### Category +Setup and Deployment + +[More information](~/docs/framework/migration-guide/mitigation-product-versioning.md) + + diff --git a/Documentation/compatibility/the-replace-method-in-odata-urls-is-disabled-by-default.md b/Documentation/compatibility/the-replace-method-in-odata-urls-is-disabled-by-default.md new file mode 100644 index 000000000..af0f75236 --- /dev/null +++ b/Documentation/compatibility/the-replace-method-in-odata-urls-is-disabled-by-default.md @@ -0,0 +1,35 @@ +## The Replace method in OData URLs is disabled by default + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Beginning in the .NET Framework 4.5, the Replace method in OData URLs is +disabled by default. When OData Replace is disabled (now by default), any user +requests including replace functions (which are uncommon) will fail. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If the replace method is required (which is uncommon), it can be re-enabled +through a config settings +(). +However, an enabled replace method can open security vulnerabilities and should +only be used after careful review. + +### Affected APIs +* ``T:System.Data.Services.DataService`1`` + +### Category +Windows Communication Foundation (WCF) + + diff --git a/Documentation/compatibility/throttle-concurrent-requests-per-session.md b/Documentation/compatibility/throttle-concurrent-requests-per-session.md new file mode 100644 index 000000000..2fbf1eec2 --- /dev/null +++ b/Documentation/compatibility/throttle-concurrent-requests-per-session.md @@ -0,0 +1,33 @@ +## Throttle concurrent requests per session + +### Scope +Edge + +### Version Introduced +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description +In the .NET Framework 4.6.2 and earlier, ASP.NET executes requests with the same Sessionid sequentially, and ASP.NET always issues the Sessionid through cookies by default. If a page takes a long time to respond, it will significantly degrade server performance just by pressing F5 on the browser. In the fix, we added a counter to track the queued requests and terminate the requests when they exceed a specified limit. The default value is 50. If the limit is reached, a warning will be logged in the event log, and an HTTP 500 response may be recorded in the IIS log. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +To restore the old behavior, you can add the following setting to your web.config file to opt out of the new behavior. + +```xml + + + +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +ASP.NET + + diff --git a/Documentation/compatibility/tls-1-x-by-default-passes-sch-send-aux-record-flag-to-the-underlying-schannel-api.md b/Documentation/compatibility/tls-1-x-by-default-passes-sch-send-aux-record-flag-to-the-underlying-schannel-api.md new file mode 100644 index 000000000..886158526 --- /dev/null +++ b/Documentation/compatibility/tls-1-x-by-default-passes-sch-send-aux-record-flag-to-the-underlying-schannel-api.md @@ -0,0 +1,49 @@ +## TLS 1.x by default passes the SCH_SEND_AUX_RECORD flag to the underlying SCHANNEL API + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +NotPlanned + +### Change Description + +When using TLS 1.x, the .NET Framework relies on the underlying Windows SCHANNEL API. Starting with .NET Framework 4.6, the [`SCH_SEND_AUX_RECORD`](https://docs.microsoft.com/windows/desktop/api/schannel/ns-schannel-_schannel_cred) flag is passed by default to SCHANNEL. This causes SCHANNEL to split data to be encrypted into two separate records, the first as a single byte and the second as *n*-1 bytes. + +In rare cases, this breaks communication between clients and existing servers that make the assumption that the data resides in a single record. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +If this change breaks communication with an existing server, you can disable sending the [`SCH_SEND_AUX_RECORD`](https://docs.microsoft.com/windows/desktop/api/schannel/ns-schannel-_schannel_cred) flag and restore the previous behavior of not splitting data into separate records by adding the following switch to the [\](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) element in the [\](~/docs/framework/configure-apps/file-schema/runtime/runtime-element.md) section of your app configuration file: + +```xml + + + +``` + +> [!IMPORTANT] +> This setting is provided for backward compatibility only. Its use is otherwise not recommended. + +### Affected APIs +* `T:System.Net.Security.SslStream` +* `T:System.Net.ServicePointManager` +* `T:System.Net.Http.HttpClient` +* `T:System.Net.Mail.SmtpClient` +* `T:System.Net.HttpWebRequest` +* `T:System.Net.FtpWebRequest` + +### Category +Networking + + + diff --git a/Documentation/compatibility/two-way-data-binding-to-a-property-with-a-non-public-setter-is-not-supported.md b/Documentation/compatibility/two-way-data-binding-to-a-property-with-a-non-public-setter-is-not-supported.md new file mode 100644 index 000000000..ad3922188 --- /dev/null +++ b/Documentation/compatibility/two-way-data-binding-to-a-property-with-a-non-public-setter-is-not-supported.md @@ -0,0 +1,44 @@ +## Two-way data-binding to a property with a non-public setter is not supported + +### Scope +Minor + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Planned + +### Change Description + +Attempting to data bind to a property without a public setter has never been a +supported scenario. Beginning in the .NET Framework 4.5.1, this scenario will +throw an . Note that +this new exception will only be thrown for apps that specifically target the +.NET Framework 4.5.1. If an app targets the .NET Framework 4.5, the call will be +allowed. If the app does not target a particular .NET Framework version, the +binding will be treated as one-way. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +The app should be updated to either use one-way binding, or expose the +property's setter publicly. Alternatively, targeting the .NET Framework 4.5 will +cause the app to exhibit the old behavior. + +### Affected APIs +* `F:System.Windows.Data.BindingMode.TwoWay` + +### Category +Windows Presentation Foundation (WPF) + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/773682/wpf-property-with-private-setter-is-updated-by-a-twoway-binding) + + + + diff --git a/Documentation/compatibility/type_isassignablefrom-returns-wrong-result-for-generic-variables-with-constraints.md b/Documentation/compatibility/type_isassignablefrom-returns-wrong-result-for-generic-variables-with-constraints.md new file mode 100644 index 000000000..590f91e43 --- /dev/null +++ b/Documentation/compatibility/type_isassignablefrom-returns-wrong-result-for-generic-variables-with-constraints.md @@ -0,0 +1,45 @@ +## Type.IsAssignableFrom returns wrong result for generic variables with constraints + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +In the .NET Framework 4.5, + +will incorrectly return `false` in all cases for some generic types with +constraints. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This issue was fixed in a servicing update. Update the .NET Framework +4.5, or upgrade to .NET Framework 4.5.1 or later, to fix this issue. +Alternatively, avoid using IsAssignableFrom with generic types that have +constraints on generic parameters. Reflection APIs can be used as a work-around. + +### Affected APIs +* `M:System.Type.IsAssignableFrom(System.Type)` + +### Category +Core + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/760270/type-isassignablefrom-for-type-parameters-is-broken) + + + + diff --git a/Documentation/compatibility/unexpected-invalidcastexception-from-invokemethod-activity-in-wf4.md b/Documentation/compatibility/unexpected-invalidcastexception-from-invokemethod-activity-in-wf4.md new file mode 100644 index 000000000..44a946a0e --- /dev/null +++ b/Documentation/compatibility/unexpected-invalidcastexception-from-invokemethod-activity-in-wf4.md @@ -0,0 +1,43 @@ +## Unexpected InvalidCastException from InvokeMethod activity in WF4 + +### Scope +Minor + +### Version Introduced +4.5 + +### Version Reverted +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +Using a + that +targets a method with a nullable parameter can throw an +. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This behavior was reverted in a .NET Framework 4.5 servicing release. Update the .NET Framework 4.5 (or upgrade to .NET Framework 4.5.1 or later) to +fix the issue. + +### Affected APIs +* `P:System.Activities.Statements.InvokeMethod.Parameters` + +### Category +Windows Workflow Foundation (WF) + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/758736/unexpected-invalidcastexception-from-invokemethod-activity-in-wf4-after-net-4-5-install) + + + + diff --git a/Documentation/compatibility/unicode-data-now-support-standard-v8_0-categories.md b/Documentation/compatibility/unicode-data-now-support-standard-v8_0-categories.md new file mode 100644 index 000000000..b9eb03113 --- /dev/null +++ b/Documentation/compatibility/unicode-data-now-support-standard-v8_0-categories.md @@ -0,0 +1,37 @@ +## Unicode standard version 8.0 categories now supported + +### Scope +Minor + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Planned + +### Change Description +In .NET Framework 4.6.2, Unicode data has been +upgraded from Unicode Standard version 6.3 to version 8.0. When +requesting Unicode character categories in .NET Framework 4.6.2, some +results might not match the results in previous .NET Framework +versions. This change mostly affects Cherokee syllables and New Tai +Lue vowels signs and tone marks. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Review code and remove/change logic that depends on hard-coded Unicode +character categories. + +### Affected APIs +* `M:System.Char.GetUnicodeCategory(System.Char)` +* `M:System.Globalization.CharUnicodeInfo.GetUnicodeCategory(System.Char)` +* `M:System.Globalization.CharUnicodeInfo.GetUnicodeCategory(System.String,System.Int32)` + +### Category +Globalization + +[More information](https://github.com/Microsoft/dotnet/blob/master/releases/net462/dotnet462-changes.md) + + diff --git a/Documentation/compatibility/uri-reserved-characters-consistent.md b/Documentation/compatibility/uri-reserved-characters-consistent.md new file mode 100644 index 000000000..92b45fcc6 --- /dev/null +++ b/Documentation/compatibility/uri-reserved-characters-consistent.md @@ -0,0 +1,45 @@ +## Ensure System.Uri uses a consistent reserved character set + +### Scope +Minor + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +In , certain percent-encoded characters that were sometimes decoded are now consistently left encoded. This occurs across the properties and methods that access the path, query, fragment, or userinfo components of the URI. +The behavior will change only when both of the following are true: + - The URI contains the encoded form of any of the following reserved characters: `:`, `'`, `(`, `)`, `!` or `*`. + - The URI contains a Unicode or encoded non-reserved character. +If both of the above are true, the encoded reserved characters are left encoded. In previous versions of the .NET Framework, they are decoded. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +For applications that target versions of .NET Framework starting with 4.7.2, the new decoding behavior is enabled by default. If this change is undesirable, you can disable it by adding the following [AppContextSwitchOverrides](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) switch to the `` section of the application configuration file: +```xml + + + +``` +For applications that target earlier versions of the .NET Framework but are running under versions starting with .NET Framework 4.7.2, the new decoding behavior is disabled by default. You can enable it by adding the following [AppContextSwitchOverrides](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) switch to the `` section of the application configuration file:: +```xml + + + +``` + +### Affected APIs +* `T:System.Uri` + +### Category +Core + + diff --git a/Documentation/compatibility/uri-unc-shares-normalized.md b/Documentation/compatibility/uri-unc-shares-normalized.md new file mode 100644 index 000000000..16d9d2b7e --- /dev/null +++ b/Documentation/compatibility/uri-unc-shares-normalized.md @@ -0,0 +1,33 @@ +## Allow Unicode in URIs that resemble UNC shares + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +In , constructing a file URI containing both a UNC share name and Unicode characters will no longer result in a URI with invalid internal state. The behavior will change only when all of the following are true: + - The URI has the scheme `file:` and is followed by four or more slashes. + - The host name begins with an underscore or other non-reserved symbol. + - The URI contains Unicode characters. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Applications working with URIs consistently containing Unicode could have conceivably used this behavior to disallow references to UNC shares. Those applications should use instead. + +### Affected APIs +* `T:System.Uri` + +### Category +Core + + \ No newline at end of file diff --git a/Documentation/compatibility/uri-unicode-bidirectional-characters.md b/Documentation/compatibility/uri-unicode-bidirectional-characters.md new file mode 100644 index 000000000..9184a3836 --- /dev/null +++ b/Documentation/compatibility/uri-unicode-bidirectional-characters.md @@ -0,0 +1,45 @@ +## Allow Unicode Bidirectional Control Characters in URIs + +### Scope +Minor + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +Unicode specifies several special control characters used to specify the orientation of text. +In previous versions of the .NET Framework, these characters were incorrectly stripped +from all URIs even if they were present in their percent-encoded form. In order to better +follow [RFC 3987](https://tools.ietf.org/html/rfc3987), we now allow these characters in URIs. When found unencoded +in a URI, they are percent-encoded. When found percent-encoded they are left as-is. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +For applications that target versions of .NET Framework starting with 4.7.2, support for Unicode bidirectional characters is enabled by default. If this change is undesirable, you can disable it by adding the following [AppContextSwitchOverrides](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) switch to the `` section of the application configuration file: +```xml + + + +``` +For applications that target earlier versions of the .NET Framework but are running under versions starting with .NET Framework 4.7.2, support for Unicode bidirectional characters is disabled by default. You can enable it by adding the following [AppContextSwitchOverrides](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) switch to the `` section of the application configuration file:: +```xml + + + +``` + +### Affected APIs +* `T:System.Uri` + +### Category +Core + + \ No newline at end of file diff --git a/Documentation/compatibility/uri-unicode-scheme-only-relative.md b/Documentation/compatibility/uri-unicode-scheme-only-relative.md new file mode 100644 index 000000000..97a04b3e1 --- /dev/null +++ b/Documentation/compatibility/uri-unicode-scheme-only-relative.md @@ -0,0 +1,42 @@ +## Support special relative URI notation when Unicode is present + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description + + will no longer throw a when calling on certain relative URIs containing Unicode. + +The simplest reproduction of the is below, with the two statements being equivalent: + ```csharp +bool success = Uri.TryCreate("http:%C3%A8", UriKind.RelativeOrAbsolute, out Uri href); +bool success = Uri.TryCreate("http:è", UriKind.RelativeOrAbsolute, out Uri href); + ``` +To reproduce the , the following items must be true: +- The URI must be specified as relative by prepending it with ‘http:’ and not following it with ‘//’. +- The URI must contain percent-encoded Unicode or unreserved symbols. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Users depending on this behavior to disallow relative URIs should instead specify when creating a URI. + +### Affected APIs +* `M:System.Uri.TryCreate(System.Uri,System.Uri,System.Uri@)` +* `M:System.Uri.TryCreate(System.String,System.UriKind,System.Uri@)` +* `M:System.Uri.TryCreate(System.Uri,System.String,System.Uri@)` + +### Category +Core + + diff --git a/Documentation/compatibility/vb_net-no-longer-supports-partial-namespace-qualification-for-system_windows-apis.md b/Documentation/compatibility/vb_net-no-longer-supports-partial-namespace-qualification-for-system_windows-apis.md new file mode 100644 index 000000000..af24600d4 --- /dev/null +++ b/Documentation/compatibility/vb_net-no-longer-supports-partial-namespace-qualification-for-system_windows-apis.md @@ -0,0 +1,29 @@ +## VB.NET no longer supports partial namespace qualification for System.Windows APIs + +### Scope +Minor + +### Version Introduced +4.5.2 + +### Source Analyzer Status +Available + +### Change Description +Beginning in .NET Framework 4.5.2, VB.NET projects cannot specify System.Windows APIs with partially-qualified namespaces. For example, referring to `Windows.Forms.DialogResult` will fail. Instead, code must refer to the fully qualified name () or import the specific namespace and refer simply to . + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action +Code should be updated to refer to `System.Windows` APIs either with simple names (and importing the relevant namespace) or with fully qualified names. + +### Affected APIs +* Not detectable via API analysis + +### Category +Visual Basic .NET + +[More information](https://stackoverflow.com/questions/23573659/forms-is-not-a-member-of-windows) + + diff --git a/Documentation/compatibility/wcf-accessbility-combobox-high-contrast-issue-in-svcTraceViewer-tool.md b/Documentation/compatibility/wcf-accessbility-combobox-high-contrast-issue-in-svcTraceViewer-tool.md new file mode 100644 index 000000000..123ec463a --- /dev/null +++ b/Documentation/compatibility/wcf-accessbility-combobox-high-contrast-issue-in-svcTraceViewer-tool.md @@ -0,0 +1,36 @@ +## svcTraceViewer ComboBox high contrast change + +### Scope +Edge + +### Version Introduced +4.8 +### Source Analyzer Status +NotPlanned + +### Change Description +In the [Microsoft Service Trace Viewer tool](~/docs/framework/wcf/service-trace-viewer-tool-svctraceviewer-exe.md), ComboBox controls were not displayed in the correct color in certain high contrast themes. The issue was fixed in .NET Framework 4.7.2. However, due to .NET Framework SDK backward compatibility requirements, the fix was not visible to customers by default. .NET 4.8 surfaces this change by adding the following [AppContext configuration switches](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) to the svcTraceViewer.exe.config file: +```xml + +``` +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + - How to opt out of the change + If you don't want to have the high contrast behavior change, you can disable it by removing the following section from the svcTraceViewer.exe.config file: +```xml + +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Communication Foundation (WCF) + + + diff --git a/Documentation/compatibility/wcf-avoid-endless-recursion-in-two-iworkflowinstancemanagement-apis.md b/Documentation/compatibility/wcf-avoid-endless-recursion-in-two-iworkflowinstancemanagement-apis.md new file mode 100644 index 000000000..b09703e29 --- /dev/null +++ b/Documentation/compatibility/wcf-avoid-endless-recursion-in-two-iworkflowinstancemanagement-apis.md @@ -0,0 +1,46 @@ +## Avoiding endless recursion for IWorkflowInstanceManagement.TransactedCancel and IWorkflowInstanceManagement.TransactedTerminate + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +Under some circumstances when using or APIs to cancel or terminate a worklow service instance, the workflow instance may encounter a stack overflow due to endless recursion when the `Workflow` runtime attempts to persist the service instance as part of processing the request. The problem occurs if the workflow instance is in a state where it is waiting for some other outstanding WCF request to another service to complete. + +The `TransactedCancel` and `TransactedTerminate` operations create work items that are queued for the workflow service instance. These work items are not executed as part of the processing of the `TransactedCancel/TransactedTerminate` request. Because the workflow service instance is busy waiting for the other outstanding WCF request to complete, the work item created remains queued. The `TransactedCancel/TransactedTerminate` operation completes and control is returned back to the client. When the transaction associated with the `TransactedCancel/TransactedTerminate` operation attempts to commit, it needs to persist the workflow serivce instance state. But because there is an outstanding `WCF` request for the instance, the Workflow runtime cannot persist the workflow service instance, and an endless recursion loop leads to the stack overflow. + +Because `TransactedCancel` and `TransactedTerminate` only create a work item in memory, the fact that a transaction exists doesn't have any effect. A rollback of the transaction does not discard the work item. + +To address this issue, starting in .NET Framework 4.7.2, we have introduced an `AppSetting` that can be added to the `web.config/app.config` of the workflow service that tells it to ignore transactions for `TransactedCancel` and `TransactedTerminate`. This allows the transaction to commit without waiting for the workflow instance to persist. + +The AppSetting for this feature is named `microsoft:WorkflowServices:IgnoreTransactionsForTransactedCancelAndTransactedTerminate`. A value of `true` indicates that the transaction should be ignored, thus avoiding the stack overflow. The default value of this AppSetting is `false`, so existing workflow service instances are not affected. + + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +If you are using AppFabric or another client and are encountering a stack overflow in the workflow serivce instance when trying to cancel or terminate a workflow instance, you can add the following to the `` section of the web.config/app.config file for the workflow service: + +```xml + +``` + +If you are not encountering the problem, you do not need to do this. + + +### Affected APIs + * Not detectable via API analysis + +### Category +Windows Workflow Foundation (WF) + + + diff --git a/Documentation/compatibility/wcf-binding-with-the-transportwithmessagecredential-security-mode.md b/Documentation/compatibility/wcf-binding-with-the-transportwithmessagecredential-security-mode.md new file mode 100644 index 000000000..be8095391 --- /dev/null +++ b/Documentation/compatibility/wcf-binding-with-the-transportwithmessagecredential-security-mode.md @@ -0,0 +1,40 @@ +## WCF binding with the TransportWithMessageCredential security mode + +### Scope +Transparent + +### Version Introduced +4.6.1 + +### Source Analyzer Status +Not planned + +### Change Description +Beginning in the .NET Framework 4.6.1, WCF binding that uses the TransportWithMessageCredential security mode can be set up to receive messages with unsigned "to" headers for asymmetric security keys. + +By default, unsigned "to" headers will continue to be rejected in .NET Framework 4.6.1. They will only be accepted if an application opts into this new mode of operation using the Switch.System.ServiceModel.AllowUnsignedToHeader configuration switch. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +Because this is an opt-in feature, it should not affect the behavior of existing apps.
+ +To control whether the new behavior is used or not, use the following configuration setting: + +```xml + + + +``` + +### Affected APIs +* `F:System.ServiceModel.BasicHttpSecurityMode.TransportWithMessageCredential` +* `F:System.ServiceModel.BasicHttpsSecurityMode.TransportWithMessageCredential` +* `F:System.ServiceModel.SecurityMode.TransportWithMessageCredential` +* `F:System.ServiceModel.WSFederationHttpSecurityMode.TransportWithMessageCredential` + +### Category +Windows Communication Foundation (WCF) + + diff --git a/Documentation/compatibility/wcf-deadlock-results-when-using-reentrant-services.md b/Documentation/compatibility/wcf-deadlock-results-when-using-reentrant-services.md new file mode 100644 index 000000000..0df83b264 --- /dev/null +++ b/Documentation/compatibility/wcf-deadlock-results-when-using-reentrant-services.md @@ -0,0 +1,55 @@ +## Deadlock may result when using Reentrant services + +### Scope +Minor + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Investigating + +### Change Description + +A deadlock may result in a Reentrant service, which restricts instances of the service to one thread of execution at a time. Services prone to encounter this problem will have the following in their code: + +```csharp +[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] +``` + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +To address this issue, you can do the following: + +- Set the service's concurrency mode to or . For example: + + ```csharp + [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single)] + ``` + +- Install the latest update to the .NET Framework 4.6.2, or upgrade to a later version of the .NET Framework. This disables the flow of the in . This behavior is configurable; it is equivalent to adding the following app setting to your configuration file: + + ```xml + + + + ``` + + The value of `Switch.System.ServiceModel.DisableOperationContextAsyncFlow` should never be set to `false` for Rentrant services. + +### Affected APIs +- `T:System.ServiceModel.ServiceBehaviorAttribute` +- `F:System.ServiceModel.ConcurrencyMode.Reentrant` +- +### Category +Windows Communication Foundation (WCF) + + + + diff --git a/Documentation/compatibility/wcf-message-security-unable-to-use-tls1_1-and-tls1_2.md b/Documentation/compatibility/wcf-message-security-unable-to-use-tls1_1-and-tls1_2.md new file mode 100644 index 000000000..ed0368215 --- /dev/null +++ b/Documentation/compatibility/wcf-message-security-unable-to-use-tls1_1-and-tls1_2.md @@ -0,0 +1,30 @@ +## WCF message security now is able to use TLS1.1 and TLS1.2 + +### Scope +Edge + +### Version Introduced +4.7 + +### Source Analyzer Status +Planned + +### Change Description +Starting in the .NET Framework 4.7, customers can configure either TLS1.1 or TLS1.2 in WCF message security in addition to SSL3.0 and TLS1.0 through application configuration settings. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +In the .NET Framework 4.7, support for TLS1.1 and TLS1.2 in WCF message security is disabled by default. You can enable it by adding the following line to the `` section of the app.config or web.config file: + + ```xml + + + + ``` + +### Category +Windows Communication Foundation (WCF) + + diff --git a/Documentation/compatibility/wcf-services-using-nettcp-with-ssl-security-and-md5-certificate-authentication.md b/Documentation/compatibility/wcf-services-using-nettcp-with-ssl-security-and-md5-certificate-authentication.md new file mode 100644 index 000000000..70a9ebd95 --- /dev/null +++ b/Documentation/compatibility/wcf-services-using-nettcp-with-ssl-security-and-md5-certificate-authentication.md @@ -0,0 +1,64 @@ +## WCF services that use NETTCP with SSL security and MD5 certificate authentication + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +NotPlanned + +### Change Description +The .NET Framework 4.6 adds TLS 1.1 and TLS 1.2 to the WCF SSL default protocol list. When both client and server machines have the .NET Framework 4.6 or later installed, TLS 1.2 is used for negotiation. + +TLS 1.2 does not support MD5 certificate authentication. As a result, if a customer uses an MD5 certificate, the WCF client will fail to connect to the WCF service. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +You can work around this issue so that a WCF client can connect to a WCF server by doing any of the following: + +- Update the certificate to not use the MD5 algorithm. This is the recommended solution. + +- If the binding is not dynamically configured in source code, update the application's configuration file to use TLS 1.1 or an earlier version of the protocol. This allows you to continue to use a certificate with the MD5 hash algorithm. + + > [!WARNING] + > This workaround is not recommended, since a certificate with the MD5 hash algorithm is considered insecure. + + The following configuration file does this: + + ```xml + + + + + + + + + + + + + + + ``` + +- If the binding is dynamically configured in source code, update the property to use TLS 1.1 ( or an earlier version of the protocol in the source code. + + > [!WARNING] + > This workaround is not recommended, since a certificate with the MD5 hash algorithm is considered insecure. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Communication Foundation (WCF) + + + + diff --git a/Documentation/compatibility/wcf-transport-security-supports-certificates-stored-using-cng.md b/Documentation/compatibility/wcf-transport-security-supports-certificates-stored-using-cng.md new file mode 100644 index 000000000..ca24cee24 --- /dev/null +++ b/Documentation/compatibility/wcf-transport-security-supports-certificates-stored-using-cng.md @@ -0,0 +1,51 @@ +## WCF transport security supports certificates stored using CNG + +### Scope +Minor + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Investigating + +### Change Description +Starting with apps that target the .NET Framework 4.6.2, WCF transport security supports certificates stored using the Windows Cryptography Library (CNG). This support is limited to certificates with a public key that has an exponent no more than 32 bits in length. When an application targets the .NET Framework 4.6.2, this feature is on by default. + +In earlier versions of the .NET Framework, the attempt to use X509 certificates with a CSG key storage provider throws an exception. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +Apps that target the .NET Framework 4.6.1 and earlier but are running on the .NET Framework 4.6.2 can enable support for CNG certificates by adding the following line to the `` section of the app.config or web.config file: + + ```xml + + + + ``` + +This can also be done programmatically with the following code: + + ```cs + private const string DisableCngCertificates = @"Switch.System.ServiceModel.DisableCngCertificate"; + AppContext.SetSwitch(disableCngCertificates, false); + ``` + + ```vb + Const DisableCngCertificates As String = "Switch.System.ServiceModel.DisableCngCertificates" + AppContext.SetSwitch(disableCngCertificates, False) + ``` + +Note that, because of this change, any exception handling code that depends on the attempt to initiate secure communication with a CNG certificate to fail will no longer execute. + +### Category +Windows Communication Foundation (WCF) + + + + diff --git a/Documentation/compatibility/webutility_htmldecode-no-longer-decodes-invalid-input-sequences.md b/Documentation/compatibility/webutility_htmldecode-no-longer-decodes-invalid-input-sequences.md new file mode 100644 index 000000000..94b0d9448 --- /dev/null +++ b/Documentation/compatibility/webutility_htmldecode-no-longer-decodes-invalid-input-sequences.md @@ -0,0 +1,34 @@ +## WebUtility.HtmlDecode no longer decodes invalid input sequences + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description +By default, decoding methods no longer decode an invalid input sequence into an invalid UTF-16 string. Instead, they return the original input. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +The change in decoder output should matter only if you store binary data instead of UTF-16 data in strings. To explicitly control this behavior, set the `aspnet:AllowRelaxedUnicodeDecoding` attribute of the [appSettings](~/docs/framework/configure-apps/file-schema/appsettings/index.md) element to `true` to enable legacy behavior or to `false` to enable the current behavior. + +### Affected APIs +* `M:System.Net.WebUtility.HtmlDecode(System.String)` +* `M:System.Net.WebUtility.HtmlDecode(System.String,System.IO.TextWriter)` +* `M:System.Net.WebUtility.UrlDecode(System.String)` + +### Category +ASP.NET + + + + diff --git a/Documentation/compatibility/webutility_htmlencode-and-webutility_htmldecode-round-trip-bmp-correctly.md b/Documentation/compatibility/webutility_htmlencode-and-webutility_htmldecode-round-trip-bmp-correctly.md new file mode 100644 index 000000000..8459c4117 --- /dev/null +++ b/Documentation/compatibility/webutility_htmlencode-and-webutility_htmldecode-round-trip-bmp-correctly.md @@ -0,0 +1,43 @@ +## WebUtility.HtmlEncode and WebUtility.HtmlDecode round-trip BMP correctly + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +For applications that target the .NET Framework 4.5, characters that are outside +the Basic Multilingual Plane (BMP) round-trip correctly when they are passed to +the +methods. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +This change should have no effect on current applications, but to restore the +original behavior, set the `targetFramework` attribute of the `` +element to a string other than "4.5". You can also set the +`unicodeEncodingConformance` and `unicodeDecodingConformance` attributes of the +`` configuration element to control this behavior independently of +the targeted version of the .NET Framework. + +### Affected APIs +* `M:System.Net.WebUtility.HtmlEncode(System.String)` +* `M:System.Net.WebUtility.HtmlEncode(System.String,System.IO.TextWriter)` + +### Category +ASP.NET + + + + diff --git a/Documentation/compatibility/wf-serializes-expressions_literal-datetimes-differently.md b/Documentation/compatibility/wf-serializes-expressions_literal-datetimes-differently.md new file mode 100644 index 000000000..0e762dd9a --- /dev/null +++ b/Documentation/compatibility/wf-serializes-expressions_literal-datetimes-differently.md @@ -0,0 +1,48 @@ +## WF serializes Expressions.Literal<T> DateTimes differently now (breaks custom XAML parsers) + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +The associated + object +will convert a or + object whose Second and + components are non-zero +and (for a value) whose + property is not +Unspecified to property element syntax instead of a string. This change allows + and + values to be round-tripped. +Custom XAML parsers that assume that input XAML is in the attribute syntax will +not function correctly. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This change allows and + values to be round-tripped. +Custom XAML parsers that assume that input XAML is in the attribute syntax will +not function correctly. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Workflow Foundation (WF) + + + + diff --git a/Documentation/compatibility/windows-forms-icon-tobitmap-method-successfully-converts-icons-with-png-frames.md b/Documentation/compatibility/windows-forms-icon-tobitmap-method-successfully-converts-icons-with-png-frames.md new file mode 100644 index 000000000..5aca42a8c --- /dev/null +++ b/Documentation/compatibility/windows-forms-icon-tobitmap-method-successfully-converts-icons-with-png-frames.md @@ -0,0 +1,46 @@ +## Icon.ToBitmap successfully converts icons with PNG frames into Bitmap objects + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +Investigating + +### Change Description + +Starting with the apps that target the .NET Framework 4.6, the method successfully converts icons with PNG frames into Bitmap objects.

+ +In apps that target the .NET Framework 4.5.2 and earlier versions, the method throws an exception if the Icon object has PNG frames.

+ +This change affects apps that are recompiled to target the .NET Framework 4.6 and that implement special handling for the that is thrown when an Icon object has PNG frames. When running under the .NET Framework 4.6, the conversion is successful, an is no longer thrown, and therefore the exception handler is no longer invoked. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +If this behavior is undesirable, you can retain the previous behavior by adding the following element to the `` section of your app.config file: + +```xml + +``` + +If the app.config file already contains the `AppContextSwitchOverrides` element, the new value should be merged with the value attribute like this: + +```xml + +``` + +### Affected APIs +* `M:System.Drawing.Icon.ToBitmap` + +### Category +Windows Forms + + + + diff --git a/Documentation/compatibility/winform's-DomainUpDownControl-button's-actions-in-sync.md b/Documentation/compatibility/winform's-DomainUpDownControl-button's-actions-in-sync.md new file mode 100644 index 000000000..5b9a4b4b9 --- /dev/null +++ b/Documentation/compatibility/winform's-DomainUpDownControl-button's-actions-in-sync.md @@ -0,0 +1,41 @@ +## WinForm's Domain upbutton and downbutton actions are in sync now + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +Not planned + +### Change Description +In the .NET Framework 4.7.1 and previous versions the +control's +action is ignored when control text is present, and the developer is required to use action on the control before using action. +Starting with the .NET Framework 4.7.2 both the and actions work independently in this scenario and remain in sync. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action + +In order for an application to benefit from these changes, it must run on the .NET Framework 4.7.2 or later. The application can benefit from these changes in either of the following ways: +- It is recompiled to target the .NET Framework 4.7.2. This change is enabled by default on Windows Forms applications that target the .NET Framework 4.7.2 or later. +- It opts out of the legacy scrolling behavior by adding the following [AppContext Switch](https://docs.microsoft.com/dotnet/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element) to the `` section of the app config file and setting it to `false`, as the following example shows. + +```xml + + + +``` + +### Affected APIs +`M:System.Windows.Forms.DomainUpDown.UpButton` +`M:System.Windows.Forms.DomainUpDown.DownButton` + + +### Category +Windows Forms + + diff --git a/Documentation/compatibility/winform's-checkforoverflowunderflow-property-is-now-true-for-system_drawing.md b/Documentation/compatibility/winform's-checkforoverflowunderflow-property-is-now-true-for-system_drawing.md new file mode 100644 index 000000000..fcd32956d --- /dev/null +++ b/Documentation/compatibility/winform's-checkforoverflowunderflow-property-is-now-true-for-system_drawing.md @@ -0,0 +1,29 @@ +## WinForm's CheckForOverflowUnderflow property is now true for System.Drawing + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Not planned + +### Change Description +The CheckForOverflowUnderflow property for the System.Drawing.dll assembly is set to true. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Previously when overflows occurred, the result would be silently truncated. Now +an exception is thrown. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Forms + + diff --git a/Documentation/compatibility/winforms-ContextMenuStrip-SourceControl-property-change.md b/Documentation/compatibility/winforms-ContextMenuStrip-SourceControl-property-change.md new file mode 100644 index 000000000..9db7a80c8 --- /dev/null +++ b/Documentation/compatibility/winforms-ContextMenuStrip-SourceControl-property-change.md @@ -0,0 +1,46 @@ +## ContextMenuStrip.SourceControl property contains a valid control in the case of nested ToolStripMenuItems + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +In the .NET Framework 4.7.1 and previous versions, the property incorrectly returns null when the user opens the menu from nested controls. +In the .NET Framework 4.7.2 and later, property is always set to the actual source control. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +__How to opt in or out of these changes__ + +In order for an application to benefit from these changes, it must run on the .NET Framework 4.7.2 or later. The application can benefit from these changes in either of the following ways: + +- It targets the .NET Framework 4.7.2. This change is enabled by default on Windows Forms applications that target the .NET Framework 4.7.2 or later. +- It targets the .NET Framework 4.7.1 or an earlier version and opts out of the legacy accessibility behaviors by adding the following [AppContext Switch](https://docs.microsoft.com/dotnet/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element) to the `` section of the app.config file and setting it to `false`, as the following example shows. + +```xml + + + +``` + +Applications that target the .NET Framework 4.7.2 or later, and want to preserve the legacy behavior can opt in to the use of the legacy source control value by explicitly setting this AppContext switch to `true`. + + +### Affected APIs + * `P:System.Windows.Forms.ContextMenuStrip.SourceControl` + +### Category +Windows Forms + + + + diff --git a/Documentation/compatibility/winforms-PrivateFontCollection-Font-handle-leak-fix.md b/Documentation/compatibility/winforms-PrivateFontCollection-Font-handle-leak-fix.md new file mode 100644 index 000000000..ce853f196 --- /dev/null +++ b/Documentation/compatibility/winforms-PrivateFontCollection-Font-handle-leak-fix.md @@ -0,0 +1,49 @@ +## PrivateFontCollection.AddFontFile method releases Font resources + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +In the .NET Framework 4.7.1 and previous versions, the class does not release the GDI+ font resources after the is disposed for objects that are added to this collection using the method. +In the .NET Framework 4.7.2 and later [PrivateFontCollection.Dispose](xref:System.Drawing.Text.FontCollection.Dispose%2A) releases the GDI+ fonts that were added to the collection as files. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +__How to opt in or out of these changes__ + +In order for an application to benefit from these changes, it must run on the .NET Framework 4.7.2 or later. The application can benefit from these changes in either of the following ways: + +- It is recompiled to target the .NET Framework 4.7.2. This change is enabled by default on Windows Forms applications that target the .NET Framework 4.7.2 or later. +- It targets the .NET Framework 4.7.1 or an earlier version and opts out of the legacy accessibility behaviors by adding the following [AppContext Switch](https://docs.microsoft.com/dotnet/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element) to the `` section of the app.config file and setting it to `false`, as the following example shows. + + +```xml + + + +``` + +Applications that target the .NET Framework 4.7.2 or later, and want to preserve the legacy behavior can opt in to not release font resources by explicitly setting this AppContext switch to `true`. + + +### Affected APIs +* `M:System.Drawing.Text.PrivateFontCollection.AddFontFile(System.String)` +* `M:System.Drawing.Text.FontCollection.Dispose` + +### Category +Windows Forms + + + + + diff --git a/Documentation/compatibility/winforms-accessibility-changes-471.md b/Documentation/compatibility/winforms-accessibility-changes-471.md new file mode 100644 index 000000000..5b084b9ef --- /dev/null +++ b/Documentation/compatibility/winforms-accessibility-changes-471.md @@ -0,0 +1,157 @@ +## Accessibility improvements in Windows Forms controls + +### Scope +Major + +### Version Introduced +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +Windows Forms is improving how it works with accessibility technologies to better support Windows Forms customers. These include the following changes starting with the .NET Framework 4.7.1: +- Changes to improve display during High Contrast mode. +- Changes to improve the property browser experience. Property browser improvements include: + - Better keyboard navigation through the various drop-down selection windows. + - Reduced unnecessary tab stops. + - Better reporting of control types. + - Improved narrator behavior. +- Changes to implement missing UI accessibility patterns in controls. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +**How to opt in or out of these changes**
+ +In order for the application to benefit from these changes, it must run on the .NET Framework 4.7.1 or later. The application can benefit from these changes in either of the following ways: + +- It is recompiled to target the .NET Framework 4.7.1. These accessibility changes are enabled by default on Windows Forms applications that target the .NET Framework 4.7.1 or later. + +- It opts out of the legacy accessibility behaviors by adding the following [AppContext switch](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) to the `` section of the app.config file and setting it to `false`, as the following example shows. + + ```xml + + + + + + + + + + + ``` + +
Applications that target the .NET Framework 4.7.1 or later and want to preserve the legacy accessibility behavior can opt in to the use of legacy accessibility features by explicitly setting this AppContext switch to `true`.

+ +For an overview of UI automation, see the [UI Automation Overview](~/docs/framework/ui-automation/ui-automation-overview.md).

+ +**Added support for UI Automation patterns and properties**
+ +Accessibility clients can take advantage of new WinForms accessibility functionality by using common, publicly described invocation patterns. These patterns are not WinForms-specific. For instance, accessibility clients can call the QueryInterface method on the IAccessible interface (MAAS) to obtain an IServiceProvider interface. If this interface is available, clients can use its QueryService method to request an IAccessibleEx interface. For more information, see [Using IAccessibleEx from a Client](https://docs.microsoft.com/windows/desktop/WinAuto/using-iaccessibleex-from-a-client). Starting with the .NET Framework 4.7.1, IServiceProvider and [IAccessibleEx]( https://docs.microsoft.com/windows/desktop/WinAuto/iaccessibleex) (where applicable) are available for WinForms accessibility objects.

+ +The .NET Framework 4.7.1 adds support for the following UI automation patterns and properties: + +- The and controls support the [Expand/Collapse pattern](~/docs/framework/ui-automation/implementing-the-ui-automation-expandcollapse-control-pattern.md). +- The control has a [ControlType](~/docs/framework/ui-automation/ui-automation-support-for-the-menubar-control-type.md) property value . +- The control supports the [Name](xref:System.Windows.Automation.AutomationElement.NameProperty) property and the[Expand/Collapse pattern](~/docs/framework/ui-automation/implementing-the-ui-automation-expandcollapse-control-pattern.md). +- The control supports [AccessibleEvents](xref:System.Windows.Forms.AccessibleEvents) indicating StateChange and NameChange when drop down is expanded or collapsed. +- The control has a [ControlType](~/docs/framework/ui-automation/ui-automation-support-for-the-menubar-control-type.md) property value of . +- The control supports the [Toggle Pattern](xref:System.Windows.Automation.TogglePattern). +- The and controls support the [Name](xref:System.Windows.Automation.AutomationElement.NameProperty) property and have a [ControlType](~/docs/framework/ui-automation/ui-automation-support-for-the-spinner-control-type.md) of .

+ +**Improvements to the PropertyGrid control**
+ +The .NET Framework 4.7.1 adds the following improvements to the PropertyBrowser control: +- The **Details** button in the error dialog that is displayed when the user enters an incorrect value in the control supports the [Expand/Collapse pattern](~/docs/framework/ui-automation/implementing-the-ui-automation-expandcollapse-control-pattern.md), state and name change notifications, and a [ControlType](~/docs/framework/ui-automation/ui-automation-support-for-the-menubar-control-type.md) property with a value of . +- The message pane displayed when the **Details** button of the error dialog is expanded is now keyboard accessible and allows Narrator to announce the content of the error message. +- The [AccessibleRole](xref:System.Windows.Forms.AccessibleRole) of rows in the control have changed from "Row" to "Cell". The cell maps to UIA ControlType "DataItem", which allows it to support appropriate keyboard shortcuts and Narrator announcements. +- The control rows that represent header items when the control has a property set to have a [ControlType](~/docs/framework/ui-automation/ui-automation-support-for-the-menubar-control-type.md) property value of . +- The control rows that represent header items when the control has a property set to support the [Expand/Collapse pattern](~/docs/framework/ui-automation/implementing-the-ui-automation-expandcollapse-control-pattern.md). +- Improved keyboard navigation between the grid and the ToolBar above it. Pressing "Shift-Tab" now selects the first ToolBar button, instead of the whole ToolBar. +- controls displayed in High Contrast mode will now draw a focus rectangle around the ToolBar button which corresponds to the current property value. +- controls displayed in High Contrast mode and with a property set to will now display the background of category headers in a highly contrasting color. +- controls better differentiates between ToolBar items with focus and the ToolBar items which indicate the current value of the property. This fix consists of a High Contrast change and a change for non-High Contrast scenarios. +- control ToolBar items which indicates the current value of the property support the [Toggle Pattern](xref:System.Windows.Automation.TogglePattern). +- Improved Narrator support for distinguishing the selected alignment in the Alignment Picker. +- When an empty control is displayed on a form, it will now receive focus where previously it would not.

+ +**Use of OS-defined colors in High Contrast themes**
+ +- The and controls with their property set to , which is the default style, now use OS-defined colors in High Contrast theme when selected. Previously, text and background colors were not contrasting and were hard to read. +- The , , , , , and controls with their property set to **false** used a shaded color to render text in High Contrast themes, resulting in low contrast against the background. Now these controls use the "Disabled Text" color defined by the OS. This fix applies to controls with the `FlatStyle` property set to a value other than . The latter controls are rendered by the OS. +- now renders a visible rectangle around the content of the cell which has the current focus. Previously, this was not visible in certain High Contrast themes. +- controls with their property set to **false** now use the "Disabled Text" color defined by the OS. +- controls with their property set to **true** now render the associated check mark in a contrasting system color. Previously the check mark color was not contrasting enough and not visible in High Contrast themes. + + +NOTE: Windows 10 has changed values for some high contrast system colors. Windows Forms Framework is based on the Win32 framework. For the best experience, run on the latest version of Windows and opt in to the latest OS changes by adding an app.manifest file in a test application and uncommenting the following code: + +```xml +     +     +``` + +
**Improved keyboard navigation** + +- When a control has its property set to and is the first control in the tab order on the form, it now displays a focus rectangle when the parent form is opened using the keyboard. Before this change, keyboard focus was on this control, but a focus indicator was not rendered. + +**Improved Narrator support** +- The control has added support for assistive technologies to access the control, including the ability for Narrator to read the value of the control when previously it could not. +- The control now notifies Narrator when a property has been changed. Previously, Narrator did not receive notification and as a result users would not be informed that the property had been updated. +- The control has changed the way it notifies Narrator of the text of in the control. Previously, Narrator announced this text twice and read "&" symbols as real text even though they are not visible to a user. The duplicated text was removed from the Narrator announcements, as well as unnecessary "&" symbols. +- The control types now correctly report the read-only status to Narrator and other assistive technologies. +- Narrator is now able to read the System Menu of child windows in [Multiple-Document Interface]~/docs/framework/winforms/advanced/multiple-document-interface-mdi-applications.md) applications. +- Narrator is now able to read controls with a property set to **false**. Previously, Narrator was unable to focus on disabled menu items to read the content. + +### Affected APIs +* `M:System.Windows.Forms.ToolStripDropDownButton.CreateAccessibilityInstance` +* `P:System.Windows.Forms.DomainUpDown.DomainUpDownAccessibleObject.Name` +* [MonthCalendar.AccessibilityObject](xref:System.Windows.Forms.Control.AccessibilityObject) + + +### Category +Windows Forms + + + diff --git a/Documentation/compatibility/winforms-accessibility-changes-472.md b/Documentation/compatibility/winforms-accessibility-changes-472.md new file mode 100644 index 000000000..6c5d67289 --- /dev/null +++ b/Documentation/compatibility/winforms-accessibility-changes-472.md @@ -0,0 +1,108 @@ +## Accessibility improvements in Windows Forms controls for .NET 4.7.2 + +### Scope +Major + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +Windows Forms Framework is improving how it works with accessibility technologies to better support Windows Forms customers. These include the following changes: +- Changes to improve display during High Contrast mode. +- Changes to improve the keyboard navigation in the DataGridView and MenuStrip controls. +- Changes to interaction with Narrator. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +__How to opt in or out of these changes__ + +In order for the application to benefit from these changes, it must run on the .NET Framework 4.7.2 or later. The application can benefit from these changes in either of the following ways: +- It is recompiled to target the .NET Framework 4.7.2. These accessibility changes are enabled by default on Windows Forms applications that target the .NET Framework 4.7.2 or later. +- It targets the .NET Framework 4.7.1 or earlier version and opts out of the legacy accessibility behaviors by adding the following [AppContext Switch](https://docs.microsoft.com/dotnet/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element) to the `` section of the app config file and setting it to `false`, as the following example shows. + +```xml + + + + + + + + + + +``` +Note that to opt in to the accessibility features added in .NET Framework 4.7.2, you must also opt in to accessibility features of .NET Framework 4.7.1 as well. +Applications that target the .NET Framework 4.7.2 or later and want to preserve the legacy accessibility behavior can opt in to the use of legacy accessibility features by explicitly setting this AppContext switch to `true`. + +__Use of OS-defined colors in High Contrast themes__ +- The drop down arrow of the now uses OS-defined colors in High Contrast theme. +- , and controls with set to or now use OS-defined colors in High Contrast theme when selected. Previously, text and background colors were not contrasting and were hard to read. +- Controls contained within a that has its property set to `false` will now use OS-defined colors in High Contrast theme. +- The , , and controls have an increased luminosity contrast ratio in High Contrast Mode. +- will by default use OS-defined colors in High Contrast mode for the property. + +NOTE: Windows 10 has changed values for some high contrast system colors. Windows Forms Framework is based on the Win32 framework. For the best experience, run on the latest version of Windows and opt in to the latest OS changes by adding an app.manifest file in a test application and uncommenting the following code: +``` +     +     +``` + +__Improved Narrator support__ +- Narrator now announces the value of the property when announcing the text of a . +- Narrator now indicates when a has its property set to `false`. +- Narrator now gives feedback on the state of a check box when the property is set to `true`. +- Narrator Scan Mode focus order is now consistent with the visual order of the controls on the ClickOnce download dialog window. + +__Improved DataGridView Accessibility support__ +- Rows in a can now be sorted using the keyboard. Now a user can use the F3 key in order to sort by the current column. +- When the is set to , the column header will change color to indicate the current column as the user tabs through the cells in the current row. +- The property now returns the correct parent control. + +__Improved Visual cues__ +- The and controls with an empty property will now display a focus indicator when they receive focus. + +__Improved Property Grid Support__ +- The control child elements now return a `true` for the property only when a PropertyGrid element is enabled. +- The control child elements now return a `false` for the property only when a PropertyGrid element can be changed by the user. + +For an overview of UI automation, see the [UI Automation Overview](https://docs.microsoft.com/dotnet/framework/ui-automation/ui-automation-overview).

+ +__Improved keyboard navigation__ +- now allows focus when contained within a that has the property set to `true` + + + +### Affected APIs + + + +### Category +Windows Forms + + + + + diff --git a/Documentation/compatibility/winforms-accessibility-changes-48.md b/Documentation/compatibility/winforms-accessibility-changes-48.md new file mode 100644 index 000000000..ac3a22613 --- /dev/null +++ b/Documentation/compatibility/winforms-accessibility-changes-48.md @@ -0,0 +1,128 @@ +## Accessibility improvements in Windows Forms controls for .NET 4.8 + +### Scope +Major + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +The Windows Forms Framework is continuing to improve how it works with accessibility technologies to better support Windows Forms customers. These include the following changes: +- Changes to improve display during High Contrast mode. +- Changes to interaction with Narrator. +- Changes in the Accessible hierarchy (improving navigation through the UI Automation tree). + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +__How to opt in or out of these changes__ + +In order for the application to benefit from these changes, it must run on the .NET Framework 4.8. The application can opt in into these changes in either of the following ways: +- It is recompiled to target the .NET Framework 4.8. These accessibility changes are enabled by default on Windows Forms applications that target the .NET Framework 4.8. +- It targets the .NET Framework 4.7.2 or earlier version and opts out of the legacy accessibility behaviors by adding the following [AppContext switch](https://docs.microsoft.com/dotnet/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element) to the `` section of the app config file and setting it to `false`, as the following example shows. + +```xml + + + + + + + + + + +``` +Note that to opt in to the accessibility features added in .NET Framework 4.8, you must also opt in to accessibility features of .NET Framework 4.7.1 and 4.7.2 as well. +Applications that target the .NET Framework 4.8 and want to preserve the legacy accessibility behavior can opt in to the use of legacy accessibility features by explicitly setting this AppContext switch to `true`. + +Enabling the keyboard ToolTip invocation support requires adding the `Switch.System.Windows.Forms.UseLegacyToolTipDisplay=false` line to the AppContextSwitchOverrides value: + +```xml +`` +``` + +Note that enabling this feature requires opting in to the aforementioned accessibility features of .NET Framework 4.7.1 - 4.8. Also, if any of the accessibility features are not opted in but the tooltip display feature is opted in, a runtime will be thrown on the first access to these features. The exception message indicates that keyboard ToolTips require accessibility improvements of level 3 to be enabled. + +__Use of OS-defined colors in High Contrast themes__ +- Improved high-contrast themes. + +__Improved Narrator support__ +- Narrator now announces the sort direction of the when announcing an accessible name of a . + +__Improved CheckedListBox Accessibility support__ +- Improved Narrator support for the control. When navigating to the control using the keyboard, Narrator focuses the item and announces it. +- An empty CheckedListBox control now has a focus rectangle drawn for a virtual first item when the control becomes focused. + +__Improved ComboBox Accessibility support__ +- Enabled UI Automation support for the control, with the ability to use UI Automation notifications and other UI Automation features. + +__Improved DataGridView Accessibility support__ +- Enabled UI Automation support for control with ability to use UI Automation notifications and other UI Automation features. +- The UI Automation element which corresponds to the or is now a child of corresponding editing cell. + +__Improved LinkLabel Accessibility support__ +- Improved control accessibility: Narrator announces the disabled state for the link if the corresponding control is disabled. + +__Improved ProgressBar Accessibility support__ +- Enabled UI Automation support for the control with the ability to use UI Automation notifications and other UI Automation features. Developers are now able to use UI Automation notifications which Narrator can announce to indicate progress. + +For an overview of UI automation events overview, including UI automation notification events, see the [UI Automation Events Overview](https://docs.microsoft.com/windows/desktop/WinAuto/uiauto-eventsoverview). + +__Improved PropertyGrid Accessibility support__ +- Enabled UI Automation support for the control, with the ability to use UI Automation notifications and other UI Automation features. +- The UI Automation element which corresponds to the currently edited property is now a child of the corresponding property item UI Automation element. +- The UI Automation property item element is now a child of the corresponding category element if the parent control is set to category view. + +__Improved ToolStrip support__ +- Enabled UI Automation support for the control, with the ability to use UI Automation notifications and other UI Automation features. +- Improved navigation through items. +- In items mode, Narrator focus does not disappear and does not go to hidden items. + +__Improved Visual cues__ +- An empty control now displays a focus indicator when it receives focus. + +Note: UI automation support is enabled for controls in runtime but is not used in design time. +For an overview of UI automation, see the [UI Automation Overview](https://docs.microsoft.com/dotnet/framework/ui-automation/ui-automation-overview).

+ +__Invoking controls' ToolTips with a keyboard__ +- Control tooltip can now be invoked by focusing the control with keyboard. This feature needs to be enabled explicitly for the application (see section __"How to opt in or out of these changes"__) + +__Showing controls' ToolTips in multiple monitors__ +- ToolTip appearance in multi-monitor environments with different DPI scales is correct now and adapted to not truncate the begginnig of text in case the ToolTip text is too long. + + +### Affected APIs + + + +### Category +Windows Forms + + + + + diff --git a/Documentation/compatibility/winforms-hdpi-changes-48.md b/Documentation/compatibility/winforms-hdpi-changes-48.md new file mode 100644 index 000000000..a7a28443b --- /dev/null +++ b/Documentation/compatibility/winforms-hdpi-changes-48.md @@ -0,0 +1,84 @@ +## High DPI (HDPI) improvements in Windows Forms controls for .NET 4.8 + +### Scope +Major + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +The Windows Forms Framework is continuing to improve the scaling and rendering of its controls to better support Windows Forms customers on high resolution devices. As a result of these improvemeents, Windows Forms applications are able to better handle DPI changes that occur, for example, when moving the application from one monitor to another monitor that has different DPI settings. These include the following changes: +- Changes to improve the scaling of controls when the DPI of the application changes. +- Changes to improve the scaling of Toolstrip menus, buttons, and glyphs when the DPI of the application changes. +- Changes to improve the scaling of and controls when setting different styles on them, and the DPI of the application changes. +- Changes to improve the scaling of font-based controls when the DPI of the application changes. +- Changes to improve the scaling of the control when the DPI of the application changes. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +__How to opt in or out of these changes__ + +In order for the application to benefit from these changes, it must run on the .NET Framework 4.8. The application can opt in to these changes in either of the following ways: +- It is recompiled to target the .NET Framework 4.8. These high DPI improvement changes are enabled by default on Windows Forms applications that target the .NET Framework 4.8. +- It targets the .NET Framework 4.7.2 or earlier versions and opts in to this new behaviour by adding the following [Windows Forms Configuration Section](https://docs.microsoft.com/dotnet/framework/configure-apps/file-schema/winforms/) to the app config file and then adding the required flag to opt-in specific feature improvements. + +```xml + + + + + + + + ... + + + +``` +- High DPI improvements in each major category has its own opt-in setting. Applications can set the required setting by following instructions found at [High DPI support in Windows Forms](~/docs/framework/winforms/high-dpi-support-in-windows-forms.md) and the [Windows Forms add configuration element](~/docs/framework/configure-apps/file-schema/winforms/windows-forms-add-configuration-element.md) . + +Note that many of these improvements are enabled only on Windows 10, and your application must be enabled to run in Windows 10 compatible mode. You can set this in the application manifest file as defined in [High DPI support in Windows Forms](~/docs/framework/winforms/high-dpi-support-in-windows-forms.md). + +__Opting out +Applications that target the .NET Framework 4.8 and want to preserve the legacy high dpi behavior can do so by explicitly setting the switches described below to `true`. + +__Improved PropertyGrid scaling when DPI changes.__ +- Improved scaling of the PropertyGrid control and its child controls when the DPI of the application is changed (for example, when the application moves from one monitor to another with different DPI settings). All changes made for this improvement are controlled by the `DisableDpiChangedHighDpiImprovements` switch. + +__Improved scaling of Toolstrip Menus/Buttons/Glyphs when the DPI of the application changed__ +All changes in this area are controlled by the `ToolStrip.DisableHighDpiImprovements` & `DisableDpiChangedHighDpiImprovements` switches. + +__Improved scaling of RadioButton and CheckBox when application DPI changes__ +- Improved the scaling of the RadioButton and CheckBox, when setting different styles on them and the DPI of the application changes. All changes made for this improvement are quirked under the `DisableDpiChangedHighDpiImprovements` switch. + +__Improved scaling of Button control when application DPI changed__ +All changes made in this area are controlled by the `DisableDpiChangedHighDpiImprovements` switch. + +__Improved scaling of Font based controls when application DPI changes__ +All changes made in this area are controlled by the `DisableDpiChangedHighDpiImprovements` switch. + +### Affected APIs +- Not detectable via API analysis. + +### Category +Windows Forms + + + + + diff --git a/Documentation/compatibility/winrt-stream-adapters-no-long-call-flushasync-automatically-on-close.md b/Documentation/compatibility/winrt-stream-adapters-no-long-call-flushasync-automatically-on-close.md new file mode 100644 index 000000000..d51e690c2 --- /dev/null +++ b/Documentation/compatibility/winrt-stream-adapters-no-long-call-flushasync-automatically-on-close.md @@ -0,0 +1,35 @@ +## WinRT stream adapters no long call FlushAsync automatically on close + +### Scope +Transparent + +### Version Introduced +4.5.1 + +### Source Analyzer Status +Not planned + +### Change Description +In Windows Store apps, Windows Runtime stream adapters no longer call the FlushAsync method from the Dispose method. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This change should be transparent. Developers can restore the previous behavior by writing code like this: + +```csharp +using (var stream = GetWindowsRuntimeStream() as Stream) +{ + // do something + await stream.FlushAsync(); +} +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Core + + diff --git a/Documentation/compatibility/workflow-3_0-types-are-obsolete.md b/Documentation/compatibility/workflow-3_0-types-are-obsolete.md new file mode 100644 index 000000000..b2116112d --- /dev/null +++ b/Documentation/compatibility/workflow-3_0-types-are-obsolete.md @@ -0,0 +1,27 @@ +## WorkFlow 3.0 types are obsolete + +### Scope +Major + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description +Windows Workflow Foundation (WWF) 3.0 APIs (those from the System.Workflow namespace) are now obsolete. + +- [ ] Quirked +- [x] Build-time break + +### Recommended Action +New WWF 4.0 APIs (in System.Activities) should be used instead. An example of using the new APIs can be found [here](~/docs/framework/windows-workflow-foundation/how-to-update-the-definition-of-a-running-workflow-instance.md) and further guidance is available [here](https://blogs.msdn.com/b/workflowteam/archive/2012/02/08/deprecatingwf3.aspx). Alternatively, since the WWF 3.0 APIs are still supported, they may be used and the build-time warning avoided either by suppressing it or by using an older compiler. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Workflow Foundation (WF) + + diff --git a/Documentation/compatibility/workflow-checksums-changed-from-md5-to-sha1.md b/Documentation/compatibility/workflow-checksums-changed-from-md5-to-sha1.md new file mode 100644 index 000000000..da89ac570 --- /dev/null +++ b/Documentation/compatibility/workflow-checksums-changed-from-md5-to-sha1.md @@ -0,0 +1,46 @@ +## Workflow checksums changed from MD5 to SHA1 + +### Scope +Minor + +### Version Introduced +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description +To support debugging with Visual Studio, +the Workflow runtime generates a checksum for a workflow instance using a hashing algorithm. +In the .NET Framework 4.6.2 and earlier versions, workflow checksum hashing used the MD5 +algorithm, which caused issues on FIPS-enabled systems. Starting with the .NET Framework 4.7, +the algorithm is SHA1. If your code has persisted these checksums, they will be incompatible. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +If your code is unable to load workflow instances due to a checksum failure, try setting +the `AppContext` switch "Switch.System.Activities.UseMD5ForWFDebugger" to true. + +In code: +```csharp +System.AppContext.SetSwitch("Switch.System.Activities.UseMD5ForWFDebugger", true); +``` + +Or in configuration: +```xml + + + + + +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Workflow Foundation (WF) + + diff --git a/Documentation/compatibility/workflow-designer-accessibility-4-8.md b/Documentation/compatibility/workflow-designer-accessibility-4-8.md new file mode 100644 index 000000000..2613e9fb8 --- /dev/null +++ b/Documentation/compatibility/workflow-designer-accessibility-4-8.md @@ -0,0 +1,56 @@ +## Accessibility improvements in Windows Workflow Foundation (WF) workflow designer + +### Scope +Minor + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +The Windows Workflow Foundation (WF) workflow designer is improving how it works with accessibility technologies. These improvements include the following changes: +- Users using Narrator will see improvements in FlowSwitch case labels. +- Users who choose High Contrast themes will see many improvements in the visibility of the Workflow Designer and its controls, like better contrast ratios between elements and more noticeable selection boxes used for focus elements. +- Users using Narrator will see improvements in button descriptions. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +If you have an application with a re-hosted workflow designer, your application can benefit from these changes by performing either of these actions: +- Recompile your application to target the .NET Framework 4.8 or later. These accessibility changes are enabled by default. +- If your application targets the .NET Framework 4.7.2 or earlier but is running on the .NET Framework 4.8 or later, you can opt out of these legacy accessibility behaviors by adding the following [AppContext switch](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) to the `` section of the app.config file and set it to `false`, as the following example shows. +```xml + + + + + + + + + + +``` +Applications that target the .NET Framework 4.8 and want to preserve the legacy accessibility behavior can opt in to the use of legacy accessibility features by explicitly setting this AppContext switch to `true`. + + +### Affected APIs + * Not detectable via API analysis + +### Category +Windows Workflow Foundation (WF) + + + + diff --git a/Documentation/compatibility/workflow-designer-accessibility.md b/Documentation/compatibility/workflow-designer-accessibility.md new file mode 100644 index 000000000..eb3476368 --- /dev/null +++ b/Documentation/compatibility/workflow-designer-accessibility.md @@ -0,0 +1,123 @@ +## Accessibility improvements in Windows Workflow Foundation (WF) workflow designer + +### Scope +Minor + +### Version Introduced +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +The Windows Workflow Foundation (WF) workflow designer is improving how it works with accessibility technologies. These improvements include the following changes: +- The tab order is changed to left to right and top to bottom in some controls: + - The initialize correlation window for setting correlation data for the activity + - The content definition window for the , , , and activities +- More functions are available via the keyboard: + - When editing the properties of an activity, property groups can be collapsed by keyboard the first time they are focused. + - Warning icons are now accessible by keyboard. + - The More Properties button in the Properties window is now accessible by keyboard. + - Keyboard users now can access the header items in the Arguments and Variables panes of the Workflow Designer. +- Improved visibility of items with focus, such as when: + - Adding rows to data grids used by the Workflow Designer and activity designers. + - Tabbing through fields in the and activities. + - Setting default values for variables or arguments +- Screen readers can now correctly recognize: + - Breakpoints set in the workflow designer. + - The , , and activities. + - The contents of the activity. + - The Target Type for the activity. + - The Exception combobox and the Finally section in the activity. + - The Message Type combobox, the splitter in the Add Correlation Initializers window, the Content Definition window, and the CorrelatesOn Defintion window in the messaging activities (, , , and ). + - State machine transitions and transitions destinations. + - Annotations and connectors on activities. + - The context (right-click) menus for activities. + - The property value editors, the Clear Search button, the By Category and Alphabetical sort buttons, and the Expression Editor dialog in the properties grid. + - The zoom percentage in the Workflow Designer. + - The separator in and activities. + - The activity. + - The Select Types window for dictionary activities (`Microsoft.Activities.AddToDictionary`, `Microsoft.Activities.RemoveFromDictionary`, etc.). + - The Browse and Select .NET Type window. + - Breadcrumbs in the Workflow Designer. +- Users who choose High Contrast themes will see many improvements in the visibility of the Workflow Designer and its controls like better contrast ratios between elements and more noticeable selection boxes used for focus elements. + + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +If you have an application with a re-hosted workflow designer, your application can benefit from these changes by performing either of these actions: +- Recompile your application to target the .NET Framework 4.7.1. These accessibility changes are enabled by default. +- If your application targets the .NET Framework 4.7 or earlier but is running on the .NET Framework 4.7.1, you can opt out of these legacy accessibility behaviors by adding the following [AppContext switch](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) to the `` section of the app.config file and set it to `false`, as the following example shows. +``` + + + + + + + + + + +``` +Applications that target the .NET Framework 4.7.1 or later and want to preserve the legacy accessibility behavior can opt in to the use of legacy accessibility features by explicitly setting this AppContext switch to `true`. + + +### Affected APIs + * Not detectable via API analysis + +### Category +Windows Workflow Foundation (WF) + + + + diff --git a/Documentation/compatibility/workflow-now-throws-original-exception-instead-of-nullreferenceexception-in-some-cases.md b/Documentation/compatibility/workflow-now-throws-original-exception-instead-of-nullreferenceexception-in-some-cases.md new file mode 100644 index 000000000..1cfe389e9 --- /dev/null +++ b/Documentation/compatibility/workflow-now-throws-original-exception-instead-of-nullreferenceexception-in-some-cases.md @@ -0,0 +1,41 @@ +## Workflow now throws original exception instead of NullReferenceException in some cases + +### Scope +Minor + +### Version Introduced +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description + +In the .NET Framework 4.6.2 and earlier versions, when the Execute method of a +workflow activity throws an exception with a `null` value for the + property, the +System.Activities Workflow runtime throws a +, masking the original +exception. + +In the .NET Framework 4.7, the previously masked exception is thrown. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If your code relies on handling the +, change it to catch +the exceptions that could be thrown from your custom activities. + +### Affected APIs +* `M:System.Activities.CodeActivity.Execute(System.Activities.CodeActivityContext)` +* `M:System.Activities.AsyncCodeActivity.BeginExecute(System.Activities.AsyncCodeActivityContext,System.AsyncCallback,System.Object)` +* `M:System.Activities.AsyncCodeActivity`1.BeginExecute(System.Activities.AsyncCodeActivityContext,System.AsyncCallback,System.Object)` +* `M:System.Activities.WorkflowInvoker.Invoke` + +### Category +Windows Workflow Foundation (WF) + + diff --git a/Documentation/compatibility/workflow-sql-persistence-adds-primary-key-clusters-and-disallows-null-values-in-some-columns.md b/Documentation/compatibility/workflow-sql-persistence-adds-primary-key-clusters-and-disallows-null-values-in-some-columns.md new file mode 100644 index 000000000..a5a0a6498 --- /dev/null +++ b/Documentation/compatibility/workflow-sql-persistence-adds-primary-key-clusters-and-disallows-null-values-in-some-columns.md @@ -0,0 +1,31 @@ +## Workflow SQL persistence adds primary key clusters and disallows null values in some columns + +### Scope +Edge + +### Version Introduced +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description +Starting with the .NET Framework 4.7, the tables created for the SQL Workflow Instance Store +(SWIS) by the SqlWorkflowInstanceStoreSchema.sql script use clustered primary keys. Because of +this, identities do not support `null` values. The operation of SWIS is not impacted by this +change. The updates were made to support SQL Server Transactional Replication. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +The SQL file SqlWorkflowInstanceStoreSchemaUpgrade.sql must be applied to existing installations +in order to experience this change. New database installations will automatically have the change. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Workflow Foundation (WF) + + diff --git a/Documentation/compatibility/workflow-xaml-checksums-for-symbols-changed-from-sha1-to-sha256.md b/Documentation/compatibility/workflow-xaml-checksums-for-symbols-changed-from-sha1-to-sha256.md new file mode 100644 index 000000000..8ddcbc9cd --- /dev/null +++ b/Documentation/compatibility/workflow-xaml-checksums-for-symbols-changed-from-sha1-to-sha256.md @@ -0,0 +1,54 @@ +## Workflow XAML checksums for symbols changed from SHA1 to SHA256 + +### Scope +Minor + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +To support debugging with Visual Studio, +the Workflow runtime generates a checksum for a workflow XAML file using a hashing algorithm. +In the .NET Framework 4.6.2 and earlier versions, workflow checksum hashing used the MD5 +algorithm, which caused issues on FIPS-enabled systems. Starting with the .NET Framework 4.7, +the default algorithm was changed to SHA1. Starting with the .NET Framework 4.8, the default +algorithm was changed to SHA256. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +If your code is unable to load workflow instances or to find appropriate symbols +due to a checksum failure, try setting +the `AppContext` switch "Switch.System.Activities.UseSHA1HashForDebuggerSymbols" to true. + +In code: +```csharp +System.AppContext.SetSwitch("Switch.System.Activities.UseSHA1HashForDebuggerSymbols", true); +``` + +Or in configuration: +```xml + + + + + +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Workflow Foundation (WF) + + diff --git a/Documentation/compatibility/workflow-xoml-definition-and-sqltrackingservice-caches-changed-from-md5-to-sha256.md b/Documentation/compatibility/workflow-xoml-definition-and-sqltrackingservice-caches-changed-from-md5-to-sha256.md new file mode 100644 index 000000000..88eb04d82 --- /dev/null +++ b/Documentation/compatibility/workflow-xoml-definition-and-sqltrackingservice-caches-changed-from-md5-to-sha256.md @@ -0,0 +1,63 @@ +## Workflow XOML definition and SqlTrackingService cache keys changed from MD5 to SHA256 + +### Scope +Minor + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +The Workflow Runtime in keeps a cache of workflow definitions defined in XOML. +The SqlTrackingService also keeps a cache that is keyed by strings. +These caches are keyed by values that include checksum hash value. +In the .NET Framework 4.7.2 and earlier versions, this checksum hashing used the MD5 +algorithm, which caused issues on FIPS-enabled systems. Starting with the .NET Framework 4.8, +the algorithm used is SHA256. + +There shouldn't be an compatability issue with this change because the values are recalculated +each time the Workflow Runtime and SqlTrackingService is started. However, we have provided quirks to allow +customers to revert back to usage of the legacy hashing algorithm, if necessary. + +- [x] Quirked +- [ ] Build-time break // Causes a break if attempted to recompile + +### Recommended Action +If this change presents a problem when executing workflows, try setting one or both of +the `AppContext` switches: +- "Switch.System.Workflow.Runtime.UseLegacyHashForWorkflowDefinitionDispenserCacheKey" to true. +- "Switch.System.Workflow.Runtime.UseLegacyHashForSqlTrackingCacheKey" to true. + +In code: +```csharp +System.AppContext.SetSwitch("Switch.System.Workflow.Runtime.UseLegacyHashForWorkflowDefinitionDispenserCacheKey", true); +System.AppContext.SetSwitch("Switch.System.Workflow.Runtime.UseLegacyHashForSqlTrackingCacheKey", true); +``` + +Or in the configuration file (this needs to be in the config file for the application that is creating the object): +```xml + + + + + + +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Workflow Foundation (WF) + + + + diff --git a/Documentation/compatibility/workflow-xoml-file-checksums-changed-from-md5-to-sha256.md b/Documentation/compatibility/workflow-xoml-file-checksums-changed-from-md5-to-sha256.md new file mode 100644 index 000000000..f0da34b60 --- /dev/null +++ b/Documentation/compatibility/workflow-xoml-file-checksums-changed-from-md5-to-sha256.md @@ -0,0 +1,58 @@ +## Workflow XOML file checksums changed from MD5 to SHA256 + +### Scope +Minor + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +To support debugging XOML-based workflows with Visual Studio, +when workflow projects containing XOML files build, a checksum of the contents of the XOML file is included in the code +generated as a value. +In the .NET Framework 4.7.2 and earlier versions, this checksum hashing used the MD5 +algorithm, which caused issues on FIPS-enabled systems. Starting with the .NET Framework 4.8, +the algorithm used is SHA256. To be compatible with the WorkflowMarkupSourceAttribute.MD5Digest, +only the first 16 bytes of the generated checksum are used. + +This may cause problems during debugging. You may need to re-build your project. + +- [x] Quirked +- [ ] Build-time break // Causes a break if attempted to recompile + +### Recommended Action +If re-building your project does not solve the problem, try setting +the `AppContext` switch "Switch.System.Workflow.ComponentModel.UseLegacyHashForXomlFileChecksum" to true. + +In code: +```csharp +System.AppContext.SetSwitch("Switch.System.Workflow.ComponentModel.UseLegacyHashForXomlFileChecksum", true); +``` + +Or in a configuration file (this needs to be in MSBuild.exe.config for the MSBuild.exe that you are using): +```xml + + + + + +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Workflow Foundation (WF) + + + + diff --git a/Documentation/compatibility/workflowdesigner_load-doesn't-remove-symbol-property.md b/Documentation/compatibility/workflowdesigner_load-doesn't-remove-symbol-property.md new file mode 100644 index 000000000..6eafee8f3 --- /dev/null +++ b/Documentation/compatibility/workflowdesigner_load-doesn't-remove-symbol-property.md @@ -0,0 +1,43 @@ +## WorkflowDesigner.Load doesn't remove symbol property + +### Scope +Major + +### Version Introduced +4.5 + +### Version Reverted +4.5.2 + +### Source Analyzer Status +Planned + +### Change Description + +When targeting the .NET Framework 4.5 in the workflow designer, and loading a +re-hosted 3.5 workflow with the + +method, a +is thrown while saving the workflow. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +This bug only manifests when targeting .NET Framework 4.5 in the workflow designer, so it can be worked around by setting the `WorkflowDesigner.Context.Services.GetService().TargetFrameworkName` to the 4.0 .NET Framework. + +Alternatively, the issue may be avoided by using the + +method to load the workflow, instead of +. + +### Affected APIs +* `M:System.Activities.Presentation.WorkflowDesigner.Load` + +### Category +Windows Workflow Foundation (WF) + +[More information](https://connect.microsoft.com/VisualStudio/feedback/details/786503/) + + diff --git a/Documentation/compatibility/wpf-AppDomain-shutdown-handling-may-now-call-Dispatcher.Invoke-in-cleanup-of-WeakEvents.md b/Documentation/compatibility/wpf-AppDomain-shutdown-handling-may-now-call-Dispatcher.Invoke-in-cleanup-of-WeakEvents.md new file mode 100644 index 000000000..245bebf36 --- /dev/null +++ b/Documentation/compatibility/wpf-AppDomain-shutdown-handling-may-now-call-Dispatcher.Invoke-in-cleanup-of-WeakEvents.md @@ -0,0 +1,45 @@ +## WPF AppDomain Shutdown Handling May Now Call Dispatcher.Invoke in Cleanup of Weak Events + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +In .NET Framework 4.7.1 and earlier versions, WPF potentially creates a on the .NET finalizer thread during AppDomain shutdown. This was fixed in +.NET Framework 4.7.2 and later versions by making the cleanup of weak events thread-aware. Due to this, WPF may call to complete the cleanup process. + +In certain applications, this change in finalizer timing can potentially cause exceptions during AppDomain or process shutdown. This is generally seen in applications that do not correctly +shut down dispatchers running on worker threads prior to process or AppDomain shutdown. Such applications should take care to properly manage the lifetime of dispatchers. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +In .NET Framework 4.7.2 and later versions, developers can disable this fix in order to help alleviate (but not eliminate) timing issues that may occur due to the cleanup change. + +To disable the change in cleanup, use the following AppContext flag. + +```xml + + + + + +``` + +### Affected APIs +Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-HwndHost-child-hwnd-correct-size-during-DPI-changes.md b/Documentation/compatibility/wpf-HwndHost-child-hwnd-correct-size-during-DPI-changes.md new file mode 100644 index 000000000..e47479c52 --- /dev/null +++ b/Documentation/compatibility/wpf-HwndHost-child-hwnd-correct-size-during-DPI-changes.md @@ -0,0 +1,43 @@ +## HwndHost now correctly resizes child-HWND during DPI changes + +### Scope +Major + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +In .NET Framework 4.7.2 and earlier versions, when WPF was run in Per-Monitor Aware mode, controls hosted within were not sized correctly after DPI changes, such as when moving applications from one monitor to another. This fix ensures that hosted controls are sized appropriately. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +In order for the application to benefit from these changes, it must run on the .NET Framework 4.7.2 or later, and it must opt-in to this behavior by setting the following [AppContext Switch](https://docs.microsoft.com/dotnet/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element) in the `` section of the app config file to `false`, as the following example shows. + +```xml + + + + + + + + + + +``` + +### Category +WPF + + diff --git a/Documentation/compatibility/wpf-KB-focus-now-moves-correctly-across-hosting-scenarios.md b/Documentation/compatibility/wpf-KB-focus-now-moves-correctly-across-hosting-scenarios.md new file mode 100644 index 000000000..df12e2aea --- /dev/null +++ b/Documentation/compatibility/wpf-KB-focus-now-moves-correctly-across-hosting-scenarios.md @@ -0,0 +1,53 @@ +## Keyboard focus now moves correctly across multiple layers of WinForms/WPF hosting + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +Consider a WPF application hosting a WinForms control which in turn hosts WPF controls. Users may not be able to tab out of the WinForms layer if the first or last control in that layer is the WPF `System.Windows.Forms.Integration.ElementHost`. This change fixes this issue, and users are now able to tab out of the WinForms layer. + +Automated applications that rely on focus never escaping the WinForms layer may no longer work as expected. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +A developer who wants to utilize this change while targeting a framework version below .NET 4.7.2 can set the following set of AppContext flags to false for the change to be enabled. + +```xml + + + + + +``` + +WPF applications must opt in to all early accessibility improvements to get the later improvements. In other words, both the `Switch.UseLegacyAccessibilityFeatures` and the `Switch.UseLegacyAccessibilityFeatures.2` switches must be set + +A developer who requires the previous functionality while targeting .NET 4.7.2 or greater can set the following AppContext flag to true for the change to be disabled. + +```xml + + + + + +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-MarkupCompiler-default-hash-algorithm-is-now-SHA256.md b/Documentation/compatibility/wpf-MarkupCompiler-default-hash-algorithm-is-now-SHA256.md new file mode 100644 index 000000000..a312028ad --- /dev/null +++ b/Documentation/compatibility/wpf-MarkupCompiler-default-hash-algorithm-is-now-SHA256.md @@ -0,0 +1,50 @@ +## The default hash algorithm for WPF's Markup Compiler is now SHA256 + +### Scope +Transparent + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +The WPF MarkupCompiler provides compilation services for XAML markup files. In the .NET Framework 4.7.1 and earlier versions, the default hash algorithm used for checksums was SHA1. +Due to recent security concerns with SHA1, this default has been changed to SHA256 starting with the .NET Framework 4.7.2. This change affects all checksum generation for markup files during compilation. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +A developer who targets .NET Framework 4.7.2 or greater and wants to revert to SHA1 hashing behavior must set the following AppContext flag. + +```xml + + + + + +``` + +A developer who wants to utilize SHA256 hashing while targeting a framework version below .NET 4.7.2 must set the below AppContext flag. Note that the installed version of the .NET Framework must be 4.7.2 or greater. + +```xml + + + +``` + +where the DataContext is an `Order`. +WPF gets the value of the `OrderDetails` property - a collection D of all the `Detail` items whose `OrderID` +matches the `OrderID` of the master item. + +The behavior change arises when you change the primary key `OrderID` of the master item. +ADO automatically changes the `OrderID` of each of the affected records in the Details collection +(namely the ones copied into collection D). But what happens to D? + +- Old behavior: Collection D is cleared. The master item does _not_ raise a change notification for property `OrderDetails`. The ListBox continues to use collection D, which is now empty. + +- New behavior: Collection D is unchanged. Each of its items raises a change notification for the `OrderID` property. The ListBox continues to use collection D, and displays the details with the new `OrderID`. + +WPF implements the new behavior by creating collection D in a different way: by calling the ADO method + +with the `followParent` argument set to `true`. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +An app gets the new behavior by using the following AppContext switch. + +```xml + + + + + + +``` + +The switch defaults to `true` (old behavior) for apps that target .NET 4.7.1 or below, +and to `false` (new behavior) for apps that target .NET 4.7.2 or above. + +### Affected APIs +Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + diff --git a/Documentation/compatibility/wpf-PackageDigitalSignatureManager.DefaultHashAlgorithm-is-now-SHA256.md b/Documentation/compatibility/wpf-PackageDigitalSignatureManager.DefaultHashAlgorithm-is-now-SHA256.md new file mode 100644 index 000000000..a7fabb024 --- /dev/null +++ b/Documentation/compatibility/wpf-PackageDigitalSignatureManager.DefaultHashAlgorithm-is-now-SHA256.md @@ -0,0 +1,41 @@ +## The default hash algorithm for WPF PackageDigitalSignatureManager is now SHA256 + +### Scope +Edge + +### Version Introduced +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +The `System.IO.Packaging.PackageDigitalSignatureManager` provides functionality for digital signatures in relation to WPF packages. In the .NET Framework 4.7 and earlier versions, the default algorithm () +used for signing parts of a package was SHA1. Due to recent security concerns with SHA1, this default has been changed to SHA256 starting with the .NET Framework 4.7.1. This change affects all package signing, including XPS documents. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +A developer who wants to utilize this change while targeting a framework version below .NET Framework 4.7.1 or a developer who requires the previous functionality while targeting .NET Framework 4.7.1 or greater +can set the following AppContext flag appropriately. A value of true will result in SHA1 being used as the default algorithm; false results in SHA256. + +```xml + + + + + +``` + +### Affected APIs +P:System.IO.Packaging.PackageDigitalSignatureManager.DefaultHashAlgorithm + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-SelectionTextBrush-property-for-non-adorner-selection.md b/Documentation/compatibility/wpf-SelectionTextBrush-property-for-non-adorner-selection.md new file mode 100644 index 000000000..49872a3c3 --- /dev/null +++ b/Documentation/compatibility/wpf-SelectionTextBrush-property-for-non-adorner-selection.md @@ -0,0 +1,45 @@ +## Add SelectionTextBrush public property to TextBox/PasswordBox non-adorner selection + +### Scope +Major + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +In WPF applications using [non-adorner based text selection](https://github.com/Microsoft/dotnet/blob/master/Documentation/compatibility/wpf-TextBox-PasswordBox-text-selection-does-not-follow-system-colors.md) for [TextBox](xref:System.Windows.Controls.TextBox) and [PasswordBox](xref:System.Windows.Controls.PasswordBox), developers may now set the newly added SelectionTextBrush property in order to alter the rendering of the selected text. By default, this color changes with [SystemColors.HighlightTextBrushKey](xref:System.Windows.SystemColors.HighlightTextBrushKey). If non-adorner based text selection is not enabled, this property does nothing. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +Once non-adorner based text selection is enabled, you can use the and [TextBox.SelectionTextBrush](xref:System.Windows.Controls.Primitives.TextBoxBase.SelectionTextBrush) property to change the appearance of the selected text. This can be achieved using XAML: + + +```xaml + + This is some text. + +``` + + +### Affected APIs +* `F:System.Windows.Controls.Primitives.TextBoxBase.SelectionTextBrushProperty` +* `P:System.Windows.Controls.Primitives.TextBoxBase.SelectionTextBrush` +* [System.Windows.Controls.TextBox](xref:System.Windows.Controls.TextBox) +* [System.Windows.Controls.PasswordBox](xref:System.Windows.Controls.PasswordBox) + +### Category +WPF + + diff --git a/Documentation/compatibility/wpf-TextBox-PasswordBox-text-selection-does-not-follow-system-colors.md b/Documentation/compatibility/wpf-TextBox-PasswordBox-text-selection-does-not-follow-system-colors.md new file mode 100644 index 000000000..895abe79d --- /dev/null +++ b/Documentation/compatibility/wpf-TextBox-PasswordBox-text-selection-does-not-follow-system-colors.md @@ -0,0 +1,41 @@ +## WPF TextBox/PasswordBox Text Selection Does Not Follow System Colors + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +In .NET Framework 4.7.1 and earlier versions, WPF `System.Windows.Controls.TextBox` and `System.Windows.Controls.PasswordBox` could only render a text selection in the Adorner layer. +In some system themes this would occlude text, making it hard to read. In .NET Framework 4.7.2 and later, developers have an option of enabling a non-Adorner-based selection rendering +scheme that alleviates this issue. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +A developer who wants to utilize this change must set the following AppContext flag appropriately. To utilize this feature, the installed .NET Framework version must be 4.7.2 or greater. + +To enabled the non-adorner-based selection, use the following AppContext flag. + +```xml + + + + + +``` + +### Affected APIs +Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + \ No newline at end of file diff --git a/Documentation/compatibility/wpf-accessibility-improvements-48.md b/Documentation/compatibility/wpf-accessibility-improvements-48.md new file mode 100644 index 000000000..75cfa99c7 --- /dev/null +++ b/Documentation/compatibility/wpf-accessibility-improvements-48.md @@ -0,0 +1,202 @@ +## Accessibility improvements in WPF + +### Scope +Major + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +**Tooltips show on Keyboard focus** +In .NET Framework 4.7.2 and earlier versions, tooltips only display when a user hovers the mouse cursor over a WPF control. Starting with .NET Framework 4.8, , tooltips are displayed on keyboard focus as well as via a keyboard shortcut. +To enable this feature, an application needs to target .NET Framework 4.8 or opt-in via [SystemColors.HighlightTextBrushKey](xref:System.Windows.SystemColors.HighlightTextBrushKey) `Switch.UseLegacyAccessibilityFeatures.3` and `Switch.UseLegacyToolTipDisplay`., as the following example shows: +```xml + + + + + + + + + +``` + +Once enabled, all controls containing a tooltip will display it once the control receives keyboard focus. The tooltip can be dismissed over time or when keyboard focus changes. Users can also dismiss the tooltip manually with a new keyboard shortcut, Ctrl + Shift + F10. Once the tooltip has been dismissed, it can be displayed again by using the same keyboard shortcut. + +Note: [RibbonToolTips](xref:System.Windows.Controls.Ribbon.RibbonToolTip) on [RibbonControls](xref:System.Windows.Controls.Ribbon.RibbonControl) don’t show on keyboard focus; they only show by using the keyboard shortcut. + +**Elements with Collapsed or Hidden visibility are no longer announced by screen readers** +User interfaces containing or elements can be misrepresented by screen readers if such elements are announced to the user. In .NET Framework 4.8, WPF no longer includes Collapsed or Hidden elements in the Control View of the UIAutomation tree, so that screen readers no longer announce these elements. + +**SizeOfSet and PositionInSet Support** +Windows 10 introduced the SizeOfSet and PositionInSet [UIAutomation properties](/windows/desktop/winauto/uiauto-automation-element-propids), which are used by applications to describe the count of items in a set. UIAutomation client applications such as screen readers can then query an application for these properties and announce an accurate representation of the application’s UI. + +This feature adds support for WPF applications to expose these two properties to UIAutomation. These two properties can be exposed to UIAutomation in either of two ways: + +- __Dependency Properties__
The [SizeOfSet](xref:System.Windows.Automation.AutomationProperties.SizeOfSetProperty) and [PositionInSet](xref:System.Windows.Automation.AutomationProperties.PositionInSetProperty) [dependency properties](xref:System.Windows.DependencyProperty) have been added to the class. A developer can set their values via XAML: +```xaml + + + +``` + + +- __AutomationPeer virtual methods__
The and virtual methods have been added to the class. A developer can provide values for `SizeOfSet` and `PositionInSet` by overriding these methods: +```csharp + public class MyButtonAutomationPeer : ButtonAutomationPeer + { + protected override int GetSizeOfSetCore() + { + // Call into your own logic to provide a value for SizeOfSet + return CalculateSizeOfSet(); + } + + protected override int GetPositionInSetCore() + { + // Call into your own logic to provide a value for PositionInSet + return CalculatePositionInSet(); + } + } +``` +- __Automatic Values__
Items in [ItemsControls](xref:System.Windows.Controls.ItemsControl) provide a value for these properties automatically without additional action from the developer. If an ItemsControl is grouped, the collection of groups is represented as a set, and each group is counted as a separate set, with each item inside that group providing its position inside that group as well as the size of the group. Automatic values are not affected by virtualization. Even if an item is not realized, it is still counted toward the total size of the set and affects the position in the set of its sibling items. + +**ControllerFor property support** +UIAutomation’s ControllerFor property returns an array of automation elements that are manipulated by the automation element that supports this property. This property is commonly used for Auto-suggest accessibility. ControllerFor is used when an automation element affects one or more segments of the application UI or the desktop. Otherwise, it is hard to associate the impact of the control operation with UI elements. This feature adds the ability for controls to provide a value for the ControllerFor property. + +A new virtual method has been added to the class: +```csharp + virtual protected List GetControlledPeersCore() +``` +To provide a value for the ControllerFor property, simply override this method and return a list of [AutomationPeers](xref:System.Windows.Automation.Peers.AutomationPeer) for the controls being manipulated by this : +```csharp +public class AutoSuggestTextBox: TextBox + { + protected override AutomationPeer OnCreateAutomationPeer() + { + return new AutoSuggestTextBoxAutomationPeer(this); + } + + public ListBox SuggestionListBox; + } + + internal class AutoSuggestTextBoxAutomationPeer : TextBoxAutomationPeer + { + public AutoSuggestTextBoxAutomationPeer(AutoSuggestTextBox owner) : base(owner) + { + } + + protected override List GetControlledPeersCore() + { + List controlledPeers = new List(); + AutoSuggestTextBox owner = Owner as AutoSuggestTextBox; + + controlledPeers.Add(UIElementAutomationPeer.CreatePeerForElement(owner.SuggestionListBox)); + return controlledPeers; + } + } +``` + +**The Name Automation property is now correctly propagated for the DatePicker and RibbonComboBox controls** +Starting with .NET Framework 4.8, the and controls reflect the value assigned to them when read by a screen reader. + +**Expanders in GroupItem headers are now announced by screen readers** +Starting with .NET Framework 4.8, an in a re-templated header is announced by screen readers. + +**Improved focus move logic when WPF is hosted in Windows Forms** +The focus no longer loops inside a WPF instead of breaking out of it under some hosting scenarios. + +**Changed the padding header in GridView to not focusable** +In the .NET Framework 4.7.2 and earlier versions, the automatically generated padding header in a control was focusable, creating a bad experience for keyboard-only users. Starting with .NET Framework 4.8, it is not focusable. + +**Fixed automation tree for plain ItemsControl** +Fixed an accessibility problem where the automation tree exposed for a plain (as opposed to a derived class like ListBox or DataGrid) was not correct. + +**Fixed bounding rectangles in Per-Monitor DPI** +In .NET Framework 4.7.2 and earlier versions, certain bounding rectangles around text are drawn incorrectly by Accessibility tools when WPF is run in Per-Monitor Aware mode. Starting with .NET Framework 4.8, they are drawn correctly. + +
+ +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +__How to opt in or out of these changes__ + +In order for the application to benefit from these changes, it must run on the .NET Framework 4.8 or later. The application can benefit from these changes in either of the following ways: +- It is recompiled to target the .NET Framework 4.8. These accessibility changes are enabled by default on WPF applications that target the .NET Framework 4.8 or later. +- It targets the .NET Framework 4.7.2 or an earlier version and opts out of the legacy accessibility behaviors by adding the following [AppContext switch](https://docs.microsoft.com/dotnet/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element) to the `` section of the app config file and setting it to `false`, as the following example shows. + +```xml + + + + + + + + + + +``` +Note that to opt in to the accessibility features added in .NET Framework 4.8, you must also opt in to the accessibility features of .NET Framework 4.7.2 and .NET Framework 4.7.1 as well. +Applications that target the .NET Framework 4.8 or later and want to preserve the legacy accessibility behavior can opt in to the use of legacy accessibility features by explicitly setting this AppContext switch to `true`. + +### Affected APIs + +* `M:System.Windows.Automation.Peers.AutomationPeer.GetSizeOfSetCore` +* `M:System.Windows.Automation.Peers.AutomationPeer.GetPositionInSetCore` +* `M:System.Windows.Automation.Peers.AutomationPeer.GetControlledPeersCore` +* `M:System.Windows.Automation.Peers.AutomationPeer.GetSizeOfSet` +* `M:System.Windows.Automation.Peers.AutomationPeer.GetPositionInSet` +* `M:System.Windows.Automation.Peers.AutomationPeer.GetControlledPeers` +* `M:System.Windows.Automation.Peers.ContentElementAutomationPeer.GetSizeOfSetCore` +* `M:System.Windows.Automation.Peers.ContentElementAutomationPeer.GetPositionInSetCore` +* `M:System.Windows.Automation.Peers.UIElementAutomationPeer.GetSizeOfSetCore` +* `M:System.Windows.Automation.Peers.UIElementAutomationPeer.GetPositionInSetCore` +* `M:System.Windows.Automation.Peers.UIElement3DAutomationPeer.GetSizeOfSetCore` +* `M:System.Windows.Automation.Peers.UIElement3DAutomationPeer.GetPositionInSetCore` +* `M:System.Windows.Automation.Peers.DataGridCellItemAutomationPeer.GetSizeOfSetCore` +* `M:System.Windows.Automation.Peers.DataGridCellItemAutomationPeer.GetPositionInSetCore` +* `M:System.Windows.Automation.Peers.DateTimeAutomationPeer.GetSizeOfSetCore` +* `M:System.Windows.Automation.Peers.DateTimeAutomationPeer.GetPositionInSetCore` +* `M:System.Windows.Automation.Peers.GroupItemAutomationPeer.GetSizeOfSetCore` +* `M:System.Windows.Automation.Peers.GroupItemAutomationPeer.GetPositionInSetCore` +* `M:System.Windows.Automation.Peers.ItemAutomationPeer.GetSizeOfSetCore` +* `M:System.Windows.Automation.Peers.ItemAutomationPeer.GetPositionInSetCore` +* `M:System.Windows.Automation.Peers.MenuItemAutomationPeer.GetSizeOfSetCore` +* `M:System.Windows.Automation.Peers.MenuItemAutomationPeer.GetPositionInSetCore` +* `F:System.Windows.Automation.AutomationProperties.SizeOfSetProperty` +* `M:System.Windows.Automation.AutomationProperties.SetSizeOfSet(System.Windows.DependencyObject,int)` +* `M:System.Windows.Automation.AutomationProperties.GetSizeOfSet(System.Windows.DependencyObject)` +* `F:System.Windows.Automation.AutomationProperties.PositionInSetProperty` +* `M:System.Windows.Automation.AutomationProperties.SetPositionInSet(System.Windows.DependencyObject,int)` +* `M:System.Windows.Automation.AutomationProperties.GetPositionInSet(System.Windows.DependencyObject)` +* `F:System.Windows.Automation.AutomationElement.SizeOfSetProperty` +* `F:System.Windows.Automation.AutomationElement.PositionInSetProperty` +* `F:System.Windows.Automation.AutomationElementIdentifiers.SizeOfSetProperty` +* `F:System.Windows.Automation.AutomationElementIdentifiers.PositionInSetProperty` +* `F:System.Windows.Automation.AutomationElementIdentifiers.ControllerForProperty` + +### Category +WPF + + diff --git a/Documentation/compatibility/wpf-accessibility-improvements.MD b/Documentation/compatibility/wpf-accessibility-improvements.MD new file mode 100644 index 000000000..413624958 --- /dev/null +++ b/Documentation/compatibility/wpf-accessibility-improvements.MD @@ -0,0 +1,104 @@ +## Accessibility improvements in WPF + +### Scope +Major + +### Version Introduced +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +__High Contrast improvements__
+ +- The focus for the control is now visible. In previous versions of the .NET Framework, it was not. +- The text in and controls when they are selected is now easier to see than in previous .NET Framework versions. +- The border of a disabled is now the same color as the disabled text. In previous versions of the .NET Framework, it was not. +- Disabled and focused buttons now use the correct theme color. In previous versions of the .NET Framework, they did not. +- The dropdown button is now visible when a control's style is set to , In previous versions of the .NET Framework, it was not. +- The sort indicator arrow in a control now uses theme colors. In previous versions of the .NET Framework, it did not. +- The default hyperlink style now changes to the correct theme color on mouse over. In previous versions of the .NET Framework, it did not. +- The Keyboard focus on radio buttons is now visible. In previous versions of the .NET Framework, it was not. +- The control's checkbox column now uses the expected colors for keyboard focus feedback. In previous versions of the .NET Framework, it did not. +- the Keyboard focus visuals are now visible on and controls. In previous versions of the .NET Framework, it was not.

+ +__Screen reader interaction improvements__
+ +- controls are now correctly announced as groups (expand/collapse) by screen readers. +- controls are now correctly announced as data grid cell (localized) by screen readers. +- Screen readers will now announce the name of an editable . +- controls are no longer announced as "no item in view" by screen readers.

+ + +__LiveRegion support__
+ +Screen readers such as Narrator help people know the UI contents of an application, usually by describing something about the UI that's currently focused, because that is probably the element of most interest to the user. However, if a UI element changes somewhere in the screen and it does not have the focus, the user may not be informed and miss important information. +LiveRegions are meant to solve this problem. A developer can use them to inform the screen reader or any other [UI Automation](~/docs/framework/ui-automation/ui-automation-overview.md) client that an important change has been made to a UI element. The screen reader can then decide how and when to inform the user of this change. + +The LiveSetting property also lets the screen reader know how important it is to inform the user of the change made to the UI. + + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +__How to opt in or out of these changes__
+ +In order for the application to benefit from these changes, it must run on the .NET Framework 4.7.1 or later. The application can benefit from these changes in either of the following ways: +- Target the .NET Framework 4.7.1. This is the recommended approach. These accessibility changes are enabled by default on WPF applications that target the .NET Framework 4.7.1 or later. +- It opts out of the legacy accessibility behaviors by adding the following [AppContext Switch](~/docs/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element.md) in the `` section of the app config file and setting it to `false`, as the following example shows. + + ```xml + + + + + + + + + + + ``` + +Applications that target the .NET Framework 4.7.1 or later and want to preserve the legacy accessibility behavior can opt in to the use of legacy accessibility features by explicitly setting this AppContext switch to ```true```.
+ +For an overview of UI automation, see the [UI Automation Overview](~/docs/framework/ui-automation/ui-automation-overview.md). + +### Affected APIs +* `F:System.Windows.Automation.AutomationElementIdentifiers.LiveSettingProperty` +* `F:System.Windows.Automation.AutomationElementIdentifiers.LiveRegionChangedEvent` +* `T:System.Windows.Automation.AutomationLiveSetting` +* `F:System.Windows.Automation.AutomationProperties.LiveSettingProperty` +* `M:System.Windows.Automation.AutomationProperties.SetLiveSetting(System.Windows.DependencyObject,System.Windows.Automation.AutomationLiveSetting)` +* `M:System.Windows.Automation.AutomationProperties.GetLiveSetting(System.Windows.DependencyObject)` +* `M:System.Windows.Automation.Peers.AutomationPeer.GetLiveSettingCore` + + + +### Category +WPF + + + + diff --git a/Documentation/compatibility/wpf-aero2-and-aerolite-themes-toggle-button-doesn't-show-any-state.md b/Documentation/compatibility/wpf-aero2-and-aerolite-themes-toggle-button-doesn't-show-any-state.md new file mode 100644 index 000000000..df15bb31f --- /dev/null +++ b/Documentation/compatibility/wpf-aero2-and-aerolite-themes-toggle-button-doesn't-show-any-state.md @@ -0,0 +1,38 @@ +## WPF Aero2 and AeroLite themes toggle button doesn't show any state + +### Scope +Major + +### Version Introduced +4.5 + +### Version Reverted +4.5 + +### Source Analyzer Status +Not planned + +### Change Description +In the .NET Framework 4.5, WPF's Aero2 and AeroLite themes do not show a difference between the 'on' and 'off' states of a toggle button. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This issue was fixed in a servicing update. Update the .NET Framework 4.5, or upgrade to .NET Framework 4.5.1 or later, to fix this issue. Alternatively, toggle buttons may be explicitly styled to work around this issue. + +### Affected APIs +* T:System.Windows.Controls.Primitives.ToggleButton +* M:System.Windows.Controls.Primitives.ToggleButton.#ctor + +### Category +Windows Presentation Foundation (WPF) + +[More information](https://stackoverflow.com/questions/12450751/togglebutton-doesnt-show-any-state) + + + + diff --git a/Documentation/compatibility/wpf-chained-popups-with-StaysOpen-false.md b/Documentation/compatibility/wpf-chained-popups-with-StaysOpen-false.md new file mode 100644 index 000000000..453bf4e25 --- /dev/null +++ b/Documentation/compatibility/wpf-chained-popups-with-StaysOpen-false.md @@ -0,0 +1,35 @@ +## Chained Popups with StaysOpen=False + +### Scope +Edge + +### Version Introduced +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +A Popup with StaysOpen=False is supposed to close when you click outside the Popup. +When two or more such Popups are chained (i.e. one contains another), there were many problems, including: + * Open two levels, click outside P2 but inside P1. Nothing happens. + * Open two levels, click outside P1. Both popups close. + * Open and close two levels. Then try to open P2 again. Nothing happens. + * Try to open three levels. You can't. (Either nothing happens or the first two levels close, depending on where you click.) +These cases (and other variants) now work as expected. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +### Affected APIs +* `P:System.Windows.Controls.Primitives.Popup.StaysOpen` + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/wpf-databinding-should-use-key-not-indexer.md b/Documentation/compatibility/wpf-databinding-should-use-key-not-indexer.md new file mode 100644 index 000000000..6fcafc963 --- /dev/null +++ b/Documentation/compatibility/wpf-databinding-should-use-key-not-indexer.md @@ -0,0 +1,40 @@ +## Data Binding improvement for KeyedCollection + +### Scope +Major + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +Fixed [Binding's](xref:System.Windows.Data.Binding) incorrect use of IList indexer when the source object declares a custom indexer with the same signature (e.g. KeyedCollection). + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +In order for an application that targets an older version to benefit from this change, it must run on the .NET Framework 4.8 or later, and it must opt in to the change by adding the following [AppContext switch](https://docs.microsoft.com/dotnet/framework/configure-apps/file-schema/runtime/appcontextswitchoverrides-element) to the `` section of the app config file and setting it to `false`: + +```xml + + + + + + + + + + +``` + +### Category +WPF + + diff --git a/Documentation/compatibility/wpf-datatemplate-elements-are-now-visible-to-uia.md b/Documentation/compatibility/wpf-datatemplate-elements-are-now-visible-to-uia.md new file mode 100644 index 000000000..e82b31b35 --- /dev/null +++ b/Documentation/compatibility/wpf-datatemplate-elements-are-now-visible-to-uia.md @@ -0,0 +1,39 @@ +## WPF DataTemplate elements are now visible to UIA + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +Previously, elements +were invisible to UI Automation. Beginning in 4.5, UI Automation will detect +these elements. This is useful in many cases, but can break tests that depend on +UIA trees not containing +elements. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +UI Automation tests for this app may need updated to account for the UIA tree now +including previously invisible + elements. For example, +tests that expect some elements to be next to each other may now need to expect +previously invisible UIA elements in between. Or tests that rely on certain +counts or indexes for UIA elements may need updated with new values. + +### Affected APIs +* `M:System.Windows.DataTemplate.#ctor` +* `M:System.Windows.DataTemplate.#ctor(System.Object)` + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/wpf-dispatchersynchronizationcontext_createcopy-now-returns-a-new-copy-instead-of-the-current-instance.md b/Documentation/compatibility/wpf-dispatchersynchronizationcontext_createcopy-now-returns-a-new-copy-instead-of-the-current-instance.md new file mode 100644 index 000000000..d7445a5f4 --- /dev/null +++ b/Documentation/compatibility/wpf-dispatchersynchronizationcontext_createcopy-now-returns-a-new-copy-instead-of-the-current-instance.md @@ -0,0 +1,45 @@ +## WPF DispatcherSynchronizationContext.CreateCopy now returns a new copy instead of the current instance + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +In the .NET Framework 4, + +returned a reference to the current instance, primarily as a performance +optimization. In the .NET Framework 4.5, it returns a new instance which makes +it possible for the first time to conclude that equal references indicate the +executing thread is in the correct synchronization context. It is unlikely that +code that checks the identity of these references will be affected, but because +of the change, code that calls + +should be tested as part of migration to the .NET Framework 4.5 or newer. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Be aware that + +will now return a new + object. +Previously, code that used equivalence of references generated this way was not +actually checking whether it was in the proper context, but does when built +against .NET Framework 4.5 or later. While unlikely to cause issues, exercising the +affected code paths should be enough to determine if this poses any problem. + +### Affected APIs +* `M:System.Windows.Threading.DispatcherSynchronizationContext.CreateCopy` + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/wpf-focus-visual-for-radiobutton-and-checkbox-displays-correctly-when-there-is-no-content.md b/Documentation/compatibility/wpf-focus-visual-for-radiobutton-and-checkbox-displays-correctly-when-there-is-no-content.md new file mode 100644 index 000000000..992d4c2ad --- /dev/null +++ b/Documentation/compatibility/wpf-focus-visual-for-radiobutton-and-checkbox-displays-correctly-when-there-is-no-content.md @@ -0,0 +1,56 @@ +## WPF FocusVisual for RadioButton and CheckBox Now Displays Correctly When The Controls Have No Content + +### Scope +Edge + +### Version Introduced +4.7.2 + +### Source Analyzer Status +NotPlanned + +### Change Description +In the .NET Framework 4.7.1 and earlier versions, WPF and have inconsistent and, in Classic and High Contrast themes, +incorrect focus visuals. These issues occur in cases where the controls do not have any content set. This can make the transition between themes confusing and the focus visual hard to see. +In the .NET Framework 4.7.2, these visuals are now more consistent across themes and more easily visible in Classic and High Contrast themes. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +A developer targeting .NET Framework 4.7.2 that wants to revert to the behavior in .NET 4.7.1 will need to set the following AppContext flag. + +```xml + + + + + +``` + +A developer who wants to utilize this change while targeting a framework version below .NET 4.7.2 must set the following AppContext flags. + +Note that all the flags must be set appropriately and the installed version of the .NET Framework must be 4.7.2 or greater. + +WPF applications are required to opt in to all earlier accessibility improvements to get the latest improvements. +To do this, ensure that both the AppContext switches 'Switch.UseLegacyAccessibilityFeatures' and 'Switch.UseLegacyAccessibilityFeatures.2' are set to false. + +```xml + + + + + +``` + +### Affected APIs +Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-grid-allocation-of-space-to-star-columns.md b/Documentation/compatibility/wpf-grid-allocation-of-space-to-star-columns.md new file mode 100644 index 000000000..e73d315b9 --- /dev/null +++ b/Documentation/compatibility/wpf-grid-allocation-of-space-to-star-columns.md @@ -0,0 +1,87 @@ +## WPF Grid allocation of space to star-columns + +### Scope +Minor + +### Version Introduced +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description + +Starting with the .NET Framework 4.7, WPF replaces the algorithm that + uses to allocate +space to *-columns. This will change the actual width assigned to *-columns in +a number of cases: + +- When one or more *-columns also have a minimum or maximum width that overrides the proportional allocation for that colum. (The minimum width can derive from an explicit MinWidth declaration, or from an implicit minimum obtained from the column's content. The maximum width can only be defined explicitly, from a MaxWidth declaration.) + +- When one or more *-columns declare an extremely large *-weight, greater than 10^298. + +- When the *-weights are sufficiently different to encounter floating-point instability (overflow, underflow, loss of precision). + +- When layout rounding is enabled, and the effective display DPI is sufficiently high. + +In the first two cases, the widths produced by the new algorithm can be significantly different from those produced by the old algorithm; in the last case, the difference will be at most one or two pixels.

+ +The new algorithm fixes several bugs present in the old algorithm: + +1. Total allocation to columns can exceed the Grid's width. This can occur when allocating space to a column whose proportional share is less than its minimum size. The algorithm allocates the minimum size, which decreases the space available to other columns. If there are no *-columns left to allocate, the total allocation will be too large. + +2. Total allocation can fall short of the Grid's width. This is the dual problem to #1, arising when allocating to a column whose proportional share is greater than its maximum size, with no *-columns left to take up the slack. + +3. Two *-columns can receive allocations not proportional to their *-weights. This is a milder version of #1/#2, arising when allocating to *-columns A, B, and C (in that order), where B's proportional share violates its min (or max) constraint. As above, this changes the space available to column C, who gets less (or more) proportional allocation than A did, + +4. Columns with extremely large weights (> 10^298) are all treated as if they had weight 10^298. Proportional differences between them (and between columns with slightly smaller weights) are not honored. + +5. Columns with inifinte weights are not handled correctly. [Actually you can't set a weight to Infinity, but this is an artificial restriction. The allocation code was trying to handle it, but doing a bad job.] + +6. Several minor problems while avoiding overflow, underflow, loss of precision and similar floating-point issues. + +7. Adjustments for layout rounding are incorrect at sufficiently high DPI. + +The new algorithm produces results that meet the following criteria:

+ +A. The actual width assigned to a *-column is never less than its minimum width nor greater than its maximum width.
+ +B. Each *-column that is not assigned its minimum or maximum width is assigned a width proportional to its *-weight. To be precise, if two columns are declared with width x* and y* respectively, and if neither column receives its minimum or maximum width, the actual widths v and w assigned to the columns are in the same proportion: v / w == x / y.
+ +C. The total width allocated to "proportional" *-columns is equal to the space available after allocating to the constrained columns (fixed, auto, and *-columns that are allocated their min or max width). This might be zero, for instance if the sum of the minimum widths exceeds the Grid's availbable width.
+ +D. All these statements are to be interpreted with respect to the "ideal" layout. When layout rounding is in effect, the actual widths can differ from the ideal widths by as much as one pixel.
+ +The old algorithm honored (A) but failed to honor the other criteria in the cases outlined above.

+ +Everything said about columns and widths in this article applies as well to rows and heights. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +By default, apps that target versions of the .NET Framework starting with the .NET Framework 4.7 will see the new algorithm, while apps that target the .NET Framework 4.6.2 or earlier versions will see the old algorithm.

+ +To override the default, use the following configuration setting: + +```xml + + + +``` + +The value `true` selects the old algorithm, `false` selects the new algorithm. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-grid-row-size-allocation-with-collapsed-element.md b/Documentation/compatibility/wpf-grid-row-size-allocation-with-collapsed-element.md new file mode 100644 index 000000000..4e07060e0 --- /dev/null +++ b/Documentation/compatibility/wpf-grid-row-size-allocation-with-collapsed-element.md @@ -0,0 +1,27 @@ +## Improvements to Grid star-rows space allocating algorithm + +### Scope +Major + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +Fixed a bug in the [algorithm for allocating sizes to *-rows](https://github.com/Microsoft/dotnet/blob/master/Documentation/compatibility/wpf-grid-allocation-of-space-to-star-columns.md) in a introduced in .NET Framework 4.7. In some cases, such as a Grid with `Height="Auto"` containing empty rows, rows were arranged at the wrong position, possibly outside the Grid altogether. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +In order for the application to benefit from these changes, it must run on the .NET Framework 4.8 or later. + +### Category +WPF + + diff --git a/Documentation/compatibility/wpf-hang-listbox-duplicate-valuetypes.md b/Documentation/compatibility/wpf-hang-listbox-duplicate-valuetypes.md new file mode 100644 index 000000000..6533345f3 --- /dev/null +++ b/Documentation/compatibility/wpf-hang-listbox-duplicate-valuetypes.md @@ -0,0 +1,24 @@ +## Fixed problem of unresponsiveness when ListBox contains duplicate value-types + +### Scope +Major + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +Fixed a problem where a virtualizing can become unresponsive during scrolling when its collection contains duplicate value-typed objects. + +- [ ] Quirked +- [ ] Build-time break + +### Category +WPF + + diff --git a/Documentation/compatibility/wpf-hang-when-resizing-a-grid.md b/Documentation/compatibility/wpf-hang-when-resizing-a-grid.md new file mode 100644 index 000000000..728070328 --- /dev/null +++ b/Documentation/compatibility/wpf-hang-when-resizing-a-grid.md @@ -0,0 +1,53 @@ +## Resizing a Grid can cause an application to become unresponsive + +### Scope +Edge + +### Version Introduced +4.7 + +### Version Reverted +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +An infinite loop can occur during layout of a `T:System.Windows.Controls.Grid` under the following +circumstances: + +* Row definitions contain two *-rows, both declaring a MinHeight and a MaxHeight. +* Content of the *-rows doesn't exceed the corresponding MaxHeight +* The Grid's available height is exceeded by the first MinHeight (plus any other fixed or Auto rows) +* The app targets .NET Framework 4.7, or opts in to the 4.7 allocation algorithm by setting + `Switch.System.Windows.Controls.Grid.StarDefinitionsCanExceedAvailableSpace=false` + +The loop would also happen with more than two rows, or in the analogous case for columns. + +The issue is fixed in .NET Framework 4.7.1. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Upgrade to .NET Framework 4.7.1. Alternatively, if you don't need the 4.7 allocation algorithm +you can use the following configuration setting: + +```xml + + + +``` + +### Affected APIs + * Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-keyboard-navigation-listbox-hyperlink.md b/Documentation/compatibility/wpf-keyboard-navigation-listbox-hyperlink.md new file mode 100644 index 000000000..7cdb86354 --- /dev/null +++ b/Documentation/compatibility/wpf-keyboard-navigation-listbox-hyperlink.md @@ -0,0 +1,24 @@ +## Keyboard navigation improvement in ListBox with Hyperlinks + +### Scope +Major + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +Fixed incorrect result of pressing an arrow key when the focus is on a hyperlink within an item that is not the selected item of the parent . + +- [ ] Quirked +- [ ] Build-time break + +### Category +WPF + + diff --git a/Documentation/compatibility/wpf-layout-rounding-of-margins-has-changed.md b/Documentation/compatibility/wpf-layout-rounding-of-margins-has-changed.md new file mode 100644 index 000000000..3dff6657d --- /dev/null +++ b/Documentation/compatibility/wpf-layout-rounding-of-margins-has-changed.md @@ -0,0 +1,45 @@ +## WPF layout rounding of margins has changed + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +Not planned + +### Change Description +The way in which margins are rounded and borders and the background inside of them has changed. As a result of this change: + +- The width or height of elements may grow or shrink by at most one pixel. +- The placement of an object can move by at most one pixel. +- Centered elements can be vertically or horizontally off center by at most one pixel. + +By default, this new layout is enabled only for apps that target the .NET Framework 4.6. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +Since this modification tends to eliminate clipping of the right or bottom of WPF controls at high DPIs, apps that target earlier versions of the .NET Framework but are running on the .NET Framework 4.6 can opt into this new behavior by adding the following line to the `` section of the app.config file: + +```xml +` +``` + +Apps that target the .NET Framework 4.6 but want WPF controls to render using the previous layout algorithm can do so by adding the following line to the `` section of the app.config file: + +```xml +`. +``` + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + +[More information](~/docs/framework/migration-guide/mitigation-wpf-layout.md) + + diff --git a/Documentation/compatibility/wpf-nullreferenceexception-in-exception-handling-code-from-imagesourceconverter_convertfrom.md b/Documentation/compatibility/wpf-nullreferenceexception-in-exception-handling-code-from-imagesourceconverter_convertfrom.md new file mode 100644 index 000000000..30bafaeca --- /dev/null +++ b/Documentation/compatibility/wpf-nullreferenceexception-in-exception-handling-code-from-imagesourceconverter_convertfrom.md @@ -0,0 +1,55 @@ +## NullReferenceException in exception handling code from ImageSourceConverter.ConvertFrom + +### Scope +Edge + +### Version Introduced +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description + +An error in the exception handling code for + +caused an incorrect to +be thrown instead of the intended exception ( + or +). This change +corrects that error so that the method now throws the right exception.

+ +By default all applications targeting .NET Framework 4.6.2 and earlier continue to throw for +compatibility. Developers targeting .NET Framework 4.7 and above should see the +right exceptions. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +Developers who wish to revert to getting + when targeting .NET +Framework 4.7 or later can add/merge the following to their application's App.config +file: + +```xml + + + + + +``` + +### Affected APIs +- `M:System.Windows.Media.ImageSourceConverter.ConvertFrom(System.ComponentModel.ITypeDescriptorContext,System.Globalization.CultureInfo,System.Object)` + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-pencontext-disable-method-calls-on-touch-enabled-systems-may-throw-argumentexception.md b/Documentation/compatibility/wpf-pencontext-disable-method-calls-on-touch-enabled-systems-may-throw-argumentexception.md new file mode 100644 index 000000000..354560221 --- /dev/null +++ b/Documentation/compatibility/wpf-pencontext-disable-method-calls-on-touch-enabled-systems-may-throw-argumentexception.md @@ -0,0 +1,37 @@ +## Calls to System.Windows.Input.PenContext.Disable on touch-enabled systems may throw an ArgumentException + +### Scope +Edge + +### Version Introduced +4.6.1 + +### Version Reverted +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description +Under some circumstances, calls to the internal **System.Windows.Intput.PenContext.Disable** method on touch-enabled systems may throw an unhandled `T:System.ArgumentException` because of reentrancy. + +- [ ] Quirked +- [X] Build-time break + +### Recommended Action +This issue has been addressed in the .NET Framework 4.7. To prevent the exception, upgrade to a version of the .NET Framework starting with the .NET Framework 4.7. + +### Affected APIs +Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + + + diff --git a/Documentation/compatibility/wpf-performace-improvement-grouping-automation.md b/Documentation/compatibility/wpf-performace-improvement-grouping-automation.md new file mode 100644 index 000000000..68652bb64 --- /dev/null +++ b/Documentation/compatibility/wpf-performace-improvement-grouping-automation.md @@ -0,0 +1,24 @@ +## Performance improvement in Automation tree for grouping ItemsControls + +### Scope +Major + +### Version Introduced +4.8 + +### Source Analyzer Status +NotPlanned + +### Change Description +Improved the performance of rebuilding the automation tree of an , such as a ListBox or DataGrid, in which grouping is enabled. + +- [ ] Quirked +- [ ] Build-time break + +### Category +WPF + + diff --git a/Documentation/compatibility/wpf-pointer-based-touch-stack.md b/Documentation/compatibility/wpf-pointer-based-touch-stack.md new file mode 100644 index 000000000..b10db0870 --- /dev/null +++ b/Documentation/compatibility/wpf-pointer-based-touch-stack.md @@ -0,0 +1,56 @@ +## WPF Pointer-Based Touch Stack + +### Scope +Edge + +### Version Introduced +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description +This change adds the ability to enable an optional WM_POINTER based WPF touch/stylus stack. Developers that do not explicitly enable this should see no change in WPF touch/stylus behavior. + +Current Known Issues With optional WM_POINTER based touch/stylus stack: +- No support for real-time inking. + - While inking and StylusPlugins will still work, they will be processed on the UI Thread which can lead to poor performance. +- Behavioral changes due to changes in promotion from touch/stylus events to mouse events + - Manipulation may behave differently + - Drag/Drop will not show appropriate feedback for touch input + - This does not affect stylus input + - Drag/Drop can no longer be initiated on touch/stylus events + - This can potentially cause the application to stop responding until mouse input is detected. + - Instead, developers should initiate drag and drop from mouse events. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +Developers who wish to enable this stack can add/merge the following to their application's App.config file: + +```xml + + + + + +``` + +Removing this or setting the value to false will turn this optional stack off. + +Note that this stack is available only on Windows 10 Creators Update and above. + +### Affected APIs +Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-printing-stack-update.md b/Documentation/compatibility/wpf-printing-stack-update.md new file mode 100644 index 000000000..f0f03f848 --- /dev/null +++ b/Documentation/compatibility/wpf-printing-stack-update.md @@ -0,0 +1,38 @@ +## WPF Printing Stack Update + +### Scope +Edge + +### Version Introduced +4.7 + +### Source Analyzer Status +NotPlanned + +### Change Description + +WPF's Printing APIs using +now call Window's Print Document Package API in favor of the now deprecated XPS +Print API. The change was made with serviceability in mind; neither users nor developers +should see any changes in behavior or API usage. The new printing +stack is enabled by default when running in Windows 10 Creators Update. The old +printing stack will still continue to work just as before in older Windows +versions. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +To use the old stack in Windows 10 Creators Update, set the `UseXpsOMPrinting` REG_DWORD value of the `HKEY_CURRENT_USER\Software\Microsoft\.NETFramework\Windows Presentation Foundation\Printing` registry key to `1`. + +### Affected APIs +Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + +### Original Bug +https://devdiv.visualstudio.com/DevDiv/_workitems?id=113979 + + diff --git a/Documentation/compatibility/wpf-selector-crash-when-removing-item-from-custom-collection.md b/Documentation/compatibility/wpf-selector-crash-when-removing-item-from-custom-collection.md new file mode 100644 index 000000000..26006755f --- /dev/null +++ b/Documentation/compatibility/wpf-selector-crash-when-removing-item-from-custom-collection.md @@ -0,0 +1,50 @@ +## Crash in Selector when removing an item from a custom INCC collection + +### Scope +Minor + +### Version Introduced +4.7 + +### Version Reverted +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +An `T:System.InvalidOperationException` can occur in the following scenario: + * The ItemsSource for a `T:System.Windows.Controls.Primitives.Selector` is a collection with a custom + implementation of `T:System.Collections.Specialized.INotifyCollectionChanged`. + * The selected item is removed from the collection. + * The `T:System.Collections.Specialized.NotifyCollectionChangedEventArgs` has + `P:System.Collections.Specialized.NotifyCollectionChangedEventArgs.OldStartingIndex` = -1 + (indicating an unknown position). + +The exception's callstack begins + at System.Windows.Threading.Dispatcher.VerifyAccess() + at System.Windows.DependencyObject.GetValue(DependencyProperty dp) + at System.Windows.Controls.Primitives.Selector.GetIsSelected(DependencyObject element) + +This exception can occur in .NET Framework 4.5 if the application has more than one Dispatcher thread. +In .NET Framework 4.7 the exception can also occur in applications with a single Dispatcher thread. +The issue is fixed in .NET Framework 4.7.1. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Upgrade to .NET Framework 4.7.1. + +### Affected APIs + * Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-selector-selectionchanged-and-selectedvalue.md b/Documentation/compatibility/wpf-selector-selectionchanged-and-selectedvalue.md new file mode 100644 index 000000000..c1e2d8b1f --- /dev/null +++ b/Documentation/compatibility/wpf-selector-selectionchanged-and-selectedvalue.md @@ -0,0 +1,58 @@ +## Selector SelectionChanged event and SelectedValue property + +### Scope +Minor + +### Version Introduced +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +Starting with the .NET Framework 4.7.1, a always updates the value of its + property before raising the + event, when its selection changes. +This makes the SelectedValue property consistent with the other selection properties +( and +), which are updated before raising the event.

+ +In the .NET Framework 4.7 and earlier versions, the update to SelectedValue happened before the event in most cases, but it happened +after the event if the selection change was caused by changing the + property. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +Apps that target the .NET Framework 4.7.1 or later can opt out of this change and use legacy behavior +by adding the following to the `` section of the application configuration file: + + ```xml + + + + ``` + +Apps that target the .NET Framework 4.7 or earlier but are running on the .NET Framework 4.7.1 or later can enable the new behavior by adding the following line to the `` section of the application .configuration file: + + ```xml + + + + ``` + +### Affected APIs +* `P:System.Windows.Controls.TabControl.SelectedContent` +* `E:System.Windows.Controls.Primitives.Selector.SelectionChanged` + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-spawns-a-wisptis_exe-process-which-can-freeze-the-mouse.md b/Documentation/compatibility/wpf-spawns-a-wisptis_exe-process-which-can-freeze-the-mouse.md new file mode 100644 index 000000000..d3433d553 --- /dev/null +++ b/Documentation/compatibility/wpf-spawns-a-wisptis_exe-process-which-can-freeze-the-mouse.md @@ -0,0 +1,32 @@ +## WPF spawns a wisptis.exe process which can freeze the mouse + +### Scope +Major + +### Version Introduced +4.5.2 + +### Version Reverted +4.6 + +### Source Analyzer Status +Not planned + +### Change Description +An issue was introduced in 4.5.2 that causes `wisptis.exe` to be spawned that can freeze mouse input. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +A fix for this issue is available in a servicing release of the .NET Framework 4.5.2 (hotfix rollup 3026376), or by upgrading to the .NET Framework 4.6 + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/927119/net-framework-4-5-2-causes-applications-using-wpf-to-spawn-a-wisptis-exe-process-which-can-freeze-the-mouse) + + diff --git a/Documentation/compatibility/wpf-spell-checking-fail-in-unexpected-ways.md b/Documentation/compatibility/wpf-spell-checking-fail-in-unexpected-ways.md new file mode 100644 index 000000000..8cdf2e53a --- /dev/null +++ b/Documentation/compatibility/wpf-spell-checking-fail-in-unexpected-ways.md @@ -0,0 +1,44 @@ +## WPF Spell Checking fails in unexpected ways + +### Scope +Edge + +### Version Introduced +4.6.1 + +### Version Reverted +4.6.2 + +### Source Analyzer Status +Not planned + +### Change Description + +This includes a number of WPF Spell Checker issues: +- WPF Spell Checker sometimes throws +- WPF Spell Checker fails with when applications are launched using 'run as different user' +- WPF Spell Checker incorrectly identifies spelling errors in compound words like 'Hausnummer' in German. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Issue #1 - This has been fixed in .NET Framework 4.6.2 +Issue #2 - WPF Spell Checker is no longer supported when applications are launched using 'run as different user'. Starting .NET Framework 4.6.2, applications launched in this manner will no longer crash unexpectedly - instead the Spell Checker will be silently disabled. +Issue #3 - This has been fixed in .NET Framework 4.6.2. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-spell-checking-in-text-enabled-controls-will-not-work-in-windows-10-for-languages-not-in-the-input-language-list.md b/Documentation/compatibility/wpf-spell-checking-in-text-enabled-controls-will-not-work-in-windows-10-for-languages-not-in-the-input-language-list.md new file mode 100644 index 000000000..d8f19ff51 --- /dev/null +++ b/Documentation/compatibility/wpf-spell-checking-in-text-enabled-controls-will-not-work-in-windows-10-for-languages-not-in-the-input-language-list.md @@ -0,0 +1,29 @@ +## WPF spell checking in text-enabled controls will not work in Windows 10 for languages not in the OS's input language list + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +Not planned + +### Change Description +When running on Windows 10, the spell checker may not work for WPF text-enabled controls because platform spell-checking capabilities are available only for languages present in the input languages list. + +In Windows 10, when a language is added to the list of available keyboards, Windows automatically downloads and installs a corresponding Feature on Demand (FOD) package that provides spell-checking capabilities. By adding the language to the input languages list, the spell checker will be supported. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Be aware that the language or text to be spell-checked must be added as an input language for spell-checking to work in Windows 10. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/wpf-tabcontrol-selectionchanged-and-selectedcontent.md b/Documentation/compatibility/wpf-tabcontrol-selectionchanged-and-selectedcontent.md new file mode 100644 index 000000000..676d747db --- /dev/null +++ b/Documentation/compatibility/wpf-tabcontrol-selectionchanged-and-selectedcontent.md @@ -0,0 +1,52 @@ +## TabControl SelectionChanged event and SelectedContent property + +### Scope +Minor + +### Version Introduced +4.7.1 + +### Source Analyzer Status +NotPlanned + +### Change Description +Starting with the .NET Framework 4.7.1, a updates the value of its + property before raising the + event, when its selection changes. + +In the .NET Framework 4.7 and earlier versions, the update to SelectedContent happened after the event. + +- [X] Quirked +- [ ] Build-time break + +### Recommended Action +Apps that target the .NET Framework 4.7.1 or later can opt out of this change and use legacy behavior +by adding the following to the `` section of the application configuration file: + + ```xml + + + + ``` + +Apps that target the .NET Framework 4.7 or earlier but are running on the .NET Framework 4.7.1 or later can enable the new behavior by adding the following line to the `` section of the application .configuration file: + + ```xml + + + + ``` + +### Affected APIs +* `P:System.Windows.Controls.TabControl.SelectedContent` +* `E:System.Windows.Controls.Primitives.Selector.SelectionChanged` + +### Category +Windows Presentation Foundation (WPF) + + + + diff --git a/Documentation/compatibility/wpf-textbox-defaults-to-undo-limit-of-100.md b/Documentation/compatibility/wpf-textbox-defaults-to-undo-limit-of-100.md new file mode 100644 index 000000000..7383b404f --- /dev/null +++ b/Documentation/compatibility/wpf-textbox-defaults-to-undo-limit-of-100.md @@ -0,0 +1,27 @@ +## WPF TextBox defaults to undo limit of 100 + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description +In .NET Framework 4.5, the default undo limit for a WPF textbox is 100 (as opposed to being unlimited in .NET Framework 4.0) + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +If an undo limit of 100 is too low, the limit can be set explicitly with + +### Affected APIs +* `T:System.Windows.Controls.TextBox` + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/wpf-textbox-selected-text-appears-a-different-color-when-the-text-box-is-inactive.md b/Documentation/compatibility/wpf-textbox-selected-text-appears-a-different-color-when-the-text-box-is-inactive.md new file mode 100644 index 000000000..22d071f95 --- /dev/null +++ b/Documentation/compatibility/wpf-textbox-selected-text-appears-a-different-color-when-the-text-box-is-inactive.md @@ -0,0 +1,33 @@ +## WPF TextBox selected text appears a different color when the text box is inactive + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +In .NET Framework 4.5, when a WPF text box control is inactive (it doesn't have focus), +the selected text inside the box will appear a different color than when the +control is active. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +The previous (.NET Framework 4.0) behavior may be restored by setting the + +property to `false`. + +### Affected APIs +* `T:System.Windows.Controls.TextBox` + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/wpf-textbox_text-can-be-out-of-sync-with-databinding.md b/Documentation/compatibility/wpf-textbox_text-can-be-out-of-sync-with-databinding.md new file mode 100644 index 000000000..724c9c1e6 --- /dev/null +++ b/Documentation/compatibility/wpf-textbox_text-can-be-out-of-sync-with-databinding.md @@ -0,0 +1,35 @@ +## WPF TextBox.Text can be out-of-sync with databinding + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +In some cases, the + +property reflects a previous value of the databound property value if the +property is modified during a databinding write operation. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +This should have no negative impact. However, you can restore the previous +behavior by setting the + +property to `false`. + +### Affected APIs +* `P:System.Windows.Controls.TextBox.Text` + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/wpf-treeviewitem-must-be-used-within-a-treeview.md b/Documentation/compatibility/wpf-treeviewitem-must-be-used-within-a-treeview.md new file mode 100644 index 000000000..12af653ef --- /dev/null +++ b/Documentation/compatibility/wpf-treeviewitem-must-be-used-within-a-treeview.md @@ -0,0 +1,50 @@ +## WPF TreeViewItem must be used within a TreeView + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +A change was introduced in 4.5 that restricts usage of + elements +outside of a . This +manifests under the following conditions: + +- 's visual parent is not a panel. (A generated for a will have a panel as its parent) +- The is a descendant of a acting as the "items host" for a list control (ListBox, DataGrid, ListView, etc.). Virtualization doesn't need to be enabled. +- The is item-scrolling (`ScrollUnit="Item"`). +- Someone calls `VirtualizingStackPanel.MakeVisible(v)` to scroll an element `v` into view. This can be done explicitly, or implicitly in a number of ways; perhaps the most common way is simply clicking on `v` to give it the keyboard focus. +- The visual-parent chain from `v` to the passes through the . + +In other words, this is seen when a + is used outside +of a , and the user +clicks on a descendant of the + to bring it +into view. If the + has no +focusable descendants, you'll never see this issue. An example of a situation +where this is hit is when a + is the root of +a DataTemplate. When this issue is hit, there is an InvalidCastException that +occurs within the WPF framework. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +A hotfix will be made available for this. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/wpf-windows-are-rendered-without-clipping-when-extending-outside-a-single-monitor.md b/Documentation/compatibility/wpf-windows-are-rendered-without-clipping-when-extending-outside-a-single-monitor.md new file mode 100644 index 000000000..1ff9793c4 --- /dev/null +++ b/Documentation/compatibility/wpf-windows-are-rendered-without-clipping-when-extending-outside-a-single-monitor.md @@ -0,0 +1,27 @@ +## WPF windows are rendered without clipping when extending outside a single monitor + +### Scope +Minor + +### Version Introduced +4.6 + +### Source Analyzer Status +Not planned + +### Change Description +In the .NET Framework 4.6 running on Windows 8 and above, the entire window is rendered without clipping when it extends outside of single display in a multi-monitor scenario. This is different from previous versions of the .NET Framework which would clip WPF windows that extended beyond a single display. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +This behavior (whether to clip or not) can be explicitly set using the `` element in `` in an application's configuration file, or by setting the `EnableMultiMonitorDisplayClipping` property at app startup. + +### Affected APIs +* Not detectable via API analysis + +### Category +Windows Presentation Foundation (WPF) + + diff --git a/Documentation/compatibility/x509certificate2_tostring(bool)-does-not-throw-now-when-dotnet-cannot-handle-the-certificate.md b/Documentation/compatibility/x509certificate2_tostring(bool)-does-not-throw-now-when-dotnet-cannot-handle-the-certificate.md new file mode 100644 index 000000000..eda3e6894 --- /dev/null +++ b/Documentation/compatibility/x509certificate2_tostring(bool)-does-not-throw-now-when-dotnet-cannot-handle-the-certificate.md @@ -0,0 +1,36 @@ +## X509Certificate2.ToString(Boolean) does not throw now when .NET cannot handle the certificate + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +Available + +### Change Description + +In .NET Framework 4.5.2 and earlier versions, this method would throw if `true` was passed for the verbose +parameter and there were certificates installed that weren't supported by the +.NET Framework. Now, the method will succeed and return a valid string that +omits the inaccessible portions of the certificate. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Any code depending on + +should be updated to expect that the returned string may exclude some +certificate data (such as public key, private key, and extensions) in some cases +in which the API would have previously thrown. + +### Affected APIs +* `M:System.Security.Cryptography.X509Certificates.X509Certificate2.ToString(System.Boolean)` + +### Category +Core + + diff --git a/Documentation/compatibility/x509certificateclaimset_findclaims-considers-all-claimtypes.md b/Documentation/compatibility/x509certificateclaimset_findclaims-considers-all-claimtypes.md new file mode 100644 index 000000000..28848e69d --- /dev/null +++ b/Documentation/compatibility/x509certificateclaimset_findclaims-considers-all-claimtypes.md @@ -0,0 +1,39 @@ +## X509CertificateClaimSet.FindClaims Considers All claimTypes + +### Scope +Minor + +### Version Introduced +4.6.1 + +### Source Analyzer Status +Planned + +### Change Description + +In apps that target the .NET Framework 4.6.1, if an X509 claim set is +initialized from a certificate that has multiple DNS entries in its SAN field, the + +method attempts to match the claimType argument with all the DNS entries. + +For apps that target previous versions of the .NET Framework, the + +method attempts to match the claimType argument only with the last DNS entry. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +This change only affects applications targeting the .NET Framework 4.6.1. This +change may be disabled (or enabled if targetting pre-4.6.1) with the +[DisableMultipleDNSEntries](~/docs/framework/migration-guide/mitigation-x509certificateclaimset-findclaims-method.md#mitigation) +compatibility switch. + +### Affected APIs +* `M:System.IdentityModel.Claims.X509CertificateClaimSet.FindClaims(System.String,System.String)` + +### Category +Windows Communication Foundation (WCF) + + diff --git a/Documentation/compatibility/xml-documents-are-now-consider-invalid-if-they-contains-transforms-that-are-not-allowed-on-digital-signatures.md b/Documentation/compatibility/xml-documents-are-now-consider-invalid-if-they-contains-transforms-that-are-not-allowed-on-digital-signatures.md new file mode 100644 index 000000000..afa7b7387 --- /dev/null +++ b/Documentation/compatibility/xml-documents-are-now-consider-invalid-if-they-contains-transforms-that-are-not-allowed-on-digital-signatures.md @@ -0,0 +1,51 @@ +## SignedXml and EncryptedXml Breaking Changes + +### Scope +Minor + +### Version Introduced +4.6.2 + +### Source Analyzer Status +Planned + +### Change Description + +In .NET Framework 4.6.2, Security fixes in + and + lead +to different run-time behaviors. For example, + +* If a document has multiple elements with the same `id` attribute and a + signature targets one of those elements as the root of the signature, the + document will now be considered invalid. +* Documents using non-canonical XPath transform algorithms in references are now + considered invalid. +* Documents using non-canonical XSLT transform algorithms in references are now + consider invalid. +* Any program making use of external resource detached signatures will be unable + to do so. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Developers might want to review the usage of + and +, as well as types +derived from since a document +receiver may not be able to process it. + +### Affected APIs + +* `T:System.Security.Cryptography.Xml.Transform` +* `T:System.Security.Cryptography.Xml.XmlDsigXPathTransform` +* `T:System.Security.Cryptography.Xml.XmlDsigXsltTransform` + +### Category +Security + +[More information](https://github.com/Microsoft/dotnet/blob/master/releases/net462/dotnet462-changes.md) + + diff --git a/Documentation/compatibility/xml-schema-validation-is-stricter.md b/Documentation/compatibility/xml-schema-validation-is-stricter.md new file mode 100644 index 000000000..f03765179 --- /dev/null +++ b/Documentation/compatibility/xml-schema-validation-is-stricter.md @@ -0,0 +1,27 @@ +## XML schema validation is stricter + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description +In the .NET Framework 4.5, XML schema validation is more strict. If you use xsd:anyURI to validate a URI such as a mailto protocol, validation fails if there are spaces in the URI. In previous versions of the .NET Framework, validation succeeded. The change affects only applications that target the .NET Framework 4.5. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action +If looser .NET Framework 4.0 validation is needed, the validating application can target version 4.0 of the .NET Framework. When retargeting to .NET Framework 4.5, however, code review should be done to be sure that invalid URIs (with spaces) are not expected as attribute values with the anyURI data type. + +### Affected APIs +* Not detectable via API analysis + +### Category +XML, XSLT + + diff --git a/Documentation/compatibility/xmlschemaexception-now-sets-line-positions-properly.md b/Documentation/compatibility/xmlschemaexception-now-sets-line-positions-properly.md new file mode 100644 index 000000000..57784c995 --- /dev/null +++ b/Documentation/compatibility/xmlschemaexception-now-sets-line-positions-properly.md @@ -0,0 +1,37 @@ +## XmlSchemaException now sets line positions properly + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +If the +value is passed to the Load method and a validation error occurs, the + +and +properties now contain line information. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Exception-handling code that assumes + +and +will not be set should be updated since these properties will now be set +properly when SetLineInfo is used while loading XML. + +### Affected APIs +* `F:System.Xml.Linq.LoadOptions.SetLineInfo` + +### Category +XML, XSLT + + diff --git a/Documentation/compatibility/xmlserializer-fails-while-serializing-a-type-that-hides-an-accessible-member-with-an-inaccessible-one.md b/Documentation/compatibility/xmlserializer-fails-while-serializing-a-type-that-hides-an-accessible-member-with-an-inaccessible-one.md new file mode 100644 index 000000000..640d93dc1 --- /dev/null +++ b/Documentation/compatibility/xmlserializer-fails-while-serializing-a-type-that-hides-an-accessible-member-with-an-inaccessible-one.md @@ -0,0 +1,55 @@ +## XmlSerializer fails while serializing a type that hides an accessible member with an inaccessible one + +### Scope +Minor + +### Version Introduced +4.5 + +### Source Analyzer Status +Planned + +### Change Description + +When serializing a derived type, the + can fail if +the type contains an inaccessible field or property that hides (via the 'new' +keyword) a field or property of the same name that was previously accessible +(public, for example) on the base type. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This problem can be solved by making the new, hiding member accessible to the + (by marking +it public, for example). + +Alternatively, the following config setting will revert to 4.0 + behavior, +which will fix the problem: + +```xml + + + +``` + +### Affected APIs +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.IO.Stream,System.Object)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.IO.TextWriter,System.Object)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.Object,System.Xml.Serialization.XmlSerializationWriter)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter,System.Object)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.IO.Stream,System.Object,System.Xml.Serialization.XmlSerializerNamespaces)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.IO.TextWriter,System.Object,System.Xml.Serialization.XmlSerializerNamespaces)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter,System.Object,System.Xml.Serialization.XmlSerializerNamespaces)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter,System.Object,System.Xml.Serialization.XmlSerializerNamespaces,System.String)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter,System.Object,System.Xml.Serialization.XmlSerializerNamespaces,System.String,System.String)` + +### Category +Serialization + +[More information](https://stackoverflow.com/questions/14689305/serialization-breaks-in-net-4-5) + + diff --git a/Documentation/compatibility/xmlserializer-serializes-fields-differently-in-4_5.md b/Documentation/compatibility/xmlserializer-serializes-fields-differently-in-4_5.md new file mode 100644 index 000000000..e808549d8 --- /dev/null +++ b/Documentation/compatibility/xmlserializer-serializes-fields-differently-in-4_5.md @@ -0,0 +1,53 @@ +## XmlSerializer serializes fields differently in .NET Framework 4.5 + +### Scope +Major + +### Version Introduced +4.5 + +### Version Reverted +4.5 + +### Source Analyzer Status +Not planned + +### Change Description + +Changes in the + in .NET +Framework 4.5 caused fields to be formatted differently in the serialized XML. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +This behavior was corrected in a servicing update of .NET Framework 4.5. Please +update the .NET Framework 4.5, or upgrade to .NET Framework 4.5.1 or later, to +fix this issue. Alternatively, the following config setting will revert to 4.0 + behavior: + +```xml + + + +``` + +### Affected APIs +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.IO.Stream,System.Object)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.IO.TextWriter,System.Object)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.Object,System.Xml.Serialization.XmlSerializationWriter)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter,System.Object)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.IO.Stream,System.Object,System.Xml.Serialization.XmlSerializerNamespaces)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.IO.TextWriter,System.Object,System.Xml.Serialization.XmlSerializerNamespaces)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter,System.Object,System.Xml.Serialization.XmlSerializerNamespaces)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter,System.Object,System.Xml.Serialization.XmlSerializerNamespaces,System.String)` +* `M:System.Xml.Serialization.XmlSerializer.Serialize(System.Xml.XmlWriter,System.Object,System.Xml.Serialization.XmlSerializerNamespaces,System.String,System.String)` + +### Categories +XML, XSLT + +[More information](http://connect.microsoft.com/VisualStudio/feedback/details/761786/net-4-5-xmlserializer-produces-different-output-from-4-0) + + diff --git a/Documentation/compatibility/xmltextreader-dtd-entity-expansion-is-limited-to-10000000-characters.md b/Documentation/compatibility/xmltextreader-dtd-entity-expansion-is-limited-to-10000000-characters.md new file mode 100644 index 000000000..cc74e2e43 --- /dev/null +++ b/Documentation/compatibility/xmltextreader-dtd-entity-expansion-is-limited-to-10000000-characters.md @@ -0,0 +1,49 @@ +## XmlTextReader DTD entity expansion is limited to 10,000,000 characters + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description +DTD entity expansion is now limited to 10,000,000 characters. Loading XML files without DTD entity expansion or with limited DTD entity expansion is unaffected. Files with DTD entities that expand to more than 10,000,000 characters fail to load, and now throw an exception. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +If the limit of DTD entity expansion is too low 10,000,000, the value can be +overridden with the + +property. An with the +proper +value can be passed to `XmlReader.Create` that takes + +(ie. ) + +### Affected APIs +* `T:System.Xml.XmlTextReader` +* `M:System.Xml.XmlTextReader.#ctor` +* `M:System.Xml.XmlTextReader.#ctor(System.IO.Stream)` +* `M:System.Xml.XmlTextReader.#ctor(System.IO.Stream,System.Xml.XmlNameTable)` +* `M:System.Xml.XmlTextReader.#ctor(System.IO.Stream,System.Xml.XmlNodeType,System.Xml.XmlParserContext)` +* `M:System.Xml.XmlTextReader.#ctor(System.IO.TextReader)` +* `M:System.Xml.XmlTextReader.#ctor(System.IO.TextReader,System.Xml.XmlNameTable)` +* `M:System.Xml.XmlTextReader.#ctor(System.String)` +* `M:System.Xml.XmlTextReader.#ctor(System.String,System.IO.Stream)` +* `M:System.Xml.XmlTextReader.#ctor(System.String,System.IO.Stream,System.Xml.XmlNameTable)` +* `M:System.Xml.XmlTextReader.#ctor(System.String,System.IO.TextReader)` +* `M:System.Xml.XmlTextReader.#ctor(System.String,System.IO.TextReader,System.Xml.XmlNameTable)` +* `M:System.Xml.XmlTextReader.#ctor(System.String,System.Xml.XmlNameTable)` +* `M:System.Xml.XmlTextReader.#ctor(System.String,System.Xml.XmlNodeType,System.Xml.XmlParserContext)` +* `M:System.Xml.XmlTextReader.#ctor(System.Xml.XmlNameTable)` + +### Category +XML, XSLT + + diff --git a/Documentation/compatibility/xmlwriter-throws-on-invalid-surrogate-pairs.md b/Documentation/compatibility/xmlwriter-throws-on-invalid-surrogate-pairs.md new file mode 100644 index 000000000..bb28580dc --- /dev/null +++ b/Documentation/compatibility/xmlwriter-throws-on-invalid-surrogate-pairs.md @@ -0,0 +1,63 @@ +## XmlWriter throws on invalid surrogate pairs + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +Planned + +### Change Description + +For apps that target the .NET Framework 4.5.2 or previous versions, writing an +invalid surrogate pair using exception fallback handling does not always throw +an exception. For apps that target the .NET Framework 4.6, attempting to write +an invalid surrogate pair throws an +. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +If necessary, this break can be avoided by targeting the .NET Framework 4.5.2 or +earlier. Alternatively, invalid surrogate pairs can be pre-processed into valid +xml prior to writing them. + +### Affected APIs +* `M:System.Xml.XmlWriter.WriteAttributeString(System.String,System.String)` +* `M:System.Xml.XmlWriter.WriteAttributeString(System.String,System.String,System.String)` +* `M:System.Xml.XmlWriter.WriteAttributeString(System.String,System.String,System.String,System.String)` +* `M:System.Xml.XmlWriter.WriteAttributeStringAsync(System.String,System.String,System.String,System.String)` +* `M:System.Xml.XmlWriter.WriteCData(System.String)` +* `M:System.Xml.XmlWriter.WriteCDataAsync(System.String)` +* `M:System.Xml.XmlWriter.WriteChars(System.Char[],System.Int32,System.Int32)` +* `M:System.Xml.XmlWriter.WriteCharsAsync(System.Char[],System.Int32,System.Int32)` +* `M:System.Xml.XmlWriter.WriteComment(System.String)` +* `M:System.Xml.XmlWriter.WriteCommentAsync(System.String)` +* `M:System.Xml.XmlWriter.WriteEntityRef(System.String)` +* `M:System.Xml.XmlWriter.WriteEntityRefAsync(System.String)` +* `M:System.Xml.XmlWriter.WriteRaw(System.Char[],System.Int32,System.Int32)` +* `M:System.Xml.XmlWriter.WriteProcessingInstruction(System.String,System.String)` +* `M:System.Xml.XmlWriter.WriteProcessingInstructionAsync(System.String,System.String)` +* `M:System.Xml.XmlWriter.WriteRaw(System.String)` +* `M:System.Xml.XmlWriter.WriteRawAsync(System.Char[],System.Int32,System.Int32)` +* `M:System.Xml.XmlWriter.WriteRawAsync(System.String)` +* `M:System.Xml.XmlWriter.WriteString(System.String)` +* `M:System.Xml.XmlWriter.WriteStringAsync(System.String)` +* `M:System.Xml.XmlWriter.WriteSurrogateCharEntity(System.Char,System.Char)` +* `M:System.Xml.XmlWriter.WriteSurrogateCharEntityAsync(System.Char,System.Char)` +* `M:System.Xml.XmlWriter.WriteValue(System.String)` + +### Category +XML, XSLT + + + + diff --git a/Documentation/compatibility/xsd-schema-validation-now-correctly-detects-violations-of-unique-constraints-if-compound-keys-are-used-and-one-key-is-empty.md b/Documentation/compatibility/xsd-schema-validation-now-correctly-detects-violations-of-unique-constraints-if-compound-keys-are-used-and-one-key-is-empty.md new file mode 100644 index 000000000..f62903026 --- /dev/null +++ b/Documentation/compatibility/xsd-schema-validation-now-correctly-detects-violations-of-unique-constraints-if-compound-keys-are-used-and-one-key-is-empty.md @@ -0,0 +1,36 @@ +## XSD Schema validation now correctly detects violations of unique constraints if compound keys are used and one key is empty + +### Scope +Edge + +### Version Introduced +4.6 + +### Source Analyzer Status +Available + +### Change Description + +Versions of the .NET Framework prior to 4.6 had a bug that caused XSD validation +to not detect unique constraints on compound keys if one of the keys was empty. +In the .NET Framework 4.6, this issue is corrected. This will result in more +correct validation, but it may also result in some XML not validating which +previously would have. + +- [x] Quirked +- [ ] Build-time break + +### Recommended Action + +If looser .NET Framework 4.0 validation is needed, the validating application +can target version 4.5 (or earlier) of the .NET Framework. When retargeting to +.NET Framework 4.6, however, code review should be done to be sure that duplicate compound +keys (as described in this issue's description) are not expected to validate. + +### Affected APIs +* Not detectable via API analysis + +### Category +XML, XSLT + + diff --git a/Documentation/compatibility/xslt-forward-compat-now-works.md b/Documentation/compatibility/xslt-forward-compat-now-works.md new file mode 100644 index 000000000..3f65d0413 --- /dev/null +++ b/Documentation/compatibility/xslt-forward-compat-now-works.md @@ -0,0 +1,32 @@ +## XSLT forward compat now works + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description +In the .NET Framework 4, XSLT 1.0 forward compatibility had the following issues: + +- Loading a style sheet failed if its version was set to 2.0 and the parser encountered an unrecognized XSLT 1.0 construct. +- The `xsl:sort` construct failed to sort data if the style sheet version was set to 1.1. + +In the .NET Framework 4.5, these issues have been fixed, and XSLT 1.0 forward compatibility mode works properly. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action +Most apps should be unaffected, however data will be sorted differently in some cases now that xsl:sort is respected. If `xsl:sort` is used in 1.1 style sheets, confirm that apps were not depending on the unsorted order of data. If apps rely on the 4.0 sorting behavior, remove `xsl:sort` from the style sheet. + +### Affected APIs +* `T:System.Xml.Xsl.XslCompiledTransform` + +### Category +XML, XSLT + + diff --git a/Documentation/compatibility/xslt-style-sheet-exception-message-changed.md b/Documentation/compatibility/xslt-style-sheet-exception-message-changed.md new file mode 100644 index 000000000..54b7a16c0 --- /dev/null +++ b/Documentation/compatibility/xslt-style-sheet-exception-message-changed.md @@ -0,0 +1,43 @@ +## XSLT style sheet exception message changed + +### Scope +Edge + +### Version Introduced +4.5 + +### Source Analyzer Status +Available + +### Change Description + +In the .NET Framework 4.5, the text of the error message when an XSLT file is +too complex is "The style sheet is too complex." In previous versions, the error +message was "XSLT compile error." Application code that depends on the text of +the error message will no longer work. However, the exception types remain the +same, so this change should have no real impact. + +- [ ] Quirked +- [ ] Build-time break + +### Recommended Action + +Update any app code depending on the exception message from this error condition +to expect the new message, or (even better) update the code to depend only on +the exception type (), +which has not changed. + +### Affected APIs +* `M:System.Xml.Xsl.XslCompiledTransform.Load(System.String)` +* `M:System.Xml.Xsl.XslCompiledTransform.Load(System.Type)` +* `M:System.Xml.Xsl.XslCompiledTransform.Load(System.Xml.XmlReader)` +* `M:System.Xml.Xsl.XslCompiledTransform.Load(System.Xml.XPath.IXPathNavigable)` +* `M:System.Xml.Xsl.XslCompiledTransform.Load(System.Reflection.MethodInfo,System.Byte[],System.Type[])` +* `M:System.Xml.Xsl.XslCompiledTransform.Load(System.String,System.Xml.Xsl.XsltSettings,System.Xml.XmlResolver)` +* `M:System.Xml.Xsl.XslCompiledTransform.Load(System.Xml.XmlReader,System.Xml.Xsl.XsltSettings,System.Xml.XmlResolver)` +* `M:System.Xml.Xsl.XslCompiledTransform.Load(System.Xml.XPath.IXPathNavigable,System.Xml.Xsl.XsltSettings,System.Xml.XmlResolver)` + +### Category +XML, XSLT + + diff --git a/Documentation/testing-with-ryujit.md b/Documentation/testing-with-ryujit.md new file mode 100644 index 000000000..1b8e2aad1 --- /dev/null +++ b/Documentation/testing-with-ryujit.md @@ -0,0 +1,231 @@ +.NET Framework - Troubleshooting RyuJIT +========================================== + +This document provides instructions to disable RyuJIT or one of its optimizations. This is useful if you experience unexpected product behavior after installing .NET Framework 4.6 or later and want to determine if RyuJIT is the cause of that behavioral change. RyuJIT is only used for 64-bit processes. This document does not describe troubleshooting problems with the 32-bit JIT or 32-bit applications. + +If you find a problem that appears to be a bug with the .NET JIT compiler, we want to know about it! Please report the bug at [Visual Studio Connect](https://connect.microsoft.com/VisualStudio) or as a [microsoft/dotnet issue](https://github.com/microsoft/dotnet/issues). + +**Important** Follow these steps in this document carefully. Serious problems might be +occur if you modify the registry incorrectly. Before you modify it, +[back up the registry](http://support.microsoft.com/kb/322756) so that it can be restored in case problems occur. + +**Note** The registry methods below use either `HKEY_LOCAL_MACHINE` or `HKEY_CURRENT_USER`. Using `HKEY_LOCAL_MACHINE` makes the setting applicable to the entire machine and all users. Using `HKEY_CURRENT_USER` makes the setting applicable to just the current user. + +In general, you should choose the least impactful option. Choose a per-application setting if possible, and only move to a per-user or per-machine setting if necessary. Note that per-application settings are not available for ASP.NET applications. + +Disable RyuJIT +============== + +**Note** For all these methods, all dynamic compilation is performed by the older +"legacy" JIT (sometimes known as JIT64). All NGEN compilation continues to use the new JIT, and all +existing NGEN images that have been compiled by the new JIT continue to be used. + +### Method 1: per-application config file + +Add the following text to the `.exe.config` file. Create + the indicated sections if they do not already exist. + + **Note** In this file name, `` represents the actual name of the + application. So, for example, for `MyApp.exe`, you will have `MyApp.exe.config`. + + + + + + + + Note that Method 1 does not apply to ASP.NET websites; you cannot use this method in web.config files. + + This method is preferable as it is scoped to just one application. + + The string "useLegacyJit" is case-sensitive. + +### Method 2: environment variable + +Set the following environment variable: + + COMPLUS_useLegacyJit=1 + + This method affects any environment that inherits this environment variable. This might be just a single + console session, or it might affect the entire machine, if you set the environment variable globally. + + The environment variable name is not case-sensitive. + +### Method 3: registry + +Using Registry Editor (regedit.exe), find either of the following subkeys: + + HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework + HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework + + Then, add the following: + + Value name: useLegacyJit + Type: DWORD (32-bit) Value (also called REG_WORD) + Value: 1 + + You can use the Windows REG.EXE tool to add this value from a command-line or scripting environment. For example: + + reg add HKLM\SOFTWARE\Microsoft\.NETFramework /v useLegacyJit /t REG_DWORD /d 1 + + In this case, `HKLM` is used instead of `HKEY_LOCAL_MACHINE`. Use `reg add /?` to see help on this syntax. + + The registry value name is not case-sensitive. + +Disable loading NGEN Images +=========================== + +If you encounter a bug when you use the new JIT, and if the bug manifests itself in a function in an NGEN native image (see [here](https://msdn.microsoft.com/en-us/library/6t9t5wcf(v=vs.110).aspx) for details), use any of the following methods to force certain named assemblies to be recompiled by the JIT and not use the existing native images. You will generally pair one of these methods with the same numbered method above to get an NGEN image to fall back to JIT compilation, and, in addition, do that JIT compilation with the legacy JIT. + +In the examples below, we wish to prevent using the NGEN images of three assemblies, named `assembly_one.dll`, `assembly_two.dll`, and `assembly_three.dll`. We specify these assemblies using simple assembly names (no public key token, no architecture, and so on). The assembly names are specified without using the `.dll` file name extension. + +### Method 1: : per-application config file + +Add the following text to the `.exe.config` file. Create + the indicated sections if they do not already exist. + + **Note** In this file name, `` represents the actual name of the application. + + + + + + + + + + + +### Method 2: environment variable + +Set the following environment variable: + + COMPLUS_DisableNativeImageLoadList=assembly_one;assembly_two;assembly_three + + **Note** This is a semicolon-delimited list of simple assembly names. + +### Method 3: registry + +Using Registry Editor (regedit.exe), find either of the following subkeys: + + HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework + HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework + + Then, add the following value: + + Value name: DisableNativeImageLoadList + Type: String Value (also known as REG_SZ) + Value: assembly_one;assembly_two;assembly_three + + **Note** This is a semicolon-delimited list of simple assembly names. + +Disabling the use of all NGEN images +==================================== + +To prevent any NGEN native image from being used, and force all code to be compiled with the JIT compiler, you can use the ZapDisable configuration variable, as follows. You might choose to do this as an experiment, to see if any NGEN native image contains generated code that is inducing a bug in your application. Generally, if an NGEN native image does have a problem, and the identity of that native image can be determined, using one of the `DisableNativeImageLoadList` mechanisms described above is preferable. + +**Note** This setting applies to both the 32-bit and 64-bit JIT. Thus, setting this globally will affect all 32-bit .NET applications as well. This is particularly true for **Method 2: environment variable**. + +**Note 2** NGEN provides significant performance improvements to .NET applications. Disabling the use of NGEN may result in significantly slower application startup times. + +### Method 1: per-application config file + +Add the following text to the `.exe.config` file. Create + the indicated sections if they do not already exist. + + **Note** In this file name, `` represents the actual name of the + application. So, for example, for `MyApp.exe`, you will have `MyApp.exe.config`. + + + + + + + + Note that Method 1 does not apply to ASP.NET websites; you cannot use this method in web.config files. + + This method is preferable as it is scoped to just one application. + +### Method 2: environment variable + +Set the following environment variable: + + COMPLUS_ZapDisable=1 + + This method affects any environment that inherits this environment variable. This might be just a single + console session, or it might affect the entire machine, if you set the environment variable globally. + +### Method 3: registry + +Using Registry Editor (regedit.exe), find either of the following subkeys: + + HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework + HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework + + Then, add the following: + + Value name: ZapDisable + Type: DWORD (32-bit) Value (also called REG_WORD) + Value: 1 + + **Note** Windows has both 32-bit and 64-bit registry sections. The addresses shown above use the 64-bit registry path, so they are appropriate for troubleshooting RyuJIT and not affecting 32-bit .NET applications. On a 64-bit machine, the 32-bit registry path for the `HKEY_LOCAL_MACHINE` case is `HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework`. + +Disable Tail Call Optimization +============================== + +"Tail call" is a code pattern that the JIT compiler can sometimes optimize to improve code performance. You can see some discussion about JIT and tail call [here](http://blogs.msdn.com/b/clrcodegeneration/archive/2010/05/07/jit-etw-tail-call-event-fail-reasons.aspx). You can disable tail call optimization in RyuJIT with the following instructions. + +* Using Registry Editor (regedit.exe), find either of the following subkeys: + + HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework + HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework + + Then, add the following value: + + Value name: TailCallOpt + Type: String Value (also known as REG_SZ) + Value: "0" (Double quotes are not required while entering the string value in Registry Editor) + +**Note** This will disable tail call optimization of a function when the JIT is invoked to compile it. Note that if your application is NGEN compiled, the JIT is not invoked after the NGEN compilation has completed. To affect the code compiled for NGEN, you must first remove your application from the NGEN native image cache using `ngen uninstall MyApp`. Then, set the registry key shown here. Finally, optionally, you can re-NGEN your app using `ngen install MyApp.exe`. + +Disabling all optimization of a function +======================================== + +If you determine that the JIT is incorrectly optimizing a particular function, you can selectively disable JIT optimization for that function by annotating that function with `MethodImplOptions.NoOptimization`. For example, in C#: + + using System.Runtime.CompilerServices; + ... + [MethodImplAttribute(MethodImplOptions.NoOptimization)] + static int add(int a, int b) + { + return a + b; + } + +In this case, the annotated `add` function will not be optimized. You can see more detail about `MethodImplAttribute` +[here](https://msdn.microsoft.com/library/system.runtime.compilerservices.methodimplattribute.aspx). + +This is only effective in solving a code generation problem if the incorrect code being generated by the JIT is due to optimization, as opposed to being due to unoptimized code generation. + +**Note** This method applies to all .NET JIT compilers. + +Disabling optimization of all functions +======================================= + +While troubleshooting, it might be useful to determine if *any* JIT optimization is causing problems. Instead of using the above `MethodImplAttribute` method above, you can set a single environment variable to disable all JIT optimization. Set this variable: + + COMPLUS_JitMinOpts=1 + +and run your application. + +Note that when you run your application under the Visual Studio debugger, it might disable JIT optimization to improve the debugging experience. In Visual Studio 2013 and before, JIT optimization is disabled by default. In Visual Studio 2015, it is not disabled by default. The option in Visual Studio is called "Suppress JIT optimization on module load". You can read about that [here](https://msdn.microsoft.com/library/ms241594.aspx). Note that the MSDN documentation is incorrect about the Visual Studio 2015 default. + +**Note** This method applies to all .NET JIT compilers. + +Additional Notes +================ + +If you are examining the registry, you might find the following registry value: + + HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\UseRyuJIT + +We urge you not to change this value. Instead, use the RyuJIT fallback mechanisms detailed above in this document. diff --git a/LICENSE b/LICENSE index 06ba91c16..b73b4a129 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 Microsoft Corporation + +Copyright (c) 2019 Microsoft Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index d00f88040..8dcf0443f 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,85 @@ # .NET Home -The dotnet repository is the starting point to engage in and learn about .NET -open source projects from [Microsoft](http://microsoft.github.io) and the [.NET Foundation](http://dotnet.github.io). You can -read the more detailed [Introduction to .NET Open Source](http://blogs.msdn.com/dotnet) -on the .NET blog. +This repository is a starting point to learn about and engage in [.NET](https://dot.net) and .NET open source projects. -## Finding .NET Open Source Projects +This repository is not an official .NET or .NET Framework support location, however, we will respond to issues filed here as best we can. Please file .NET product issues at main project repos below. -There are several open source .NET projects from Microsoft on GitHub and -CodePlex: +## In this repository -* [ASP.NET 5](https://github.com/aspnet/home) -* [EntityFramework](https://github.com/aspnet/EntityFramework) -* [.NET Core 5](https://github.com/dotnet/corefx) -* [.NET Compiler Platform ("Roslyn")](https://roslyn.codeplex.com) +- [.NET Framework Release Notes](releases/README.md) +- [.NET Framework Documentation](Documentation/README.md) +- [.NET Open Source Developer Projects](dotnet-developer-projects.md) +- [.NET Open Source Consumer Projects](dotnet-consumer-projects.md) +- [Free Services & Tools for Open Source .NET Projects](dotnet-free-oss-services.md) -Each one of these projects maps to one or more [.NET NuGet packages](http://blogs.msdn.com/b/dotnet/p/nugetpackages.aspx) -that are published on [NuGet.org](http://nuget.org/). +Please contribute to this repository via [pull requests](https://github.com/Microsoft/dotnet/pulls) -There are also many great open source .NET community projects, such as: +## Finding .NET Open Source Projects -* [Mono Project](https://github.com/mono/) -* [JSON.NET](http://json.net/) -* [MVVM Cross](https://github.com/MvvmCross/MvvmCross) -* [MVVM Light Toolkit](http://www.mvvmlight.net) -* [Glimpse](http://getglimpse.com) +Here are some excellent community-maintained lists of projects & libraries: -## How to Engage, Contribute and Provide Feedback +- [Awesome .NET](https://github.com/quozd/awesome-dotnet) +- [Awesome .NET MAUI](https://github.com/jsuarezruiz/awesome-dotnet-maui) +- [Awesome Blazor](https://github.com/AdrienTorris/awesome-blazor) -.NET open source projects from Microsoft (gladly) accept PRs and other contributions. To contribute to -ASP.NET 5 or EntityFramework, see [the ASP.NET Contributing Guide](https://github.com/aspnet/Home/blob/master/CONTRIBUTING.md). To contribute to .NET Core 5, see the [.NET Core Contributing Guide](CONTRIBUTING.md). +There are many projects that you can use and contribute to, some of which are listed below. Please do contribute to these projects! -You are also encouraged to start a discussion by posting on the [.NET Foundation Forums](http://forums.dotnetfoundation.org/) or filing an issue in the corresponding GitHub project. See the contributing guides for more details. +### .NET -## .NET Foundation +- [.NET (dotnet/core)](https://github.com/dotnet/core) +- [.NET Aspire (dotnet/aspire)](https://github.com/dotnet/aspire) +- [.NET MAUI (dotnet/maui)](https://github.com/dotnet/maui) +- [ASP.NET Core (dotnet/aspnetcore)](https://github.com/dotnet/aspnetcore) +- [C# (dotnet/csharplang)](https://github.com/dotnet/csharplang) +- [Entity Framework Core (dotnet/efcore)](https://github.com/dotnet/efcore) +- [F# (dotnet/fsharp)](https://github.com/dotnet/fsharp) +- [ML.NET (dotnet/machinelearning)](https://github.com/dotnet/machinelearning) +- [Roslyn Compiler Platform (dotnet/roslyn)](https://github.com/dotnet/roslyn) +- [Windows Forms (dotnet/winforms)](https://github.com/dotnet/winforms) +- [WPF (dotnet/wpf)](https://github.com/dotnet/wpf) -Most .NET open source projects at Microsoft have been contributed to the [.NET Foundation](http://www.dotnetfoundation.org/projects). There are two main .NET Foundation projects for Microsoft open source projects: -[ASP.NET Core 5 project](http://www.dotnetfoundation.org/aspnet-vnext) -and the [.NET Core 5 project](http://www.dotnetfoundation.org/netcore5). +### .NET Docs +- [.NET docs (dotnet/docs)](https://github.com/dotnet/docs) +- [.NET Aspire docs (dotnet/docs-aspire)](https://github.com/dotnet/docs-aspire) +- [.NET MAUI docs (dotnet/docs-maui)](https://github.com/dotnet/docs-maui) +- [ASP.NET Core docs (dotnet/AspNetCore.Docs)](https://github.com/dotnet/AspNetCore.Docs) +- [Entity Framework docs (dotnet/EntityFramework.Docs)](https://github.com/dotnet/EntityFramework.Docs) -## License +### .NET Framework -.NET open source projects typically use either the [MIT](LICENSE) or -[Apache 2](http://www.apache.org/licenses/LICENSE-2.0) licenses for code. Some -projects license documentation and other forms of content under -[Creative Commons Attribution 4.0](http://creativecommons.org/licenses/by/4.0/). -See specific projects to understand the license used. +- [.NET Framework docs (dotnet/docs)](https://github.com/dotnet/docs) +- [.NET Framework source code - read-only subset (microsoft/referencesource)](https://github.com/microsoft/referencesource) -## Understanding the Relationship between .NET Core and the .NET Framework +### Xamarin -.NET Core and the .NET Framework have (for the most part) a subset-superset relationship. .NET Core is named "Core" since it contains the core features from the .NET Framework, for both the runtime and framework libraries. For example, .NET Core and the .NET Framework share the GC, the JIT and types such as String and List. We'll continue improving these components for both .NET Core and .NET Framework. +- [Xamarin iOS + macOS (xamarin/xamarin-macios)](https://github.com/xamarin/xamarin-macios) +- [Xamarin Android (xamarin/xamarin-android)](https://github.com/xamarin/xamarin-android) +- [Xamarin.Forms (xamarin/Xamarin.Forms)](https://github.com/xamarin/Xamarin.Forms) +- [Mono Project](https://github.com/mono/) -.NET Core was created so that .NET could be open source, cross platform and be used in more resource-constrained environments. We have also published [.NET Reference Source](https://github.com/Microsoft/referencesource) under the MIT license, so that you and the community can port additional .NET Framework features to .NET Core. +### Community -## Understanding the Relationship between .NET Core and Mono +Here is a short list of projects to check out: -Mono is an important part of the .NET ecosystem, particularly for client scenarios (ex: Xamarin). We will look for ways to collaborate with Mono developers and encourage them to take our code to improve Mono. We will also look for opportunities to improve .NET Core with MIT-licensed Mono code. +* [.NET for Apache Spark](https://github.com/dotnet/spark) +* [Orleans](https://github.com/dotnet/orleans) +* [Exceptionless](https://github.com/exceptionless/Exceptionless) +* [Glimpse](https://github.com/Glimpse/Glimpse) +* [JSON.NET](https://github.com/JamesNK/Newtonsoft.Json) +* [MonoGame](https://github.com/MonoGame/MonoGame) +* [MVVM Cross](https://github.com/MvvmCross/MvvmCross) +* [ReactiveUI](https://github.com/reactiveui/ReactiveUI) + +There are additional templates available for `dotnet new`. For more information, see [Available templates for dotnet new](https://github.com/dotnet/templating/wiki/Available-templates-for-dotnet-new) -An important collaboration opportunity is making .NET Core NuGet packages (produced from this code) work on Mono. The SIMD NuGet package is a perfect example. +## .NET Foundation -## Learning about ASP.NET 5 and .NET Core 5 +Many .NET open source projects are part of the +[.NET Foundation](https://www.dotnetfoundation.org/projects). Microsoft has contributed many projects, including ASP.NET Core and +.NET Core. You may want to consider [joining the .NET Foundation](https://dotnetfoundation.org/community/). -ASP.NET 5 is a new cross-platform version of ASP.NET that is designed for -the cloud, and runs on Windows, Linux and Mac. It uses the .NET Framework to run on Windows, and can also run on .NET Core 5 for greater deployment flexibility on Windows. It currently uses Mono for Linux and Mac support but will move to .NET Core 5 for those platforms when they are supported. +Check out the [.NET Foundation Forums](https://forums.dotnetfoundation.org/) to see what others are talking about, or start a new discussion to ask a question or make a point. +## License -[ASP.NET 5](https://github.com/aspnet/home) and [.NET Core 5](https://github.com/dotnet/corefx) libraries are open source on GitHub. At present, only a few .NET Core 5 libraries are available on GitHub. The rest of the libraries, including the base runtime, will be added in the coming months. +This repository is licensed with the [MIT](LICENSE) license. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..869fdfe2b --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/opensource/security/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/opensource/security/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/opensource/security/pgpkey). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://aka.ms/opensource/security/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/opensource/security/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/opensource/security/cvd). + + diff --git a/data/platforms.json b/data/platforms.json new file mode 100644 index 000000000..6b57825d8 --- /dev/null +++ b/data/platforms.json @@ -0,0 +1,493 @@ +{ + "vsversions": [ + { + "alias": "VS2013", + "name": "Visual Studio 2013", + "download": "http://www.visualstudio.com/downloads" + }, + { + "alias": "VS2015", + "name": "Visual Studio 2015", + "download": "http://www.visualstudio.com/downloads" + }, + { + "alias": "VS2017", + "name": "Visual Studio 2017", + "download": "http://www.visualstudio.com/downloads" + } + ], + "platformcategories": [ + { + "alias": "netcore", + "name": ".NET Core" + }, + { + "alias": "netfx", + "name": ".NET Framework" + }, + { + "alias": "services", + "name": "Services" + }, + { + "alias": "devices", + "name": "Devices" + }, + { + "alias": "gaming", + "name": "Gaming" + } + ], + "platforms": [ + { + "platform": ".NET Core 2.0", + "category": "netcore", + "supportInfo": { + "support": "Supported", + "link": "" + }, + "popular": true, + "info": "https://blogs.msdn.microsoft.com/dotnet/2017/08/14/announcing-net-core-2-0/", + "includedIn": [], + "supportedBy": [ + "VS2017" + ], + "runtime": [ + { + "name": ".NET Core 2.0", + "link": "https://github.com/dotnet/core/blob/master/release-notes/download-archives/2.0.3.md" + } + ] + }, + { + "platform": ".NET Core 1.0 and 1.1", + "category": "netcore", + "supportInfo": { + "support": "Supported", + "link": "" + }, + "popular": true, + "info": "https://blogs.msdn.microsoft.com/dotnet/2017/03/07/announcing-net-core-tools-1-0/", + "includedIn": [ + "VS2017" + ], + "runtime": [ + { + "name": ".NET Core 1.0", + "link": "https://github.com/dotnet/core/releases/tag/1.0.8" + }, + { + "name": ".NET Core 1.1", + "link": "https://github.com/dotnet/core/releases/tag/1.1.5" + } + ] + }, + { + "platform": ".NET Framework 4.8", + "alias": "net48", + "category": "netfx", + "supportInfo": { + "support": "Supported", + "link": "" + }, + "popular": true, + "info": "http://go.microsoft.com/fwlink/?LinkId=2054306", + "supportedBy": [ + "VS2019", + "VS2017" + ], + "runtime": [ + { + "name": ".NET Framework 4.8", + "link": "http://go.microsoft.com/fwlink/?LinkId=2085155", + "directLink": "http://go.microsoft.com/fwlink/?LinkId=2085155&source=getdotnet&desc=dotnet48" + } + ], + "tools": [ + { + "name": ".NET Framework 4.8 Developer Pack", + "link": "http://go.microsoft.com/fwlink/?LinkId=2085167", + "description": "The .NET 4.8 Developer pack includes 4.8 reference assemblies needed by Visual Studio and msbuild." + } + ] + }, + { + "platform": ".NET Framework 4.7.2", + "alias": "net472", + "category": "netfx", + "supportInfo": { + "support": "Supported", + "link": "" + }, + "popular": true, + "info": "http://go.microsoft.com/fwlink/?LinkId=863281", + "includedIn": [ + "VS2019" + ], + "supportedBy": [ + "VS2017", + "VS2015" + ], + "runtime": [ + { + "name": ".NET Framework 4.7.2", + "link": "http://go.microsoft.com/fwlink/?LinkId=863262", + "directLink": "http://go.microsoft.com/fwlink/?LinkId=863262&source=getdotnet&desc=dotnet472" + } + ], + "tools": [ + { + "name": ".NET Framework 4.7.2 Developer Pack", + "link": "http://go.microsoft.com/fwlink/?LinkId=863261", + "description": "The .NET 4.7.2 Developer pack includes 4.7.2 reference assemblies needed by Visual Studio and msbuild." + } + ] + }, + { + "platform": ".NET Framework 4.7.1", + "alias": "net471", + "category": "netfx", + "supportInfo": { + "support": "Supported", + "link": "" + }, + "popular": true, + "info": "http://go.microsoft.com/fwlink/?LinkId=852091", + "includedIn": [ + "VS2017" + ], + "supportedBy": [ + "VS2015" + ], + "runtime": [ + { + "name": ".NET Framework 4.7.1", + "link": "http://go.microsoft.com/fwlink/?LinkId=852095", + "directLink": "http://go.microsoft.com/fwlink/?LinkId=852092&source=getdotnet&desc=dotnet471" + } + ], + "tools": [ + { + "name": ".NET Framework 4.7.1 Developer Pack", + "link": "http://go.microsoft.com/fwlink/?LinkId=852105", + "description": "The .NET 4.7.1 Developer pack includes 4.7.1 reference assemblies needed by Visual Studio and msbuild." + } + ] + }, + { + "platform": ".NET Framework 4.7", + "alias": "net47", + "category": "netfx", + "supportInfo": { + "support": "Supported", + "link": "" + }, + "popular": true, + "info": "http://go.microsoft.com/fwlink/?LinkID=825321", + "includedIn": [ + "VS2017" + ], + "supportedBy": [ + "VS2015" + ], + "runtime": [ + { + "name": ".NET Framework 4.7", + "link": "http://go.microsoft.com/fwlink/?LinkId=825299", + "directLink": "http://go.microsoft.com/fwlink/?LinkId=825302&source=getdotnet&desc=dotnet47" + } + ], + "tools": [ + { + "name": ".NET Framework 4.7 Developer Pack", + "link": "http://go.microsoft.com/fwlink/?LinkId=825319", + "description": "The .NET 4.7 Developer pack includes 4.7 reference assemblies needed by Visual Studio and msbuild." + } + ] + }, + { + "platform": ".NET Framework 4.6.2", + "alias": "net462", + "category": "netfx", + "supportInfo": { + "support": "Supported", + "link": "" + }, + "popular": true, + "info": "http://go.microsoft.com/fwlink/?LinkID=708776", + "includedIn": [ + "VS2017" + ], + "supportedBy": [ + "VS2015", + "VS2013" + ], + "runtime": [ + { + "name": ".NET Framework 4.6.2", + "link": "http://go.microsoft.com/fwlink/?LinkId=780597", + "directLink": "http://go.microsoft.com/fwlink/?LinkID=780596&source=getdotnet&desc=dotnet462" + } + ], + "tools": [ + { + "name": ".NET Framework 4.6.2 Developer Pack", + "link": "http://go.microsoft.com/fwlink/?LinkId=780617", + "description": "The .NET 4.6.2 Developer pack includes 4.6.2 reference assemblies needed by Visual Studio and msbuild." + } + ] + }, + { + "platform": ".NET Framework 4.6.1", + "alias": "net461", + "category": "netfx", + "supportInfo": { + "support": "Supported", + "link": "" + }, + "info": "http://blogs.msdn.com/b/dotnet/archive/2015/11/30/net-framework-4-6-1-is-now-available.aspx", + "includedIn": [ + "VS2017", + "VS2015" + ], + "supportedBy": [ + "VS2013" + ], + "runtime": [ + { + "name": ".NET Framework 4.6.1", + "link": "http://go.microsoft.com/fwlink/?LinkId=671729" + } + ], + "tools": [ + { + "name": ".NET Framework 4.6.1 Targeting Pack", + "link": "http://go.microsoft.com/fwlink/?LinkId=690706", + "description": "The .NET 4.6.1 Developer pack includes the 4.6.1 reference assemblies needed by Visual Studio and msbuild." + } + ] + }, + { + "platform": ".NET Framework 4.6", + "alias": "net46", + "category": "netfx", + "supportInfo": { + "support": "Supported", + "link": "" + }, + "info": "http://blogs.msdn.com/b/dotnet/archive/2015/07/20/announcing-net-framework-4-6.aspx", + "includedIn": [ + "VS2017", + "VS2015" + ], + "supportedBy": [ + "VS2013" + ], + "runtime": [ + { + "name": ".NET Framework 4.6", + "link": "http://go.microsoft.com/fwlink/?LinkId=528259" + } + ], + "tools": [ + { + "name": ".NET Framework 4.6 Targeting Pack", + "link": "http://go.microsoft.com/fwlink/?LinkId=528261", + "description": "The .NET 4.6 Developer pack includes the 4.6 reference assemblies needed by Visual Studio and msbuild." + } + ] + }, + { + "platform": ".NET Framework 4.5.2", + "alias": "net452", + "category": "netfx", + "supportInfo": { + "support": "Supported", + "link": "" + }, + "popular": true, + "info": "http://go.microsoft.com/fwlink/?LinkID=309958", + "includedIn": [ + "VS2017", + "VS2015" + ], + "supportedBy": [ + "VS2013" + ], + "runtime": [ + { + "name": ".NET Framework 4.5.2", + "link": "http://go.microsoft.com/fwlink/?LinkId=397674", + "directLink": "http://go.microsoft.com/fwlink/?LinkId=328855&source=getdotnet&desc=dotnet452" + } + ], + "tools": [ + { + "name": ".NET Framework 4.5.2 Developer Pack", + "link": "http://go.microsoft.com/fwlink/?LinkId=328857", + "description": "The .NET 4.5.2 Developer pack includes the .NET framework 4.5.2 runtime and targeting pack." + }, + { + "name": ".NET Framework 4.5.2 Language Packs", + "link": "http://go.microsoft.com/fwlink/?LinkId=328858", + "description": "Resources to support languages other than English." + } + ] + }, + { + "platform": ".NET Framework 2.0 + 3.5 SP1", + "alias": "net2", + "category": "netfx", + "supportInfo": { + "support": "Supported", + "link": "" + }, + "popular": true, + "info": "http://msdn.microsoft.com/library/w0x726c2(VS.90).aspx", + "includedIn": [], + "supportedBy": [ + "VS2019", + "VS2017", + "VS2015", + "VS2013" + ], + "runtime": [ + { + "name": ".NET Framework 3.5 SP1", + "link": "http://go.microsoft.com/fwlink/?LinkID=229190", + "directLink": "http://download.microsoft.com/download/2/0/E/20E90413-712F-438C-988E-FDAA79A8AC3D/dotnetfx35.exe?source=getdotnet&desc=dotnet35" + }, + { + "name": ".NET Framework 3.5 SP1 (Windows 8+)", + "link": "https://docs.microsoft.com/dotnet/framework/install/dotnet-35-windows-10" + } + ], + "tools": [] + }, + { + "platform": "Microsoft Azure", + "category": "services", + "info": "http://msdn.microsoft.com/library/azure", + "includedIn": [ + "VS2017" + ], + "supportedBy": [ + "VS2015", + "VS2013" + ], + "tools": [ + { + "name": "Azure SDK for .NET", + "link": "http://go.microsoft.com/fwlink/?LinkID=254336" + } + ] + }, + { + "platform": "Team Foundation Server", + "category": "services", + "info": "http://go.microsoft.com/fwlink/?LinkID=308920", + "includedIn": [ + "VS2015", + "VS2013", + "VS2012" + ], + "supportedBy": [] + }, + { + "platform": "Office 365, Office and SharePoint", + "category": "services", + "info": "http://go.microsoft.com/fwlink/?LinkID=308921", + "includedIn": [ + "VS2017", + "VS2015", + "VS2013" + ], + "supportedBy": [] + }, + { + "platform": "OneDrive", + "category": "services", + "info": "http://go.microsoft.com/fwlink/?LinkID=306598", + "includedIn": [], + "supportedBy": [ + "VS2017", + "VS2015", + "VS2013", + "VS2012" + ], + "tools": [ + { + "name": "Live SDK", + "link": "http://go.microsoft.com/fwlink/?LinkID=306598" + } + ] + }, + { + "platform": "Bing", + "category": "services", + "info": "http://www.bing.com/dev", + "includedIn": [], + "supportedBy": [ + "VS2017", + "VS2015", + "VS2013" + ] + }, + { + "platform": "Windows Store", + "category": "devices", + "info": "http://msdn.microsoft.com/windows/apps", + "includedIn": [ + "VS2013" + ], + "supportedBy": [], + "tools": [ + { + "name": "Visual Studio Express 2013 for Windows with Update 2 RC ", + "link": "http://www.microsoft.com/download/details.aspx?id=42305" + }, + { + "name": "Microsoft .NET Native", + "link": "http://msdn.microsoft.com/vstudio/dotnetnative" + } + ] + }, + { + "platform": "Xamarin", + "category": "devices", + "info": "http://xamarin.com/", + "includedIn": [ + "VS2017" + ], + "supportedBy": [ + "VS2015", + "VS2013" + ], + "runtime": [], + "tools": [ + { + "name": "Xamarin Tools for iOS and Android", + "link": "http://go.microsoft.com/fwlink/?LinkID=398052" + } + ] + }, + { + "platform": "Unity", + "category": "gaming", + "info": "https://blogs.msdn.microsoft.com/visualstudio/2016/07/14/visual-studio-tools-for-unity-2-3/", + "includedIn": [ + "VS2017" + ], + "supportedBy": [ + "VS2015" + ], + "runtime": [], + "tools": [ + { + "name": "Visual Studio 2015 Tools for Unity", + "link": "https://visualstudiogallery.msdn.microsoft.com/8d26236e-4a64-4d64-8486-7df95156aba9" + } + ] + } + ] +} diff --git a/docs/ecosystem-issues.md b/docs/ecosystem-issues.md new file mode 100644 index 000000000..c9526d88d --- /dev/null +++ b/docs/ecosystem-issues.md @@ -0,0 +1,526 @@ +# Growing the .NET ecosystem + +**Immo Landwerth** + +*This document is an output of the planning process for .NET 6. It's written +from a Microsoft perspective and it's a collection of problem statements and +assertions based on how we perceive the .NET ecosystem. The sections at the end +contain next steps we'd like to take to validate or invalidate some of the +explicit (or implicit) hypotheses in this document. We're collaborating with the +.NET Foundation [working group on ecosystem +grow](https://github.com/dotnet-foundation/ecosystem-growth) and have presented +this document there as well*. + +Today, we're often (even weekly) approached by both customers and internal +partners to build libraries that already exist in the .NET ecosystem because +people feel they can't trust 3rd parties – and sometimes even 1st party when the +technology isn't part of .NET. This results in a negative cycle whereby adding +new 1st class libraries from Microsoft further underlines the notion that +quality and longevity is only provided by Microsoft, and it continues. + +In the .NET Core 3.1 timeframe, we started a maturity model which didn't go well +with the .NET Community, for a variety of reasons, but mostly due to the way we +collaborated & communicated with the community. We believe we can learn from +this experience and pick this idea up again. + +The overall goal is to enable .NET consumers to make trust decisions and to +encourage customers (external as well as internal) to trust libraries that +aren't built by Microsoft. This work will comprise of a user experience when +consuming libraries (such as when adding packages using the NuGet UI), a defined +set of practices (such as making source code and symbols available for debugging +as well as allowing to patch the code), a defined development process (how to +distribute releases, dealing with breaking changes and security issues), as well +as initiatives in order to grow the set of non-Microsoft controlled libraries. + +Getting critical adoption of this model in the .NET ecosystem will likely take +years, but the goal for .NET 6 is to create the vision, get buy-in from the .NET +Foundation and the open source community at large, as well as getting some of +the fundamentals in-place. + +## Grow the set of trusted libraries that aren't controlled by Microsoft + +### Why? + +There is a perception that other ecosystems (specifically Java, JavaScript, and +Python) have more technological diversity and thus an overall stronger open +source ecosystem. Historically, we've taught customers to expect all the +features to come from Microsoft. Since we can't build everything, especially not +at a pace at which other OSS ecosystems evolve, the set of trusted libraries for +.NET must grow beyond just Microsoft. + +### Summary + +We need to normalize the practice that application developers can depend on +libraries that aren't controlled by Microsoft. + +This requires that we make it easier for customers to evaluate quality and for +package authors to deliver a consistent quality. This is tackled by other +objectives in this document. + +This also requires a culture shift at Microsoft. Today, we're usually reactive +when it comes to library & framework investments. By the time we know there is a +need for a library (say, a new serialization protocol) we routinely research +existing options but usually end up rolling our own, because nothing fits the +bill as-is and we either don't have the time or we believe we wouldn't be able +to successfully influence the design of the existing library. This results in a +perception where Microsoft "sucks the air" out of the OSS ecosystem because our +solutions are usually more promoted and often tightly integrated into the +platform, thus rendering existing solutions less attractive. Several maintainers +have cited this as a reason that they gave up or avoid building libraries that +seem foundational. See [this section](#feedback-critical-opinions-on-the-microsoft-oss-ecosystem) with +pointers to blog posts. + +To avoid this, we need to start engaging with owners of existing libraries and +work with them to increase their quality (this implies documentation of +processes, patterns, and availability of tools which is tackled by another +objective in this document). We're doing this quite successfully with gRPC, +OpenTelemetry, and Apache Arrow/Spark already, but it should become a general +practice. We should even consider an ongoing work item to actively investigate +widely used libraries and help them raise the quality or tighten their +integration into the .NET developer experience. There is a separate objective in +this document that describes the need for product extension points that enable +that for 3rd parties. + +We also need to change our approach when we create net-new technologies for +which there is no ecosystem yet, as is the case for GPIO-based IOT libraries for +.NET Core. Instead of us building everything, we should create new projects in +such a way that we're not the sole maintainer and actively seek out and invite +external contributors to take part in long term ownership and maintenance. This +also includes our naming patterns. For example, it has become the norm that we +name packages and namespaces with Microsoft, which isn't very friendly for +creating multi-vendor projects. + +One challenge that exists in the .NET OSS ecosystem is that most successful +libraries are developed by a single person as a hobby. While this often results +in highly rated libraries (because they are labors of love) it creates a high +risk for maintainer burnout and thus uncertainty for support and longevity. This +is also reflected by the projects we see in the .NET Foundation as well as for +members of the board -- virtually nobody has the luxury of being paid by a +company to do this as part of their job. + +When you look at other foundations, such as the Linux Foundation or the Apache +Foundation, you see a very different picture: most maintainers aren't doing this +as a hobby, they are employees and work on this as part of their job. This is +also captured in the book [Working in Public: The Making and Maintenance of Open +Source Software](https://www.amazon.com/dp/0578675862). + +While there are exceptions in the .NET ecosystem (Samsung or Unity) it very much +is not the norm. Microsoft should take a more active role to work with the .NET +Foundation and help found a program where company-sponsored "maintainerships" +are being created, that is, they sponsor one or more employees who help maintain +a given library as part of their job. The goal is to create libraries that are +co-owned by employees from various companies, akin to how the Apache Foundation +works. This would be an alternative to monetary sponsorships which don't provide +a dependable income and hence do little to reduce the maintainers' stress +because it still demands balancing OSS commitments with their jobs and personal +lives. Perhaps Microsoft should also lobby for making the .NET Foundation more +similar to Apache who apparently make a concerted effort to ensure that project +committee membership is diverse so that the withdrawal of interest by a single +party would not jeopardize the project. + +Another challenge is around support. There seems to be a perception that +Microsoft produced code is always supported and anybody's else code isn't. We +often hear the need for support as a reason why non-Microsoft libraries aren't +chosen but it's unclear whether that means having an option for paid support or +whether it's simply lack of confidence that the library will be around tomorrow. +We should do customer development in this space and use the results to inform +whether there is a need for paid support for non-Microsoft libraries. If there +is, we should work with the .NET Foundation to define how this model would work +so that companies can offer support for libraries that they don't control. This +would include Microsoft but also other companies (such as Red Hat, Samsung or +whoever else wants to offer paid support). + +### End to End Scenarios + +* We need to define joint-ownership mechanics for libraries. We should try this + in the context of the IOT libraries (and potentially other customer asks, such + as additional collections we'll likely never add to the BCL). + +* We need to do customer development with existing OSS maintainers to understand + if maintainerships are a good plan to address maintainer burn out and ensure + project longevity. + +* We need to do customer development to understand the consumer's concerns + around support. + +### Engineering Needs + +* We should use telemetry, customer, and partner input to select a set of + non-Microsoft owned libraries that we can help make better. This includes + offering API reviews, as well as contributing fixes and features. The goal is + to make this a continuous effort so that we spread our expertise outside of + Microsoft and normalize the practice that we help make .NET better, no matter + who owns the code. + +### Customer Cohorts + +* OSS library maintainers + +* Internal partners at Microsoft, enterprise customers, and ISVs who consume + OSS libraries and have concerns around quality and support + +## 3rd party experiences can be as good as 1st party experiences + +### Why? + +In order to level the playing field and make it possible that the .NET platform +can promote and bet on non-Microsoft controlled technologies, we need the +ability to provide a curated discovery & acquisition experience for optional +components that is used by both 1st party as well as 3rd parties. + +### Summary + +At Microsoft we strive to deliver end-to-end experiences, for example, building +a Windows Forms application requires a shared framework, a set of project and +item templates, tooling in Visual Studio, and documentation. We deliver all of +this as part of the core product as this makes the experience seamless. + +With .NET 6 and the support for the mobile workloads we're moving to a model +where part of .NET is optional. This ensures the core product can be small and +snappy to install while still supporting the full breadth of .NET. + +However, this work itself doesn't guarantee that 3rd parties can also provide +optional components that customers can easily discover and install, thus +potentially still having a clear boundary between "this is from Microsoft" and +"this is 3rd party". + +At the same time, we don't want to provide an open registry like nuget.org as +the primary mechanism to discover and extend the core product because this will +result in a lot of noise. We still want a curated experience. The only +difference is that the curated set can be comprised of Microsoft and +non-Microsoft provided functionality. + +### End to End Scenarios + +* .NET developers have a single-entry point for discovering and acquiring + additional workloads. This entry point will be use works for all 1st party + provided components, such as ASP.NET Core, EF Core, and Xamarin. + +* The experience presents Microsoft provided components as peers to + non-Microsoft provided components. This aids discovery of related technologies + and ensures customers can choose the best tool for the job. + +* The set of available components is curated. This list needs to be owned by + some party, but it doesn't have to be just Microsoft (but we should have a + say, too). For example, there could be a .NET Foundation working group that + can decide which technologies are important enough to be a part of that core + product. This requires defining a bar that components need to pass to be + considered for addition, which includes relevance, quality, and project + health. + +### Engineering Needs + +* Move built-in components such as ASP.NET Core and EF to the optional workload + model to level the playing fields and ensure expressiveness of extension + points. + +* Provide extension points for all parts of the product that need to be extended + by optional components, such as templates, shared frameworks, and tooling. + +### Customer Cohorts + +* Providers of web frameworks such as Nancy and Giraffe + +* Providers of OR mappers such as NHibernate, Dapper, LLBLGen + +* Providers of unit test frameworks such as xUnit and NUnit + +* Providers of application models such as Uno + +* Providers of cloud integrations such as Pulumi and Farmer + +## Developers can make trust decisions about packages and binaries they consume + +### Why? + +Our library ecosystem is entirely revolving around NuGet packages which contain +binaries. It is essential that customers can have the confidence that using +pre-built code doesn't corner them. This includes the ability to reproduce them +if necessary but also includes installing packages will not result in build or +runtime errors due to incompatibilities that NuGet didn't surface early enough. + +### Summary + +.NET's ecosystem uses binaries as the primary exchange mechanism. This solves +various problems, especially shielding the consumer from having to replicate the +build environment. It's also what enables the multi-language ecosystem. All in +all, binaries have worked very well for .NET, especially because the underlying +format is rich and self-describing. + +.NET uses Authenticode signing for binaries and packages. The .NET Foundation +has made it easier for member projects to get a code signing certificate and +actively pushes its projects to do so. On top, the official NuGet gallery signs +packages to indicate they came from nuget.org. + +However, one largely unsolved problem is the link between source code and +binaries. While a significant portion of packages on nuget.org are open source +and often link to the GitHub repo, there is no way to ensure that the source +code being pointed too actually matches the binaries submitted to nuget.org. +Which could either be by choice of the uploader or because the uploader used a +compromised tool chain that injects code that wasn't part of the source code. + +In other words, just because you can trust the source code doesn't mean you can +trust the binaries. And while nuget.org scans packages for virus and malware, +there is no way to detect all possible malware. For all you know, someone, or +something, [injected a bit coin +miner](https://www.theregister.com/2018/11/26/npm_repo_bitcoin_stealer/). + +There also less malicious trust issues with consuming NuGet packages: the +package manager UI will offer packages that might not install or are not +relevant for the consuming project. It's frustrating and erodes trust when +customers try to use them only to see NuGet fail to install the package or +(worse) seeing the app crash at runtime. In many cases this isn't a bug in the +package, it's a missing feature on the NuGet side to use the package information +to communicate to the customer what will and will not work. + +A closely related issue is that finding a package that is compatible with a +project can be a challenge to developers in the .NET ecosystem. + +### End to End Scenarios + +* Package consumers know whether a given package offers sources for debugging. + +* Package consumers know whether a given package can be reproduced from sources. + +* Package consumers will understand whether a given package will work before + trying to install them. They should clearly be able understand what platforms + are supported by viewing a NuGet package's details instead of having to guess + & check by installing the package or downloading the package to ensure there + is an available asset for their platform. + +* Package consumers can evaluate packages by popularity, quality, and + maintenance. + +### Engineering Needs + +* We need to create a validation tool that can check whether a given binary can + be reproduced. + +* The validation tool needs to be integrated into the NuGet.org ingestion + pipeline so that it can serve the results in searches and the package pages. + +* We need to improve the NuGet gallery and the NuGet package management UI to + service information regarding compatibility, relevance to the consuming + project type, popularity, and quality metrics, such as how well it is + maintained. + +### Customer Cohorts + +* Package consumers who wish to manually check results on their own. + +* Package authors, as we need them to enable support for debugging and + reproducibility. + +* NuGet.org, to validate packages on upload and present the status as part of + overall package/project health. + +* Internal partner Terrapin, which is an effort to secure Azure Ring 0 and Ring + 1 services. + +## Developers have access to guidance & tools that supports them in building cross-platform packages + +### Why? + +With .NET Core & Xamarin we have made cross-platform a mainstream requirement +for library authors. However, we lack comprehensive tooling and guidance to +ensure that library developers fall into the pit of success, which results in +packages that don't work well which in turn hurts our ecosystem. This is +especially problematic for emerging platforms where adoption isn't high enough +to warrant special attention by library authors. + +### Summary + +We have pushed the envelope with what NuGet can do since we did .NET Core 1.0. +However, we have solved many of the hard problems only for the platform layer, +rather than focusing on problems library authors have day to day. In the +dotnet/runtime repo we use custom tooling to build packages, which other repos, +and more importantly, our customers don't use. This makes it very hard to build +packages that, for example, contain native code or packages that need to build +different binaries for different operating systems or CPU architecture. +Specifically, the ability to multi-target for a runtime identifier (RID) isn't +well supported at all. + +Furthermore, the tooling we provide as part of the SDK has close to zero +validation that multi-targeted packages are well-formed. For example, a package +that multi-targets for .NET Core 3.1 and .NET Standard 2.0 needs to ensure that +code compiled against the .NET Standard 2.0 binary can run against the binary +that is produced for .NET Core 3.1. In the dotnet/runtime repo we have tooling +that ensures that this is the case, but this can't easily be used by our +customers. We have seen this issue in the wild, even with 1st parties, for +example, the Azure AD libraries. + +And while there are several well-established patterns for building +cross-platform packages using the bait & switch approach, our guidance for +building cross-platform packages is still very rudimentary. Especially with .NET +5 and the advent of operating system specific framework names we need to provide +more prescriptive guidance. + +### End to End Scenarios + +* Multi-targeting for all operating systems and CPU architectures needs to be + supported in the same way that multi-targeting for different frameworks is. + +* Packages are automatically validated to ensure that consumers don't + experience compatibility issues because provided assets aren't compatible with + different multi-targeted versions of themselves. + +### Engineering Needs + +* We need to integrate RID targeting into the multi-targeting experience + +* We need to extract and productize API compatibility tooling (such as our + APICompat) and make it part of the package multi-targeting experience + +* We need have guidance for how to multi-target across frameworks, operating + systems, and architectures + +* We need to have guidance for how to deploy & wrap native code + +### Customer Cohorts + +* NuGet package authors + +* NuGet package consumers + +## Package consumers can patch their dependencies + +### Why? + +Using binaries as the primary exchange vehicle in conjunction with +package/assembly identity makes it harder for people to experiment and patch +dependencies. Other ecosystems don't suffer from this to the same degree because +they are either source based or have specific features to address that. + +### Summary + +From the very start, .NET had a notion of identity (via strong naming and the +GAC). In spirit, NuGet is a continuation of this idea. Identity is important to +enable sharing. However, it also has problems when only one party can produce +the artifact under that identity. With strong naming, this was originally by +design. In .NET Core, we have pretty much neutered this constraint and for .NET +Framework we provide public signing to work this around (to a degree). + +In case of NuGet packages this problem is harder to solve. The central nuget.org +registry requires that only the party owning a given package can provide new +versions. However, this is mightily inconvenient when you want to modify +packages locally, for example, to experiment with an OSS contribution or when +you want to patch an issue you're having with a package. + +In source-based ecosystems this problem isn't as big because sources are +inherently patchable. + +We should make it easier for application developers to convert a package +dependency to source dependency that they can control and patch. In some cases, +it might be desirable to make the patched version available (publicly or +internally). + +However, this generally requires a new package ID which now means that all +consumers would need to rebuild all their dependencies to use the new ID. A +better option would be to allow application authors to redirect package ID (and +version) to a different ID (and version). This also solves the problem where a +package author no longer maintains a package or doesn't want to support the +package for a specific operating system or framework. Someone else can provide +the package and application authors can replace the canonical one with the +forked one. + +Other ecosystems (specifically Java and NPM) have the ability for private +dependencies, where a given package dependency is considered an implementation +detail and doesn't become a direct dependency of the consumer. This would allow, +for example, the Azure SDK to depend on JSON.NET without constraining if and +which version of JSON.NET the application can use (Java calls this shading). To +be reliable, shading would need to enforce that shaded dependencies cannot leak +into the public APIs. + +### End to End Scenarios + +* Package consumers can replace a package reference with a version that they + built themselves. + +* Package consumer can replace a package with one that has a different ID and + version. + +### Engineering Needs + +* NuGet and runtime need to support shaded dependencies. + +* NuGet needs to support redirecting a package ID in the graph. Non-shaded + dependencies can only be replaced at the application level while shaded + dependencies could be replaced at the level that shades them. + +### Customer Cohorts + +* Package consumers + +## Feedback: Critical opinions on the Microsoft OSS ecosystem + +Here is a list of blog posts that have criticized Microsoft for not playing well +with the OSS ecosystem: + +* [The New Rules for Playing in Microsoft's Open Source + Sandbox](https://aaronstannard.com/new-rules-dotnet-oss/), by Aaron Stannard + +* [How to Build Sustainable Open Source Software +Projects](https://aaronstannard.com/sustainable-open-source-software/), by Aaron Stannard + +* [The Next Decade of .NET Open + Source](https://aaronstannard.com/next-decade-dotnet/), by Aaron Stannard + +* [The Day AppGet + Died](https://medium.com/@keivan/the-day-appget-died-e9a5c96c8b22), by Keivan + Beigi + +* [Why we terminated our partnership with + Microsoft](https://paulstovell.com/re-next-decade-of-open-source/), by Paul + Stovell + +## Action: Customer Development + +In order support these objectives, we need to collect more customer data. +Specifically, we should research the following: + +* **Quantitative competitive analysis of OSS ecosystems**. We should consider + ordering market research that compares the perceptions of various open source + ecosystems, such as .NET, JS/NPM, and Java. This would help us to gain more + insight into how the market views .NET and how that compares to other + ecosystems. Right now, such insights are anecdotal since the sample size are + too small. + +* **How businesses select which technologies and libraries to depend on**. There + is lots of anecdotal evidence that Microsoft customers prefer to use + technologies built by & supported by Microsoft. Sometimes, the same customers + also use other ecosystems, such as Java and NPM, where this isn't an option. + We need to understand what they are looking for in each of these ecosystems + and how they think of this double standard. This data will be used to inform + how we proceed from the maturity model. + +* **What is important to library developers**. There is an inherent assumption + that library developers want to be consumed by as many consumers as possible. + First, this might not actually be true in all cases but even if it is, it + doesn't necessarily mean that library authors greatly care to be attractive + for business. For instance, would library developers appreciate a maturity + model that prescribes specific practices and quality gates, or would they + ignore it? Are there any concerns that are specific to library authors + depending on other libraries (compared to app developers depending on + libraries)? + +## Action: Technical Insights + +* **Shading in Java.** We need to understand how shading in Java works. + Specifically, what does it enable, what is the resulting user experience for + the library producer & consumer, is there validation that prevents shaded + dependencies from leaking, how does it handle conflicts & how well, do package + managers have a direct understanding of shading, and are there are any known + issues with this feature. + +* **Side-by-side loading in Java.** Another feature of Python and JS is the + ability to load multiple versions of a component if its major version has + changed. For example, LibA is used by B and C, B requires LibA v1.0 and C + requires LibA v2.0 and there are breaking changes between v1 and v2. (Using + semver, it is assumed there are breaking changes across major versions). A + quote from a dev working on Azure SDK for JS: "JavaScript uses many + dependencies that are non-Microsoft owned as this is easy to do (libraries + follow semantic versioning, side-by-side versioning is possible and can be + configured via package.json and so it is typical and expected in our + ecosystem)". Both Python and JS aren't compiled language so doing this + relatively simple. It would be interesting to see how side-by-side loading + works in Java and whether this is tied to shading. diff --git a/docs/enabling-the-latest-ryujit.md b/docs/enabling-the-latest-ryujit.md deleted file mode 100644 index 13497013f..000000000 --- a/docs/enabling-the-latest-ryujit.md +++ /dev/null @@ -1,25 +0,0 @@ -# How to enable a RyuJIT CTP - -Download and install the latest [RyuJIT](http://aka.ms/RyuJIT) now. - -RyuJIT only works on 64-bit editions of Windows Vista and Windows Server 2008 and later. - -After installation, there are two ways to turn on RyuJIT. If you just want to enable RyuJIT for one application, set an environment variable: - - set COMPLUS_AltJit=* - -If you want to enable RyuJIT for your entire machine, set the registry key: - - HKLM\SOFTWARE\Microsoft\.NETFramework\AltJit - Default (string) = "*" - -Both registration methods cause the 64-bit CLR to use the latest RyuJIT instead of the built-in JIT, either JIT64 in the case of .NET Framework 4.5.1 and 4.5.2 or an earlier version of RyuJIT in the case of the .NET Framework 4.6. You can remove these settings at any time and you'll return to using the built-in JIT. - -## Known Gotchas - -1. **No NGen Support**. RyuJIT doesn't change NGen on your system. we wanted to keep the CTP install clean -2. **No Edit & Continue**. If you enable RyuJIT while writing code, you'll find that Edit & Continue doesn't work on 64-bit. One work around is disable RyuJIT while debugging. - -## Contact a Human - -If you have questions or problems contact us at . \ No newline at end of file diff --git a/docs/testing-with-ryujit.md b/docs/testing-with-ryujit.md index 542009e5f..15ebd9ee9 100644 --- a/docs/testing-with-ryujit.md +++ b/docs/testing-with-ryujit.md @@ -1,91 +1 @@ -# .NET Framework 4.6 - Testing with RyuJIT - -The .NET Framework 4.6 includes new Just-In-Time (JIT) compiler for 64-bit processes, called RyuJIT. It is enabled by default. It is still a preview version, so you may discover issues that have yet to be fixed. - -You may experience the following symptoms when you use the new JIT compiler: - -* An application throws an `InvalidProgramException` error. -* An application works on an x86-based computer but not on an x64-based - computer. - -## Workarounds for JIT Compilation - -To work around this problem, use any one of the following methods. - -**Important** Follow the steps in this section carefully. Serious problems might -occur if you modify the registry incorrectly. Before you modify it, -[back up the registry](http://support.microsoft.com/kb/322756) for restoration -in case problems occur. - -**Note** For all these methods, all dynamic compilation is performed by the older -JIT64 JIT. Also, all NGEN compilation continues to use the new JIT, and all -existing NGEN images that have been compiled by the new JIT continue to be used. - -* **Method 1**. Set the following environment variable: - - COMPLUS_useLegacyJit=1 - -* **Method 2**. In the registry, create either of the following subkeys: - - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework - HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework - - Then, specify the following: - - Key name: useLegacyJit - Type: REG_WORD - Value: 1 - -* **Method 3**. Add the following text to the `.exe.config file`. Create - the indicated sections if they do not already exist. - - **Note** In this file name, `` represents the actual name of the - application. - - - - - - - -## Workarounds for NGEN Compilation - -If you encounter a bug when you use the new JIT, and if the bug manifests itself -as an NGEN image, use any of the following methods to force certain named -assemblies to be recompiled by the JIT and not use the existing native images: - -* **Method 1**. Set the following environment variable: - - COMPLUS_DisableNativeImageLoadList=assembly_one;assembly_two;assembly_three - -* **Method 2**. In the registry, create either of the following subkeys: - - HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework - HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework - - Then, specify the following: - - Key name: DisableNativeImageLoadList - Type: REG_SZ - Value: assembly_one;assembly_two;assembly_three - - **Note** This is a semicolon-delimited or space-delimited list of simple - assembly names (no public key token, no architecture, and so on). This list - does not contain the `.dll` file name extension. In the examples in this - method and the next method, `assembly_one` is the simple name for an assembly - that is named `assembly_one.dll`. - -* **Method 3**. Add the following text to the `.exe.config` file. Create - the indicated sections if they do not already exist. - - **Note** In this file name, `` represents the actual name of the - application. - - - - - - - - - \ No newline at end of file +This document has been moved to [.NET Framework 4.6 - Troubleshooting RyuJIT](../Documentation/testing-with-ryujit.md) \ No newline at end of file diff --git a/dotnet-consumer-projects.md b/dotnet-consumer-projects.md new file mode 100644 index 000000000..ab4a169e5 --- /dev/null +++ b/dotnet-consumer-projects.md @@ -0,0 +1,40 @@ +# .NET Open Source Consumer Projects + +This community maintained list showcases .NET open source consumer projects. It is intended to include projects that are useful for consumers, such as desktop applications, websites, mobile apps, etc. For developer projects, see the [.NET open source developer projects list](dotnet-developer-projects.md). PR a change into either list and it will be accepted (modulo duplicates). + +Please sort projects alphabetically and provide a one-line description. GitHub/CodePlex (or other source) links are preferred, but feel free to also include marketing sites. Create new sections, as appropriate. + +## Media Streaming/Media file Editor + * [Media Browser](https://github.com/mediabrowser/) - [www.mediabrowser.tv](http://www.mediabrowser.tv) - A client/server application that allows you to easily manage your own media content and present it in an eye catching way. Server runs on Windows, Linux and Mac. Clients are for WP, Android, iOS, Media Centre, Windows, Roku, etc. + * [Pinta](https://github.com/PintaProject/Pinta) - A simple drawing/editing program modeled after Paint.NET + +## Audio players + * [Banshee](https://github.com/GNOME/banshee) - A cross-platform multimedia player + * [Espera](https://github.com/flagbug/Espera) - A media player that plays your music, YouTube videos, SoundCloud songs, has a special "party mode" and an Android remote control. + * [Simple Music Player](https://github.com/punker76/simple-music-player) SimpleMP or Simple Music Player - A simple and easy to use music player for free. It plays the most common music files (mp3, ogg, wma, wav) in a simple way. + * [Waf Music Manager](https://jbe2277.github.io/musicmanager) – A simple and fast application that makes it fun to manage the local music collection. + +## Internet/Chat Applications + * [Smuxi IM](https://github.com/meebey/smuxi) - Free, distributed, and user-friendly IRC / Twitter / XMPP / Campfire / JabbR client for Linux, Windows and Mac OS X + +## Utilities + * [Gmail Notifier Plus](https://github.com/shellscape/Gmail-Notifier-Plus) - An app to monitor multiple Gmail accounts from a single, compact point, sitting in Windows 7/8/8.1 taskbar. + * [YouCast](https://github.com/I3arnon/YouCast) - YouCast allows you to subscribe to video feeds on YouTube as podcasts in any standard podcatcher like iTunes, BeyondPod on Adroid or even Zune PC and so forth. + * [Ember](https://github.com/Embershot/Ember) - A simple & Beautiful Screenshot App + * [Waf Stopwatch](http://wafstopwatch.codeplex.com) - An advanced stopwatch with a lap recording feature. Additionally, it provides a Countdown with alert sound. + * [Waf File Hash Generator](http://fhg.codeplex.com) - A simple tool to generate the hash values of one or more files. It supports: SHA512, SHA256, SHA1 and MD5 in hexadecimal or Base64 format. + * [Zero Install](https://github.com/0install/0install-win) - [0install.de](http://0install.de/) - A decentralized cross-platform software-installation system. Run apps with a single click or control every detail. + * [ScreenToGif](https://github.com/NickeManarin/ScreenToGif) - Open source .NET tool allows you to record a selected area of your screen, live feed from your webcam or live drawings from a sketchboard. + +## Administration + * [OpenPetra](https://github.com/openpetra/openpetra) - [www.openpetra.org](https://www.openpetra.org) - An administration software for charities that can be used to manage personnel, supporters, book keeping, gift receipting, accounts payable, conferences etc. + +## Crypto Currency + * [CoiniumServ](https://github.com/CoiniumServ/CoiniumServ) - A high performance, extremely efficient, platform-agnostic, easy to setup bitcoin & alt-coin pool server implementation. It features stratum services, reward, payment, share processors, vardiff & ban managers, user-friendly embedded web-server & front-end and a full-stack API. + +## Online Algorithm Competitions + * [OpenJudgeSystem](https://github.com/NikolayIT/OpenJudgeSystem) - An open source system for online algorithm competitions. The algorithm competitions (currently available in C#, C++, JavaScript, Java and PHP programming languages) are timed contests where all contestants compete online and are given the same algorithmic problems to solve under the same time and memory constraints. + +This list is just a starting point - also take a look at all the projects on [CodePlex](http://www.codeplex.com/) and on [GitHub Trending C#](https://github.com/trending?l=csharp). + +Thanks to [@scottisafool](https://twitter.com/scottisafool) for providing the initial list. diff --git a/dotnet-developer-projects.md b/dotnet-developer-projects.md new file mode 100644 index 000000000..5b5504f83 --- /dev/null +++ b/dotnet-developer-projects.md @@ -0,0 +1,451 @@ +# .NET Open Source Developer Projects + +This community maintained list showcases .NET open source developer projects. It is intended to include projects that are useful for any aspect of the development process. For consumer projects, see the [.NET open source consumer projects list](dotnet-consumer-projects.md). PR a change into either list and it will be accepted (modulo duplicates). + +Please sort projects alphabetically and provide a one-line description. GitHub/CodePlex (or other source) links are preferred, but feel free to also include marketing sites. Create new sections, as appropriate. + +## .NET Implementations + * [.NET Core](https://github.com/dotnet/core) - Core .NET Framework + * [C# Native](https://csnative.codeplex.com) - Compiles C# to native (No Recent Updates - Still on CodePlex - 4/2018). + * [Cosmos](https://github.com/CosmosOS/Cosmos) - C# Open Source Managed Operating System, an operating system "construction kit". + * [Fling OS](https://github.com/FlingOS/FlingOS) - [C# Operating System](http://www.flingos.co.uk/) designed for people to learn low-level development from. + * [Mono](https://github.com/mono/mono) - Cross-platform implementation of .NET Framework. + * [MOSA Project](https://github.com/mosa/MOSA-Project/) - Managed Operating System Alliance Project - C# Operating System. + * [SharpLang](https://github.com/xen2/SharpLang) - Compiles C# & .NET to native machine code, using [LLVM](http://llvm.org) as a backend. + +## Platforms + * [Akka.NET](http://github.com/akkadotnet) - Akka.NET is a toolkit and runtime for building highly concurrent, distributed, and fault tolerant event-driven applications on .NET & Mono. This community-driven port brings C# & F# developers the capabilities of the original Akka framework in Java/Scala. [[Project Site]](http://getakka.net/) + * [Avalonia](https://github.com/AvaloniaUI/Avalonia) - A cross-platform UI framework that supports XAML and .NET for building desktop applications. + * [Castle Project](https://github.com/castleproject) - Umbrella project for ActiveRecord, DynamicProxy, MonoRail, Windsor + * [Catel](https://github.com/catel/catel) - Application platform with IoC, logging, reflection and much more that serves as a base for applications that must be ready for future growth. + * [Enterprise Web Library (EWL)](https://github.com/enduracode/enterprise-web-library) - An extremely opinionated platform for web applications that trades off performance, scalability, and development flexibility for an ease of maintenance you won't find anywhere else. [Enterprise Web Library site](http://www.enterpriseweblibrary.org/). + * [KonfDB](https://github.com/punitganshani/konfdb) - Configuration Management as a Service for cross-platform, multi-tenant enterprise/hobby applications. + * [Orleans](http://dotnet.github.io/orleans/) - Orleans is a framework that provides a straightforward approach to building distributed high-scale computing applications, without the need to learn and apply complex concurrency or other scaling patterns. It was created by Microsoft Research and designed for use in the cloud. Orleans is a mature but fast evolving platform that has been battle tested since 2011 by several Microsoft product groups, such as Halo, Gears of War, Skype, Azure, Xbox, as well as by a growing number of other companies using it in Azure, AWS, GCP, and on premises. + +## Languages + * [Boo](https://github.com/boo-lang/boo) - A .NET language similar to Python but with static typing, and many meta-programming capabilities. + * [ClojureCLR](https://github.com/clojure/clojure-clr) - A .NET implementation of the [Clojure](http://clojure.org) programming language, built on the DLR. + * [Cobra](http://cobra-language.com/source/) - Clean, high-level syntax (Boo/Python-like). Static and dynamic binding. First class support for unit tests and contracts. Compiled performance with scripting conveniences. Lambdas and closures. Extensions and mixins. + * [Dynamic Language Runtime](http://www.github.com/IronLanguages/main) - A toolkit for building dynamic languages for .NET. + * [Eagle](https://eagle.to) - A .NET implementation of the [Tcl](https://www.tcl.tk) programming language, built on the CLR. + * [Essence#](https://github.com/EssenceSharp/cSharp) - Essence# is a fully dynamic and highly polymorphic programming language which features pervasive message passing, pervasive dynamic and strong typing, pervasive and deep reflection and pervasive object orientation. + * [F#](https://github.com/fsharp/fsharp) - A mature, open source, cross-platform, functional-first programming language. + * [F*](https://github.com/FStarLang/FStar) - An ML-like language with a type system for program verification. + * [IronPython](https://github.com/IronLanguages/main/tree/master/Languages/IronPython) - A .NET implementation of the [Python](https://www.python.org) programming language, built on the DLR. [IronPython Site](http://ironpython.net). + * [IronRuby](https://github.com/IronLanguages/main/tree/master/Languages/Ruby) - A .NET implementation of the [Ruby](https://www.ruby-lang.org) programming language, built on the DLR. [IronRuby Site](http://ironruby.net). + * [IronScheme](https://github.com/leppie/IronScheme) - A R6RS conforming Scheme-like implementation based on the Microsoft DLR. + * [Irony](https://github.com/IronyProject/) - a development kit for implementing languages on .NET platform + * [Jint](https://github.com/sebastienros/jint) - a Javascript interpreter for .NET which can run on any modern .NET platform as it supports .NET Standard 2.0 and .NET 4.6.1 targets (and up). + * [Mond](https://github.com/Rohansi/Mond) - A scripting language for .NET Core + * [MoonSharp](https://github.com/xanathar/moonsharp/) - A Lua interpreter and remote debugger, written entirely in C#, easily embeddable in any application running on .NET 3.5+ and Mono. + * [Nemerle](https://github.com/rsdn/nemerle) - A high-level statically-typed programming language which offers functional, object-oriented and imperative features and has a simple C# like syntax and a powerful meta-programming system. + * [NiL.JS](https://github.com/nilproject/NiL.JS) - A .NET implementation of the ECMAScript language and runtime. + * [P](https://github.com/p-org/P) - a state machine based programming language for modeling and specifying complex distributed systems. + * [Phalanger](https://github.com/DEVSENSE/Phalanger) - full-featured PHP runtime & compiler for .NET/Mono frameworks. Phalanger is modern open-source implementation of PHP, compatible with the vast array of existing PHP code. + * [Roslyn (.NET Compiler Platform)](https://github.com/dotnet/roslyn) - Open-source C# and Visual Basic compilers with rich code analysis APIs. + +## Tutorials + * [Docker with .NET Core](https://github.com/mindems/Docker.NET) - A tutorial trilogy designed to get you up and running quickly. + +## Quality Assurance + * [C# Coding Guidelines](https://github.com/dennisdoomen/CSharpGuidelines) - A set of coding guidelines for C# 3.0, 4.0 and 5.0 that extend StyleCop and can be forked and adapted for internal use. + +## Security / Identity Management + * [IdentityManager](https://github.com/IdentityManager/IdentityManager) - (No Longer Maintained) IdentityManager is a tool for developers and/or administrators to manage the identity information for users of their applications. + * [IdentityServer](https://github.com/IdentityServer/IdentityServer4) - OpenID Connect and OAuth 2.0 Framework for ASP.NET Core. + * [NWebsec](https://github.com/NWebsec/NWebsec) - Security headers for ASP.NET applications. + * [SKGL - Serial Key Generating Library](https://github.com/SerialKeyManager/SKGL) - A very simple licensing system that can be used to protect .NET Applications. + +## Web CMS + * [Composite C1](https://github.com/Orckestra/C1-CMS) - Web content management platform (CMS). + * [DNN (formerly DotNetNuke)](https://github.com/dnnsoftware/Dnn.Platform) - Web content management platform (CMS). + * [Kaliko CMS](https://github.com/KalikoCMS/KalikoCMS.Core) - Flexible and extensible CMS framework supporting both ASP.NET MVC and WebForms. + * [N2CMS](https://github.com/n2cms/n2cms) - Open source, lightweight, code-first CMS able to seamlessly integrate into any MVC project. + * [Orchard](https://github.com/OrchardCMS/Orchard) - A community-focused Content Management System built on the ASP.NET MVC platform. + * [Piranha CMS](https://github.com/PiranhaCMS/Piranha) - Lightweight CMS library for new and existing ASP.NET MVC & WebPages applications. + * [Platformus](https://github.com/Platformus/Platformus) - Free, open source and cross-platform CMS based on ASP.NET Core 1.1 and ExtCore framework. + * [Suave](https://github.com/SuaveIO/suave) A lightweight web server and a set of combinators to manipulate route flow and task composition. + * [Umbraco](https://github.com/umbraco/Umbraco-CMS/) - Web content management platform (CMS). + * [WebSharper](https://bitbucket.org/IntelliFactory/websharper) - Web programming platform including a compiler from F# code to JavaScript. + +## Web Marketplace + * [BeYourMarket](https://github.com/beyourmarket/beyourmarket) - BeYourMarket is a peer-to-peer marketplace framework. + +## Web Frameworks + * [ASP.NET Boilerplate](https://github.com/aspnetboilerplate/aspnetboilerplate) - ASP.NET Boilerplate is a general-purpose application framework specially designed for new modern web applications. It uses already familiar tools and implements best practices around them to provide you a solid development experience. + * [DotVVM](https://github.com/riganti/dotvvm) - MVVM framework for people who don't like to write JavaScript, with OWIN and ASP.NET Core support and a free extension for Visual Studio 2015 and 2017. + * [Nancy](https://github.com/NancyFx/Nancy) - A lightweight, low-ceremony, framework for building HTTP based services on .NET and Mono. + * [NemerleWeb](https://github.com/NemerleWeb/NemerleWeb) - Web MVVM library for .Net. It uses reactive data model which allows creating rich internet applications. + * [RedHttpServer](https://github.com/rosenbjerg/Red) - HTTP web server framework built on ASP.NET Core and Kestrel, but with an API inspired by the simplicity of express.js. + * [ServiceStack](https://servicestack.net) - Comprehensive and lightning fast message-based framework including ORM, caching, authentication, templating, SPA integrations, etc. + +## Static Site Generators + * [FsBlog](https://github.com/fsprojects/FsBlog/) - Blog aware, static site generation using F#. + * [Pretzel](https://github.com/Code52/pretzel) - A site generation tool (and then some) for .NET platforms. + * [Sandra.Snow](https://github.com/Sandra/Sandra.Snow) - Jekyll inspired static site generation for .NET. + * [Wyam](http://wyam.io) - A simple to use, highly modular, and extremely configurable static content generator. + +## ADO.NET providers + * [Firebird .NET Data Provider](https://github.com/cincuranet/FirebirdSql.Data.FirebirdClient) - Firebird + * [Npgsql](https://github.com/npgsql/npgsql) - PostgreSQL + * [System.Data.SQLite](https://system.data.sqlite.org) - SQLite + +## Messaging + * [Azure Event Hubs](https://github.com/azure/azure-event-hubs-dotnet) - .NET Standard client library for [Azure Event Hubs](https://docs.microsoft.com/en-us/azure/event-hubs/). + * [Azure Relay](https://github.com/azure/azure-relay-dotnet) - .NET Standard client library for [Azure Relay](https://docs.microsoft.com/en-us/azure/service-bus-relay/relay-what-is-it). + * [Azure Service Bus](https://github.com/azure/azure-service-bus-dotnet) - .NET Standard client library for [Azure Service Bus](https://docs.microsoft.com/en-us/azure/service-bus/). + * [AzureNetQ](https://github.com/Roysvork/AzureNetQ) - An easy to use .NET API for Azure Service Bus. + * [Brighter](https://github.com/iancooper/Paramore) - A Command Dispatcher and Command Processor library with support for Work or Task Queues over different MoM implementations such as RabbitMQ. + * [CAP](https://github.com/dotnetcore/CAP) - An EventBus with local persistent message functionality for RabbitMQ or Kafka. + * [EasyNetQ](https://github.com/mikehadlow/EasyNetQ) - An easy to use .NET API for RabbitMQ. + * [FasterLog](https://github.com/microsoft/FASTER/blob/master/docs/cs/FasterLog.md): A high-performance concurrent persistent log (messaging queue) library for .NET, supporting group commit, scans, and random reads over tiered/sharded local and cloud storage. + * [Lime](https://github.com/takenet/lime-csharp) - A lightweight messaging library. + * [MassTransit](https://github.com/MassTransit/MassTransit) - A distributed application framework for RabbitMQ and Azure Service Bus. + * [NServiceBus](https://github.com/Particular/NServiceBus) - The most popular service bus for .NET. + * [RestBus](https://github.com/tenor/RestBus) - Easy Asynchronous Messaging and Queueing for .NET. + * [Rebus](https://github.com/rebus-org/Rebus) - Rebus is a lean service bus implementation for .NET. + +## Libraries + * [.NEXT](https://github.com/dotnet/dotNext) - A set of libraries providing async-friendly synchronization primitives, metaprogramming, specialized buffer types, I/O extension for writing high-performance code. + * [Albedo](https://github.com/ploeh/Albedo) - A .NET library targeted at making Reflection programming more consistent, using a common set of abstractions and utilities. + * [Algorithmia](https://github.com/SolutionsDesign/Algorithmia) - Algorithms and Data structures + * [AngleSharp](https://github.com/FlorianRappl/AngleSharp) - Ultimate angle brackets parser library. It parses HTML5, MathML, SVG and CSS to construct a DOM based on the official W3C specification. + * [ArcGIS.PCL](https://github.com/davetimmins/ArcGIS.PCL) - Call ArcGIS Server REST API resources. You can also convert between ArcGIS features and GeoJSON. + * [Argument](https://github.com/ashmind/Argument) - Argument validation microframework that does one thing in the simplest way possible. + * [AshMind.Extensions](https://github.com/ashmind/ashmind-extensions) - A set of very conservative extension methods most of which closely follow naming and design patterns of .NET Base Class Library. + * [AspectCore](https://github.com/dotnetcore/AspectCore-Framework) - AspectCore is an Aspect-Oriented Programming based cross platform framework for .NET Core and .NET Framework. + * [ASP.NET MVC Boilerplate Framework](https://github.com/ASP-NET-MVC-Boilerplate/Framework) - ASP.NET MVC Extensions and Helper NuGet packages. + * [AsyncCollections](https://github.com/HellBrick/AsyncCollections) - A set of lock-free thread-safe collections designed to be used asynchronously. + * [Automatonymous](https://github.com/MassTransit/Automatonymous) - An asynchronous state machine engine with messaging support. + * [Barcodes](https://github.com/gehtsoft-usa/Gehtsoft.Barcodes) - Cross-platform C# library for generation of different types of barcodes and QR codes. + * [Bing.RestClient](https://github.com/AdvancedREI/Bing.RestClient) - Access the Bing REST APIs from a unified client. + * [BoxKite.Twitter](https://github.com/NickHodge/BoxKite.Twitter/) - Twitter .NET Client Library for the 1.1 Twitter API, incorporating REST API, User streaming and Search Streaming. Uses Reactive Extensions (Rx). + * [CarbonIntensityUK](https://github.com/jordansrowles/CarbonIntensityUK) - Asynchronous wrapper around the [Carbon Intensity API](https://api.carbonintensity.org.uk/) provided by the National Grid ESO. + * [Castle.LoggingFacility.MsLogging](https://github.com/volosoft/castle-logging-ms-adapter) - An adapter library for Castle logging facility to support Microsoft.Extensions.Logging integration. + * [Castle Windsor ASP.NET Core / Microsoft.Extensions.DependencyInjection Adapter](https://github.com/volosoft/castle-windsor-ms-adapter) - This library is a Castle Windsor adapter for the Microsoft.Extensions.DependencyInjection NuGet package. + * [Cecil](https://github.com/jbevain/cecil) - A popular library to read, modify and write .NET binaries. + * [Charming](https://github.com/tzkhan/Charming) - A small, lightweight library that lets you generate ARM templates using C#. + * [Cimbalino Toolkit](https://github.com/Cimbalino/Cimbalino-Toolkit) - A set of useful and powerful tools that will help you build your Windows Platform applications. + * [Cinchoo ETL](https://github.com/Cinchoo/ChoETL) - ETL Framework for .NET (Parser / Writer for CSV, Flat, Xml, JSON, Key-Value formatted files). + * [CodeJam](https://github.com/rsdn/CodeJam) - Set of handy reusable .NET components that can simplify your daily work and save your time when you copy and paste your favorite helper methods and classes from one project to another. + * [Coding4Fun Toolkit](https://github.com/Coding4FunProjects/Coding4FunToolkit) - A set of controls, converters, and helper classes for Windows Runtime XAML applications. + * [ColoredConsole](https://github.com/colored-console/colored-console) - Add some color to your console. + * [ColorSharp](https://github.com/Litipk/ColorSharp) - Library to handle color spaces and light spectrums. + * [ComparerExtensions](https://github.com/jehugaleahsa/comparerextensions) - Build IComparer and IEqualityComparer objects using natural language syntax. + * [Comparers](https://github.com/StephenCleary/Comparers) - Fluent syntax for building comparers (and equality comparers) and implementing object comparison. + * [CoordinateSharp](https://github.com/Tronald/CoordinateSharp) - Parse or convert geographic coordinate formats and calculate location based solar/lunar information. + * [CoreIpc](https://github.com/UiPath/coreipc) - WCF-like service model API for communication over named pipes. .NET standard and node.js clients. + * [CustomLibrary.EFCore](https://github.com/AngeloDotNet/CustomLibrary.EFCore) - Library of generic and transactional CRUD operations with Entity Framework Core 6.x for SQL Server, MySQL, Postgres, SQLite databases + * [CustomLibrary.ProblemDetails](https://github.com/AngeloDotNet/CustomLibrary.ProblemDetails) - Free and open source collection of tools related to managing problems (exceptions) that can be generated by applications for .NET 6 and later LTS releases. + * [Cricket](https://github.com/fsprojects/Cricket) - Actor library. + * [DalSoft.RestClient](https://restclient.dalsoft.io/) - An extensible, dynamic and fluent Rest Client. Create frictionless code whilst still using the HttpClient you already know. + * [DateTimeExtensions](https://github.com/kappy/DateTimeExtensions) - Common Date Time operations on the form of extensions to System.DateTime, including holidays and working days calculations on several culture locales. + * [DeveelDB](https://github.com/deveel/deveeldb) - SQL-99 embeddable database engine for .NET. + * [Deveel Math](https://github.com/deveel/deveel-math) - A port of Google's Harmony library of the Math components to .NET for the computation of astonomic decimals (numbers with more than 1 million decimal digits). + * [DiffSharp](https://github.com/gbaydin/DiffSharp) - Automatic Differentiation Library. + * [DnsClient](https://github.com/MichaCo/DnsClient.NET) - A high performant DNS query/lookup library - [Home](http://dnsclient.michaco.net) + * [DotNetOpenAuth](https://github.com/DotNetOpenAuth) - Library that adds support for your site visitors to login with their OpenIDs by just dropping an ASP.NET control onto your page. + * [DropboxRestAPI](https://github.com/saguiitay/DropboxRestAPI) - DropBox .Net Client Library. + * [DryWetMIDI](https://github.com/melanchall/drywetmidi) - .NET library to read, write, process MIDI files and to work with MIDI devices. + * [DynamicData](https://github.com/RolandPheasant/DynamicData) - Brings the power of Rx to collections. + * [Enums.NET](https://github.com/TylerBrinkley/Enums.NET) - High-performance type-safe .NET enum utility library. + * [Excel-DNA](https://github.com/Excel-DNA/ExcelDna) - Create high-performance, easy to deploy Excel add-ins with .NET - [Home](http://excel-dna.net) + * [ExtCore](https://github.com/ExtCore/ExtCore) - Free, open source and cross-platform framework for creating modular and extendable web applications based on ASP.NET Core 1.1. + * [ExtraLINQ](https://github.com/mariusschulz/ExtraLINQ) - Various extension methods for working with .NET collections. + * [FASTER](https://github.com/microsoft/FASTER): A high-performance concurrent, latch-free, persistent hash key-value store and caching library (over a record log) for .NET. + * [FeatureToggle](https://github.com/jason-roberts/FeatureToggle) - Simple, reliable feature toggles in .NET. + * [FlatMapper](https://github.com/kappy/FlatMapper) - A library to import and export data from and to plain text files in a Linq compatible way. + * [FluentBootstrap](https://github.com/somedave/FluentBootstrap) - Provides extensions, helper classes, model binding, and other goodies to help you use the Bootstrap CSS framework from .NET code. + * [FluentConsole](https://github.com/ashmind/FluentConsole) - Alternative approach to colored console (`FluentConsole.Red.Text().Green.Text()`). + * [FluentValidation](https://github.com/JeremySkinner/FluentValidation) - A small validation library for .NET that uses a fluent interface and lambda expressions for building validation rules. + * [Flurl](https://github.com/tmenier/Flurl) - A fluent, portable, testable URL builder and HTTP client library. + * [Font-Awesome-WPF](https://github.com/charri/Font-Awesome-WPF) - WPF controls for the iconic font and CSS toolkit [Font Awesome](http://fortawesome.github.io/Font-Awesome/). + * [GeckoFX](https://bitbucket.org/geckofx) - Mozilla's Gecko layout engine wrapper in .NET. + * [GeoTimeZone](https://github.com/mj1856/GeoTimeZone) - Provides an IANA time zone identifier from latitude and longitude coordinates. + * [GongSolutions.Wpf.DragDrop](https://github.com/punker76/gong-wpf-dragdrop) - A drag'n'drop framework for WPF. + * [HudlFfmpeg](https://github.com/hudl/HudlFfmpeg) - A/V transcoding framework that helps build complex FFmpeg commands. + * [JSON.NET](https://github.com/JamesNK/Newtonsoft.Json) - Popular high-performance JSON framework for .NET + * [Kentor.AuthServices](https://github.com/KentorIT/authservices) - A SAML2 Service Provider for .NET. + * [Language-ext](https://github.com/louthy/language-ext) - C# 6.0+ functional language extensions. Make C# more like F# and other functional languages + * [leveldb-sharp](https://github.com/meebey/leveldb-sharp) - cross-platform C# binding for LevelDB + * [Lexical.FileProvider](http://lexical.fi/FileProvider/index.html) - Various IFileProvider implementations and utilities. + * [Lexical.FileSystem](http://lexical.fi/FileSystem/index.html) - Virtual IFileSystem interfaces, and implementations. Adaptable with IFileProvider. + * [Lexical.Localization](http://lexical.fi/Localization/index.html) - Localization class library for .NET. + * [LibGit2Sharp](https://github.com/libgit2/libgit2sharp) - C# language bindings for the [LibGit2](https://github.com/libgit2/libgit2) implementation of Git. + * [LINQ Extensions](https://github.com/TommasoScalici/LINQExtensions) - LINQ extensions for .NET is a collection of useful extensions methods that extends LINQ's capability. There are methods for combinatorics and sequence analysis, generation and manipulation. + * [LiteDB](https://github.com/mbdavid/LiteDB) - a small, fast and lightweight .NET NoSQL embedded document database. + * [Localization.SqlLocalizer]( https://github.com/damienbod/AspNet5Localization) - SQL Localizer for ASP.NET Core, dotnet + * [Lucene.Net](https://github.com/apache/lucene.net) - A .NET full-text search engine framework that is a C# port of the popular Apache Lucene project. + * [Magicodes.IE](https://github.com/dotnetcore/Magicodes.IE) - An import and export general library, support Dto import and export and dynamic export, support Excel, Csv, Word, Pdf and Html. + * [MahApps.Metro.IconPacks](https://github.com/MahApps/MahApps.Metro.IconPacks) - Some awesome icons for `WPF` and `UWP` all together. The library contains controls to use icons from [Material Design](https://materialdesignicons.com/), [Material Design Icons Light](https://github.com/Templarian/MaterialDesignLight), [Font Awesome](http://fontawesome.io/icons/), [GitHub Octicons](https://octicons.github.com/), [Modern](http://modernuiicons.com/), [Entypo+](http://www.entypo.com/) and [Simple Icons](https://simpleicons.org/). + * [Math.NET Numerics](https://github.com/mathnet/mathnet-numerics) - Provides methods and algorithms for numerical computations in science, engineering and every day use. + * [Mathos Core Library](https://github.com/MathosProject/Mathos-Project) - A library with algorithms for numerical calculations in finance, statistics, pattern recognition, and more. + * [Mathos Parser](https://github.com/MathosProject/Mathos-Project) - A simple parser for mathematical expressions before and at runtime. + * [Mjolnir](https://github.com/hudl/Mjolnir) - [Hystrix](https://github.com/Netflix/Hystrix)-inspired fault tolerance with circuit breakers and thread pools. + * [MoreLINQ](https://morelinq.github.io/) - LINQ to Objects is missing a few desirable features. This project will enhance LINQ to Objects with extra methods, in a manner which keeps to the spirit of LINQ. + * [NAudio](https://github.com/naudio/NAudio) - An open source .NET audio and MIDI library. + * [NEST](https://github.com/elastic/elasticsearch-net) - The official .NET client library for Elasticsearch. + * [NetTopologySuite](https://github.com/NetTopologySuite) - A .NET port of the JTS Topology Suite. + * [NHunspell](http://sourceforge.net/projects/nhunspell/) - Spell Checker, Hyphenation and Thesaurus. + * [NModbus4](https://github.com/NModbus4/NModbus4) - Implementation of the Modbus protocol. + * [NodaTime](https://nodatime.org/) - A better date and time API for .NET. + * [NPOI](https://github.com/tonyqus/npoi) - An Office file formats (xls, xlsx, docx) read/write library for .NET. + * [OneDriveRestAPI](https://github.com/saguiitay/OneDriveRestAPI) - (No Updates in 3 Years) OneDrive .Net Client Library using the REST API. + * [OsmSharp](https://github.com/OsmSharp) - Mapping & Routing library. + * [Parquet.Net](https://github.com/aloneguid/parquet-dotnet) - Fully managed implementation of [Apache Parquet Format](https://parquet.apache.org/). Used by [ML.NET](https://github.com/dotnet/machinelearning). + * [PocketSharp](https://github.com/ceee/PocketSharp) - Library for the Pocket API. + * [PortableRest](https://github.com/AdvancedREI/PortableRest) - Portable library for building cross-platform REST API Clients for .NET and Xamarin. + * [RestSharp](https://github.com/restsharp/RestSharp) - Simple REST and HTTP API Client for .NET + * [Serilog](https://github.com/serilog/serilog) A flexible and extensible logging library for .NET applications. + * [SharpCompress](https://github.com/adamhathcock/sharpcompress) - SharpCompress is a fully managed cross-platform C# library to deal with many compression types and formats: Zip, GZip, RAR, TAR, 7Zip, etc. + * [SharpMap](https://github.com/SharpMap) - An easy-to-use mapping library for use in web and desktop applications + * [SharpSnmpLib](https://docs.sharpsnmp.com/en/latest/) - An easy-to-use SNMP library for use on all platforms (.NET/Mono/Xamarin) + * [Shielded](https://github.com/jbakic/Shielded) - Software Transactional Memory for .NET + * [SimpleImpersonation](https://github.com/mj1856/SimpleImpersonation) - Allows you to impersonate a user, given their credentials. + * [SmartIrc4net](https://github.com/meebey/SmartIrc4net) - IRC C# Library + * [Spartacus](https://github.com/wind39/spartacus) - Multi-purpose C# library, containing: 1) classes to access many types of databases in a fast, generic way; 2) classes to work with XLSX, CSV and DBF files; 3) PDF report engine. + * [Splat](https://github.com/paulcbetts/splat) - A library to make things cross-platform that should be. + * [SSH.NET](https://github.com/sshnet/SSH.NET) - A client-side library for SSH, SCP and SFTP. + * [Strongly Typed Client API Generators for ASP.NET Web API](https://github.com/zijianhuang/webapiclientgen) - Strongly Typed Client API Generators generate strongly typed client API in TypeScript and C# codes supporting desktop, Universal Windows, Android and iOS. + * [Stuntman](https://github.com/ritterim/stuntman) - OWIN middleware for quickly mocking authentication/authorization use case scenarios locally. Supports Cookie Authentication and Bearer Token Authentication. + * [SuperSocket](https://github.com/kerryjiang/SuperSocket) - An extensible socket server engine which supports .NET and Mono. + * [surging](https://github.com/dotnetcore/surging) - The distributed micro service framework based on .NET Core provides high-performance RPC Communications. + * [Sweet.Jayson](https://github.com/ocdogan/Sweet.Jayson) - Fast, reliable, easy to use, fully json.org compliant, thread safe C# JSON library for server side and desktop operations. + * [TimeZoneConverter](https://github.com/mj1856/TimeZoneConverter) - Lightweight library to convert quickly between IANA, Windows, and Rails time zone names. + * [TimeZoneNames](https://github.com/mj1856/TimeZoneNames) - Provides a complete source of localized time zone names and abbreviations. + * [TomP2P.NET](https://github.com/tomp2p/TomP2P.NET) - A P2P-based high performance key-value pair storage library for .NET. (Not Updated in 3 Years - 4/2018) + * [Unchase.FluentPerformanceMeter](https://github.com/unchase/Unchase.FluentPerformanceMeter) - An open-source and cross-platform .Net Standard 2.0 library that is designed for the method's performance measurement. + * [VkSharp](https://github.com/kasthack/vksharp) - VK client library. + * [WampSharp](https://github.com/Code-Sharp/WampSharp) - A C# implementation of [The Web Application Messaging Protocol](http://wamp.ws) - a protocol that provides messaging patterns of Remote Procedure Calls and Publish/Subscribe over WebSockets. + * [WebApiProxy](https://github.com/faniereynders/WebApiProxy) - An automatic proxy provider for RESTful services built on ASP.NET Web API. Includes JavaScript & C# client generation. + * [WebSocket4Net](https://github.com/kerryjiang/WebSocket4Net) - A C# websocket client for .NET, Mono and Xamarin. + * [WinFsp](https://github.com/billziss-gh/winfsp) - FUSE for Windows - Develop file systems in .NET. + * [WpfToolkit](https://github.com/dotnetprojects/wpftoolkit) - Fork of the MS WPF Toolkit. + * [XamlEssentials](https://github.com/AdvancedREI/XamlEssentials) - Collection of helpers for Microsoft's XAML platforms. (Not Updated in 4 Years - 4/2018) + * [Zlib.Portable](https://github.com/AdvancedREI/Zlib.Portable) - A Portable Class Library port of the Zlib library from http://dotnetzip.codeplex.com. (Not Updated in 3 Years - 4/2018) + +## Data Mine/Data Extraction/Machine Learning/AI + * [AForge.NET](http://www.aforgenet.com/) - a C# framework designed for developers and researchers in the fields of Computer Vision and Artificial Intelligence - image processing, neural networks, genetic algorithms, machine learning, robotics. + * [Accord.NET Framework](https://github.com/accord-net/framework) - The Accord.NET Framework is a .NET machine learning framework combined with audio and image processing libraries completely written in C#. + * [Catalyst](https://github.com/curiosity-ai/catalyst) - pure C# Natural Language Processing library built for speed. Inspired by spaCy's design, it brings pre-trained models, out-of-the box support for training word and document embeddings, and flexible entity recognition models. + * [Nepy](https://github.com/tonyqus/nepy) - A collection of NLP parsers for .NET. (Not Updated in 3 Years - 4/2018) + * [SharpNLP](http://sharpnlp.codeplex.com) - SharpNLP is a collection of natural language processing tools written in C#. (No Recent Updates - Still On Codeplex - 4/2018) + * [Toxy](https://github.com/tonyqus/toxy) - An data/text extraction framework for .NET, similar to Tika in Java. (Not Updated in 2 Years - 4/2018) + +## Graphics & Server-side Image Processing + * [.NET Image Processor](https://github.com/elkdanger/image-processor) - Extensible, chainable image processing library (GDI+ based). + * [DynamicImage](https://github.com/tgjones/dynamic-image) - WPF-based server-side image rendering system - lots of visual effects implemented as high-performance shaders. Has URL api, several plugins available. + * [ImageProcessor](https://github.com/jimbobsquarepants/imageprocessor/) - A fluent wrapper around System.Drawing for the processing of image files (NET 4.5+ GDI+ based). + * [ImageResizer](https://github.com/imazen/resizer) - Add commands to image URLs to get altered versions in milliseconds. Edit, filter, touch-up images in real-time. (multiple backends - FreeImage, C++/CLI, GDI+, WIC). 45+ plugins available. + * [ImageSharp](https://github.com/jimbobsquarepants/imagesharp/) - A cross-platform library for processing of image files written in C#. (NetStandard 1.1 X-Plat). + * [King.Azure.Imaging](https://github.com/jefking/King.Azure.Imaging) - Scalable image uploading and processing for Azure. + * [Magick.NET](https://github.com/dlemstra/Magick.NET) - The .NET (Core/Framework) wrapper for the [ImageMagick](https://www.imagemagick.org) library that supports over [100 major file formats](https://www.imagemagick.org/script/formats.php). + * [MonoGame](http://www.monogame.net/) - MonoGame is a cross-platform, open-source implementation of the XNA Game Framework. + * [numl](http://numl.net) - numl is a general purpose machine learning framework meant to simplify the data analysis process + * [OpenTK](https://github.com/opentk/opentk) - OpenTK is a low-level, cross-platform binding to OpenGL, OpenGL ES, OpenCL and OpenAL, available for Windows, Linux, Mac OS X, BSD, Android and iOS. + * [SharpDX](https://github.com/sharpdx/SharpDX) - SharpDX is a project delivering the full DirectX API for .NET on all Windows platforms. + +## Logging + * [ELMAH](https://github.com/elmah/Elmah) - [ELMAH (Error Logging Modules and Handlers)](https://elmah.github.io/) is an application-wide error logging facility that is completely pluggable. It can be dynamically added to a running ASP.NET web application, or even all ASP.NET web applications on a machine, without any need for re-compilation or re-deployment. + * [Exceptionless](https://github.com/exceptionless/Exceptionless) - Provides real-time .NET error reporting for your ASP.NET, Web API, WebForms, WPF, Console, and MVC apps. It organizes the gathered information into simple actionable data that will help your app become exceptionless! + * [log4net](http://logging.apache.org/log4net/) - A tool to help the programmer output log statements to a variety of output targets. + * [LogMaster4Net](https://github.com/kerryjiang/LogMaster4Net) - It is a central log server which can organize your logs in different applications in the same place but have same log behaviors (loggers, appenders, levels and rules) like in the independent applications before. + * [NLog](https://github.com/NLog/NLog) - NLog is a free logging platform for .NET with rich log routing and management capabilities. + +## Model-View-ViewModel (MVVM) Frameworks + * [Caliburn Micro](https://github.com/Caliburn-Micro/Caliburn.Micro) - A small, yet powerful framework, designed for building applications across all XAML platforms. + * [Catel.MVVM](https://github.com/catel/catel) - Catel is an application development platform with the focus on MVVM. + * [MVVM Cross](https://github.com/MvvmCross/MvvmCross) - A cross-platform mobile MVVM development framework. + * [MVVM Extensions](https://github.com/TommasoScalici/MVVMExtensions) - MVVM cross platform (.NET FW 4.5, WPF, Windows Runtime/Phone) extensions for .NET with support for async commands, MVVM-friendly Object and Task with support for UI notification. + * [MVVM Light Toolkit](http://www.mvvmlight.net) - A cross-platform desktop and mobile MVVM development framework. + * [Okra App Framework](https://github.com/OkraFramework/Okra.Core) - An MVVM framework for Windows Store applications including MVVM templates for Visual Studio. + * [Prism](https://github.com/PrismLibrary/Prism) - A cross-platform desktop and mobile MVVM development framework. + * [Radical](https://github.com/RadicalFx/radical) - An infrastructure framework whose primary role is to help in the development of composite WPF/Silverlight/WP/WinRT applications based on the Model View ViewModel pattern. + * [ReactiveUI](https://github.com/reactiveui/ReactiveUI) - An MVVM framework that integrates with the Reactive Extensions for .NET to create elegant, testable User Interfaces that run on any mobile or desktop platform. + * [Simple Mvvm Toolkit](https://github.com/SimpleMvvm) - Provides a simple framework and set of tools for getting up to speed quickly with applications based on the MVVM design pattern. + * [Smaragd](https://github.com/nkristek/Smaragd) - A platform-independent, lightweight library for developing .NET applications using the MVVM architecture. + * [Win Application Framework (WAF)](https://github.com/jbe2277/waf) - A lightweight Framework that helps you to create well structured XAML Applications. It supports you in applying a Layered Architecture and the Model-View-ViewModel pattern. + +## Tools + * [API Port](https://github.com/microsoft/dotnet-apiport) - A tool that will analyze code for compatability issues when migrating between .NET Framework releases. + * [Cake](https://github.com/cake-build/cake) (C# Make) - A build automation system with C#/Roslyn driven build scripts. + * [CInject](https://github.com/punitganshani/CodeInject) - A tool to inject your C#/VB.NET code into existing .NET assemblies and executables + * [CppSharp](https://github.com/mono/CppSharp) - C/C++ bindings generation for .NET. + * [Crawler-Lib Build Tools](http://download.crawler-lib.net/BuildTools/) - [A PowerShell based toolbox](http://www.crawler-lib.net/build-tools) for automating the software build process, automated testing and integration. + * [dnSpy](https://github.com/0xd4d/dnSpy) - A .NET decompiler, debugger, and assembly editor that lets you edit and debug assemblies even if you don't have their source code. + * [FAKE](http://fsharp.github.io/FAKE/) - Build automation system with capabilities which are similar to make and rake. + * [FlubuCore](https://github.com/flubu-core/flubu.core) - A cross platform build and deployment automation system for building projects and executing deployment scripts using C# code. + * [Fody](https://github.com/Fody/Fody) - Extensible tool for weaving .NET assemblies. + * [FsEye](https://github.com/swensensoftware/fseye) - A visual object tree inspector for the F# Interactive. + * [FsharpLint](https://github.com/fsprojects/FSharpLint) - Lint tool for F#. + * [FsPickler](https://github.com/nessos/FsPickler) - Serialization library that facilitates the distribution of .NET objects. + * [Git Extensions](https://github.com/gitextensions/gitextensions) - A feature packed and extensible Windows UI tool for managing git repositories, it also integrates with Windows Explorer and Microsoft Visual Studio (2015/2017/2019). + * [Fusion++](https://github.com/awaescher/Fusion) - A modern alternative to the Microsoft Assembly Binding Log Viewer (FUSLOGVW.exe). + * [GitLink](https://github.com/GitTools/GitLink) - Command-line tool to make .NET open source accessible without the need for a symbols server + * [GitVersion](https://github.com/GitTools/GitVersion) - Use convention to derive a SemVer product version from a GitFlow based repository. + * [Glimpse](https://github.com/Glimpse/Glimpse) - Providing real time diagnostics & insights to the fingertips of hundreds of thousands of developers daily. + * [Grace Version Control System](https://github.com/scottarbeit/grace) - A new, modern, cloud-native version control system written using F# and Dapr + * [ILSpy](https://github.com/icsharpcode/ILSpy) - ILSpy is the open-source .NET assembly browser and decompiler. + * [Mini Profiler](https://github.com/MiniProfiler/dotnet) - A simple but effective mini-profiler for .NET. + * [Node.js Tools For Visual Studio](https://github.com/Microsoft/nodejstools) - Plugin that turns Visual Studio into a Node.js IDE + * [NsDepCop](https://github.com/realvizu/NsDepCop) - Static code analysis tool to enforce namespace dependency rules in C# projects. + * [Obfuscar](https://www.obfuscar.com/) - MSIL obfuscation utility for .NET assemblies. + * [OmniDB](https://github.com/OmniDB/OmniDB) - Web tool for database management and conversion. [Site](http://omnidb.com.br) + * [Outcomes.Net](https://github.com/kinetiq/Ether.Outcomes/) - Fluent wrapper that eliminates plumbing code around failure-prone functions. + * [Paket](https://github.com/fsprojects/Paket) - Dependency manager for .NET and Mono projects, which is designed to work well with NuGet packages and also enables referencing files directly from GitHub repositories. + * [Polly](https://github.com/App-vNext/Polly) - A resilience and transient-fault-handling library that allows developers to express policies such as Retry, Circuit Breaker, Timeout, Bulkhead Isolation, and Fallback in a fluent and thread-safe manner. + * [Protobuf-net](https://github.com/mgravell/protobuf-net) - A .NET implementation of protobuf, allowing you to serialize your .NET objects efficiently and easily. + * [Quick Diagram Tool for C#](https://github.com/realvizu/QuickDiagram) - Code visualization tool for C#. + * [RepoZ](https://github.com/awaescher/RepoZ) - A zero-conf git repository hub for Windows and macOS with Windows Explorer and CLI enhancements. + * [RobiniaDocs](https://github.com/NeuroXiq/RobiniaDocs) - RobiniaDocs is a simple documentation hosting platform for .NET Core projects. + * [scriptcs](https://github.com/scriptcs/scriptcs) - scriptcs makes it easy to write and execute C# with a simple text editor. + * [Snoop WPF](https://github.com/cplotts/snoopwpf) - Snoop - The WPF Spy Utility + * [Sql Bulk Copy Sync](https://github.com/WCOMAB/SqlBulkSync) - A lightweight, performant non-intrusive SQL Server data sync tool. + * [Vagabond](https://github.com/nessos/Vagabond) - Automated dependency resolution and dynamic assembly compilation framework. + * [Waf DotNetPad](https://jbe2277.github.io/dotnetpad) - The Waf DotNetPad is a simple and fast code editor that makes fun program with C# or Visual Basic. + * [Weighted Selector](https://github.com/kinetiq/Ether.WeightedSelector/) - Easy to use (but high performance!) weighted selection implementation. + * [XDav](https://github.com/rezabazargan/xDav) - A .net server mudole for webdav standard. + * [ZeroToNine](https://github.com/ploeh/ZeroToNine) - A tool for maintaining .NET Assembly versions across multiple files. + +## Testing + * [AutoFixture](https://github.com/AutoFixture/AutoFixture) - An open source framework for .NET designed to minimize the 'Arrange' phase of your unit tests. Its primary goal is to allow developers to focus on what is being tested rather than how to setup the test scenario, by making it easier to create object graphs containing test data. + * [canopy](https://github.com/lefthandedgoat/canopy) - A web testing framework. + * [FakeItEasy](https://github.com/FakeItEasy/FakeItEasy) - The easy mocking library for .NET. + * [Fixie](https://github.com/fixie/fixie) - A low-ceremony, convention-based testing framework with flexible customization. + * [FluentAssertions](http://www.fluentassertions.com/) - A very extensive set of extension methods that allow you to more naturally specify the expected outcome of unit tests and which make your assertions look beautiful, natural and most importantly, extremely readable. + * [FluentAutomation](https://github.com/stirno/FluentAutomation) - Simple Fluent API for UI Automation + * [FsCheck](https://github.com/fsharp/FsCheck) - A tool for testing .NET programs automatically. + * [Http.ClientHelpers](https://github.com/PureKrome/HttpClient.Helpers) - library to help mock & test `System.Net.Http.HttpClient`. + * [moq](https://github.com/Moq/moq4) - The most popular and friendly mocking framework for .NET + * [NBuilder](https://github.com/nbuilder/nbuilder) - A rapid test object generator. + * [NFluent](https://github.com/tpierrain/NFluent) - The most fluent .NET assertion lib ever. + * [NSpec](https://github.com/nspec/NSpec) - .NET BDD testing framework of the xSpec (context/specification) flavor, heavily inspired by RSpec and Mocha. + * [NSubstitute](https://github.com/nsubstitute/NSubstitute) - A friendly substitute for .NET mocking frameworks. + * [NUnit](https://github.com/nunit/nunit) - NUnit is a unit-testing framework for all .NET languages. + * [Shouldly](https://github.com/shouldly/shouldly) - Should style test assertion library with great error messages. + * [SpecFlow](https://github.com/techtalk/specflow) - Cucumber clone for .NET for writing acceptance tests in natural language. [Site](http://www.specflow.org/) + * [tickspec](https://github.com/fsprojects/TickSpec) - A lightweight Behaviour Driven Development (BDD) framework. + * [TestStack.BDDfy](https://github.com/TestStack/TestStack.BDDfy) - BDDfy is the simplest BDD framework to use, customize and extend! + * [TestStack.FluentMvcTesting](https://github.com/TestStack/TestStack.FluentMVCTesting) - Simple, terse, fluent unit testing for ASP.NET MVC Controllers. + * [TestStack.Seleno](https://github.com/TestStack/TestStack.Seleno) - Seleno helps you write automated UI tests in the right way by implementing Page Objects and Page Components and by reading from and writing to web pages using strongly typed view models. + * [TestStack.White](https://github.com/TestStack/White) - White is a framework for automating rich client applications based on Win32, WinForms, WPF, Silverlight and SWT (Java) platforms. + * [xBehave.net](https://github.com/xbehave/xbehave.net/) - A BDD/TDD framework based on xUnit.net and inspired by Gherkin. + * [xUnit](https://github.com/xunit/xunit) - xUnit.net is a community-focused unit testing tool for the .NET Framework. + +## Dependency Injection + * [Autofac](https://github.com/autofac/Autofac) - Autofac is an addictive Inversion of Control container for .NET 4.5, Silverlight 5, Windows Store apps, and Windows Phone 8 apps. + * [Castle Windsor](https://github.com/castleproject/Windsor) - A mature Inversion of Control container available for .NET and Silverlight + * [DI Feature Tests](https://github.com/ashmind/net-feature-tests) - Tests that track common DI features among multiple containers + * [dI.Hook](https://github.com/punitganshani/dI.Hook) - DI container that allows invocation using AOP + * [DryIoc](https://bitbucket.org/dadhi/dryioc) - DryIoc is small, fast, capable IoC Container for .NET + * [fFastInjector](https://github.com/Grax32/fFastInjector/) - fFastInjector is a high-performing dependency injector, service locator, and/or IOC (inversion of control) container. + * [Funq](https://funq.codeplex.com/) - A fast DI container you can understand. (No Recent Updates - Still on CodePlex - 4/2018) + * [Grace](https://github.com/ipjohnson/Grace) - Grace is a feature rich Dependency Injection container in a portable class library + * [Griffin](https://github.com/jgauffin/griffin.container) - Inversion of control container with (almost) zero configuration + * [HaveBox](https://bitbucket.org/Have/havebox/wiki/Home) - HaveBox is a very fast and lightweight IoC container. The goal is to keep it fast and light, and at the same time easy to use. + * [Hiro](https://github.com/philiplaureano/Hiro) - An ultra-lightweight, inversion of control container compiler framework + * [IfInjector](https://github.com/iamahern/IfInjector) - High performance mobile micro-IoC container. + * [LightCore](https://peterbucher.kilnhg.com/Code/LightCore/Group/Default?nr=) - [A lightweight dependency injection container](http://lightcore.ch/en/default.aspx) that can be used as a service locator and despite its simplicity and ease boasts numerous features. + * [LightInject](https://github.com/seesharper/LightInject) - A ultra lightweight IoC container + * [MicroSliver](https://microsliver.codeplex.com/) - MicroSliver is a micro, non-bloat, non-intimidating and speedy .NET (ASP.NET, Silverlight, RIA Services, WPF, Forms and Metro!). (No Recent Updates - Still on CodePlex - 4/2018) + * [Mugen Injection](http://mugeninjection.codeplex.com/) - The MugeniInjection is a lightweight and fast managed IoC (Inversion of Control) and DI (Dependency Injection) with support for constructor, property and method call injection. (No Recent Updates - Still on CodePlex - 4/2018) + * [Ninject for Desktop](https://github.com/ninject/ninject) - Dependency injector for .NET. + * [Ninject for Portable Class Libraries, Universal apps and Xamarin](https://github.com/onovotny/ninject) + * [QuickInject](https://github.com/isabgol/QuickInject) - QuickInject is a Unity 3.5 based IoC container that aims to give the Unity container a performance advantage in basic scenarios. + * [Simple Injector](https://github.com/simpleinjector/SimpleInjector/) - Simple Injector is an easy-to-use Dependency Injection library for .NET 4+ that supports Silverlight 4+, Windows Phone 8, Windows 8 including Universal apps and Mono. + * [Spring.NET](https://github.com/spring-projects/spring-net) - Spring.NET is an open source application framework that makes building enterprise .NET applications easier. + * [StructureMap](https://github.com/structuremap/structuremap) - StructureMap is a Dependency Injection / Inversion of Control tool for .Net that can be used to improve the architectural qualities of an object oriented system by reducing the mechanical costs of good design techniques. + * [StyleMVVM](https://stylemvvm.codeplex.com/) - Style MVVM is a toolkit designed for the Windows Store platform around the idea of being light weight and fast. (No Recent Updates - Still on CodePlex - 4/2018) + * [TinyIoC](https://github.com/grumpydev/TinyIoC) - An easy to use, hassle free, Inversion of Control Container for small projects, libraries and beginners alike. + * [Unity Container](https://github.com/unitycontainer) - The Unity Container (Unity) is a lightweight, extensible dependency injection container with optional support for instance and type interception. + +## Data Access + * [Dapper](https://github.com/StackExchange/dapper-dot-net) - Dapper is a single file you can drop in to your project that will extend your IDbConnection interface. + * [DeveelDB](https://github.com/deveel/deveeldb) - A complete SQL-99 embeddable database management system for .NET and Mono + * [Eggado](https://bitbucket.org/raboof/eggado) - Eggado takes generics, lambdas, expression trees, dynamic methods and DLR and uses them to breathe new life into data access using good old ADO.NET. It's for folks who can live with a SQL dialect. + * [Elephant](https://github.com/takenet/elephant) - Persistence library that provides common data structures as composable elements to abstract any storage engine, including (No)SQL databases. + * [King.Mapper](https://github.com/jefking/King.Mapper) - High performance model mapping. + * [linq2db](https://github.com/linq2db/linq2db/) - Lightweight ORM and LINQ provider with support for various databases including MS SQL, PostgreSQL, Oracle and MySQL + * [LINQ2DynamoDB](https://github.com/scale-tone/linq2dynamodb) - A type-safe data context for AWS DynamoDB with LINQ, in-memory caching and OData support. + * [Marten](https://github.com/JasperFx/marten) - Document DB / Event Store built on top of PostgreSQL. + * [NHibernate](https://github.com/nhibernate) - Object Relational Mapper + * [Simple Data](https://github.com/markrendle/Simple.Data) - A light-weight, dynamic data access component for C# 4.0. + * [Sqlite-net](https://github.com/praeclarum/sqlite-net) - Simple, powerful, cross-platform SQLite client and ORM. + * [NMEA Parser](https://github.com/dotMorten/NmeaParser) - Library for handling NMEA message in Windows Desktop, Store, Phone and Xamarin (Android + iOS), coming from files, Bluetooth, serial port or any stream. + * [Neyro.Data](https://github.com/neyromant/Neyro.Data) - Tiny, simple and fast ORM. + * [SQL LocalDB Wrapper](https://github.com/martincostello/sqllocaldb) - SQL LocalDB Wrapper is an assembly providing interop with the SQL LocalDB native API from managed code using .NET APIs. + * [StackExchange.Redis](https://github.com/StackExchange/StackExchange.Redis) - A high performance, general purpose redis client for .NET languages (C#, etc.). + +## Games + * [Duality](https://github.com/AdamsLair/duality) - An Open Source 2D Game Engine + Visual Editor written entirely in C#. + * [MonoGame](https://github.com/mono/MonoGame) - One framework for creating powerful cross-platform games. + * [OpenRA](https://github.com/OpenRA/OpenRA) - An open-source implementation of the Command & Conquer: Red Alert engine using .NET/Mono and OpenGL. + * [WaveEngine](https://github.com/waveengine) - A powerful component based game engine for desktop and mobile platforms using C#. + * [Xenko](https://github.com/xenko3d/xenko) - Xenko is a versatile and engaging game engine. + +## UI and Control libraries + * [AdonisUI](https://github.com/benruehl/adonis-ui) - Lightweight UI toolkit for WPF applications offering classic but enhanced Windows visuals. + * [Callisto](https://github.com/timheuer/callisto) - UI Control Toolkit for WinRT apps. + * [Dragablz](http://github.com/ButchersBoy/Dragablz) - A tearable TabControl for WPF which also provides easy-to-use and implement docking features. + * [Eto](https://github.com/picoe/Eto) - Cross platform GUI Toolkit for desktop and mobile apps + * [MahApps.Metro](https://github.com/MahApps/MahApps.Metro) - A toolkit for creating Metro / Modern UI styled WPF apps. [mahapps.com](http://mahapps.com) + * [Material Design in XAML Toolkit](https://github.com/ButchersBoy/MaterialDesignInXamlToolkit) - WPF/XAML resources, styles & templates for creating applications using Material Design + * [Mono XWT](https://github.com/mono/xwt) - A cross-platform UI toolkit for creating desktop apps + * [Neutronium](https://github.com/NeutroniumCore/Neutronium) - Neutronium is a library to create .NET desktop applications using HTML, CSS and javascript. It uses the MVVM pattern exactly the same way as WPF applications. + * [UWP Community Toolkit](https://github.com/Microsoft/UWPCommunityToolkit) - The UWP Community Toolkit is a collection of helper functions, custom controls, and app services. It simplifies and demonstrates common developer tasks building UWP apps for Windows 10. + * [Windows Ribbon](https://github.com/harborsiem/WindowsRibbon) - Windows Ribbon for WinForms is a .NET wrapper for Microsoft Windows Ribbon and a toolkit for design and preview. + +## Windows Services + * [King.Service](https://github.com/jefking/King.Service) - Task scheduling for Azure and Windows + * [TopShelf](https://github.com/Topshelf/Topshelf) - An easy service hosting framework for building Windows services using .NET. + +## Scheduling + * [FluentScheduler](https://github.com/fluentscheduler/FluentScheduler) - Task scheduler with fluent interface that runs automated tasks (cron jobs) from your application. + * [Hangfire](https://github.com/HangfireIO/Hangfire) - An easy way to perform fire-and-forget, delayed and recurring tasks inside ASP.NET applications. + * [Quartz.Net](https://github.com/quartznet/quartznet) - A full-featured, open source job scheduling system that can be used from smallest apps to large scale enterprise systems. + +## Deployment + * [DropkicK](https://github.com/chucknorris/dropkick/) - A fluent deployment library for Windows applications + * [RoundHouse](https://github.com/chucknorris/roundhouse) - RoundhousE is a Database Migration Utility for .NET using sql files and versioning based on source control + +## Service Bus + * [King.Service.ServiceBus](https://github.com/jefking/King.Service.ServiceBus) - Task scheduling for Azure and Windows Servers: Service Bus. + * [Warewolf Easy Service Bus](https://github.com/Warewolf-ESB/Warewolf-ESB) - An open source easy to use service bus, built on numerous .Net technologies including WF (Windows Workflow Foundation), SignalR and WPF. + +## Distributed Caching and Computing + * [.NEXT Raft](https://github.com/dotnet/dotNext/tree/master/src/cluster) - Raft implementation for .NET and ASP.NET Core that allows to build clustered microservices powered by distributed consensus and replication + * [CacheAdapter](https://bitbucket.org/glav/cacheadapter) - a .NET library that allows developers to use unified-implemented cache provider + * [CacheManager](https://github.com/MichaCo/CacheManager) - A configurable abstraction layer for caching. It supports various caches, like redis and memcached, and provides many advanced features, like layered cache, synchronization, serialization etc. + * [Dache](https://github.com/ironyx/dache) - An open source distributed caching service, built on .NET 4.0 and using TCP sockets for communication. + * [Orleans](https://github.com/dotnet/orleans) - Framework that provides a straight-forward approach to building distributed high-scale computing applications using virtual actor model. + +## Workflow-as-code + * [Azure Durable Functions](https://github.com/Azure/azure-functions-durable-extension) - An Azure service which allows stateful functions in a serverless compute environment. + * [Cleipnir.Flows](https://github.com/stidsborg/Cleipnir.Flows) - An open-source workflow-as-code framework tailored for ASP.NET. + +## Windows Workflow + * [Core WF](https://github.com/dmetzgar/corewf) - WF runtime ported to work on .NET Core. + * [Orleans.Activities](https://github.com/OrleansContrib/Orleans.Activities) - WF over [Microsoft Orleans](https://github.com/dotnet/orleans) framework. + * [Workflow Extractor](https://github.com/punitganshani/WorkflowExtractor) - Document Windows Workflow logic into a Word document or Excel sheet. + +## Amazon Echo/Alexa Integration + * [AlexaSkillsKit.NET](https://github.com/AreYouFreeBusy/AlexaSkillsKit.NET) - .NET library to write Alexa Skills that's interface-compatible with Amazon's AlexaSkillsKit for Java and matches that functionality. + +## Remote Desktop + * [Myrtille](https://github.com/cedrozor/myrtille) - A native HTML4/5 Remote Desktop Protocol client, HTTP gateway written in C# for .NET + +## Project Templates + * [ASP.NET Core & Mvc/Angular5 Startup Template](https://github.com/aspnetboilerplate/module-zero-core-template) - This is a template to create ASP.NET Core MVC / Angular based startup projects for [ASP.NET Boilerplate](https://github.com/aspnetboilerplate/aspnetboilerplate). This project also supports multi-tenancy. + * [ASP.NET MVC Boilerplate](https://github.com/ASP-NET-MVC-Boilerplate/Templates) - Professional ASP.NET MVC templates for building secure, fast, robust and adaptable web applications or sites. It provides the minimum amount of code required on top of the default MVC template provided by Microsoft. + * [EISK](https://github.com/eisk) - .NET Core project templates with simple use cases and framework for building scalable web applications, following architectural [best practices](https://docs.microsoft.com/en-us/dotnet/standard/modern-web-apps-azure-architecture/common-web-application-architectures) (DDD, Onion Architecture etc). [Project site](https://eisk.github.io). + +## Connected Services + * [Unchase.Dynamics365.Connectedservice](https://github.com/unchase/Unchase.Dynamics365.Connectedservice) - A Visual Studio Connected Service for generating early-bound .NET Framework (or C++) classes that represent the entity data model used by Dynamics 365 for Customer Engagement. + * [Unchase.Odata.Connectedservice](https://github.com/unchase/Unchase.Odata.Connectedservice) - A Visual Studio Connected Service for generating API client code in C# or VB for OData web service. + * [Unchase.OpenAPI.Connectedservice](https://github.com/unchase/Unchase.OpenAPI.Connectedservice) - A Visual Studio Connected Service for generating API client code in C# or TypeScript. Also generates C# controllers for [OpenAPI](https://swagger.io/docs/specification/about/) services with [NSwag](https://github.com/RSuter/NSwag). + +This list is just a starting point - also take a look at all the projects on [GitHub Trending C#](https://github.com/trending?l=csharp). + +[@quozd](http://twitter.com/quozd "@quozd on Twitter") hosts an [Awesome .NET!](https://github.com/quozd/awesome-dotnet) list. Also worth checking out. + +Thanks to [@slodge](http://twitter.com/slodge "@slodge on Twitter") for providing the initial list. diff --git a/dotnet-free-oss-services.md b/dotnet-free-oss-services.md new file mode 100644 index 000000000..f96f81da1 --- /dev/null +++ b/dotnet-free-oss-services.md @@ -0,0 +1,61 @@ +# Free Services & Tools for Open Source .NET Projects + +This community maintained list showcases free tools and services for open source software development on .NET. If you know of any additions to this list PR a change. This list focuses on services specifically supporting .NET development - a list covering a wide range of platforms is available at [OSS Perks](http://ossperks.com/). + +Please sort projects alphabetically and provide a one-line description. Where possible links should be to a page showing free open source plans (for example a web page, blog post or pricing page with open source plan detailed). Create new sections, as appropriate. + +## IDEs + +* [ReSharper](https://www.jetbrains.com/buy/opensource/?product=resharper) - Visual Studio extension providing code analysis, formatting, refactoring and more. +* [Visual Studio Community](http://www.visualstudio.com/en-gb/products/visual-studio-community-vs) - Full version of Visual Studio available free +* [VS Anywhere](https://vsanywhere.com/open_source_students_and_educational_centers.aspx) - Visual Studio extension for in IDE collaborative development. + +## Cross Platform Development + +* [Xamarin](http://resources.xamarin.com/open-source-contributor.html) - Share .Net code across Windows, iOS, Android and Mac. + +## Hosted Build and Continuous Integration + +* [AppVeyor](http://www.appveyor.com/pricing) - Windows based cloud build/CI servers tailored for .Net developers. +* [TeamCity at CodeBetter](http://codebetter.com/codebetter-ci) - JetBrains TeamCity CI server made available for open source projects by CodeBetter. +* [TravisCI](https://travis-ci.com/plans) - Hosted CI service supporting .Net builds via Mono on Linux. + +## Profilers + +* [ANTS Memory Profiler](http://reflectorblog.red-gate.com/2013/07/open-source) - .Net memory profiler from redgate. +* [ANTS Performance Profiler](http://reflectorblog.red-gate.com/2013/07/open-source) - .Net performance profiler from redgate. +* [dotTrace](https://www.jetbrains.com/buy/opensource/?product=profiler) - Performance profiler for .Net applications + +## Aspect Oriented Programming + +* [PostSharp](http://www.postsharp.net/purchase#discounts) - Aspect-oriented programming tool to eradicate boilerplate code. + +## Code Analysis + +* [Coverity Scan](https://scan.coverity.com) - Static analysis service to identify defects in C# code. +* [dotCover](https://www.jetbrains.com/buy/opensource/?product=dotCover) - Code coverage tool integrated with Visual Studio. +* [.Net Reflector](http://reflectorblog.red-gate.com/2013/07/open-source) - Browse, analyse and decompile IL code. +* [Sonarqube](https://www.sonarsource.com/open-source-editions/)-static code analysis tools out there. It is an open-source platform for continuous inspection of code quality and performs automatic reviews via static code analysis + +## Package Management + +* [MyGet](https://www.myget.org/opensource) - Publish public NuGet feeds of your packages for free. + +## Analytics and Error Reporting + +* [Bugsnag](https://bugsnag.com/blog/bugsnag-loves-open-source) - Cross platform error reporting. +* [countly](https://countly.com) - comprehensive product analytics platform needed to build outstanding and innovative products and the most privacy-conscious solution for mobile, + desktop, and web applications for all users. +* [elmah](https://elmah.io) - Error logging and uptime monitoring for .NET. +* [raygun.com](https://raygun.com/platform/crash-reporting)-Error Monitoring & Crash Reporting for .NET. +* [Sentry](https://sentry.io/welcome/) - Cross platform error reporting. + + +## Cloud Resources and Services + +* [Azure SDK for .NET](https://www.visualstudio.com/features/azure-tools-vs) - Easily build, manage, and deploy cloud-scale apps with Visual Studio and Azure. + +## Misc + +* [Crowdin](https://crowdin.com/page/open-source-project-setup-request) - Localization management platform. +* [Transifex](https://www.transifex.com/pricing/) - Localization management platform. diff --git a/releases/README.md b/releases/README.md new file mode 100644 index 000000000..0b4f037e0 --- /dev/null +++ b/releases/README.md @@ -0,0 +1,34 @@ +# .NET Framework Releases + +You can learn about .NET Framework [releases](#releases), below. See [resources](#resources) for additional information. + +To get up-to-date with the latest versions of .NET Framework and Visual Studio, see [Install the .NET Framework](https://www.microsoft.com/net/framework/versions) and [Install Visual Studio](https://www.visualstudio.com/vs/). See [Targeting .NET Platforms](https://www.microsoft.com/net/targeting) to find additional tools. + +## Release Notes + +You can see what was included in each .NET Framework release. Some releases are now unsupported, as called out. + +- [.NET Framework 4.8.1](net481/README.md) +- [.NET Framework 4.8](net48/README.md) +- [.NET Framework 4.7.2](net472/README.md) +- [.NET Framework 4.7.1](net471/README.md) +- [.NET Framework 4.7](net47/README.md) +- [.NET Framework 4.6.2](net462/README.md) +- [.NET Framework 4.6.1](net461/README.md) (unsupported) +- [.NET Framework 4.6](net46/README.md) (unsupported) +- [.NET Framework 4.5.2](net452/README.md) (unsupported) +- [.NET Framework 4.5.1](net451/README.md) (unsupported) +- [.NET Framework 4.5](https://blogs.msdn.microsoft.com/dotnet/2012/08/15/announcing-the-release-of-net-framework-4-5-rtm-product-and-source-code/) (unsupported) +- [.NET Framework 4.0.3](https://blogs.msdn.microsoft.com/dotnet/2012/03/05/update-4-0-3-for-the-microsoft-net-framework-4/) (unsupported) +- [.NET Framework 4.0.2](https://blogs.msdn.microsoft.com/dotnet/2011/10/27/update-4-0-2-for-the-microsoft-net-framework-4/) (unsupported) + +## Resources + +- [.NET Framework Breaking Changes](../Documentation/compatibility/README.md) +- [.NET Framework Known Issues](../Documentation/KnownIssues/README.md) +- [.NET Framework Docs](https://docs.microsoft.com/dotnet) +- [.NET Framework Docs Source (dotnet/docs)](https://github.com/dotnet/docs) +- [.NET Framework Reference Source](https://referencesource.microsoft.com/) +- [.NET Framework reference source on GitHub (microsoft/referencesource)](https://github.com/microsoft/referencesource) +- [.NET Core Releases (dotnet/core)](https://github.com/dotnet/core/blob/master/release-notes/README.md) +- [ASP.NET Core Releases (aspnet/home)](https://github.com/aspnet/Home/releases) diff --git a/releases/UWP/LICENSE.TXT b/releases/UWP/LICENSE.TXT new file mode 100644 index 000000000..6bfa203d0 --- /dev/null +++ b/releases/UWP/LICENSE.TXT @@ -0,0 +1,55 @@ +MICROSOFT SOFTWARE LICENSE TERMS +MICROSOFT.NETCORE.UNIVERSALWINDOWSPLATFORM + +These license terms are an agreement between Microsoft Corporation (or based on where you live, one of its affiliates) and you. They apply to the software named above. The terms also apply to any Microsoft services or updates for the software, except to the extent those have different terms. + +IF YOU COMPLY WITH THESE LICENSE TERMS, YOU HAVE THE RIGHTS BELOW. + +1. INSTALLATION AND USE RIGHTS. You may install and use any number of copies of the software to develop and test your applications. +2. THIRD PARTY COMPONENTS. The software may include third party components with separate legal notices or governed by other agreements, as may be described in the ThirdPartyNotices file(s) accompanying the software. +3. DISTRIBUTABLE CODE. The software contains code that you are permitted to distribute in applications you develop as described in this Section. (For this Section the term “distribution” also means deployment of your applications for third parties to access over the Internet.). + a. Right to Use and Distribute. The object code listed below is “Distributable Code”. + • You may copy and distribute the object code form of the software. + • Third Party Distribution. You may permit distributors of your applications to copy and distribute the Distributable Code as part of those applications. + b. Distribution Requirements. For any Distributable Code you distribute, you must + • add significant primary functionality to it in your applications; + • require distributors and external end users to agree to terms that protect the Distributable Code at least as much as this agreement; and, + • indemnify, defend, and hold harmless Microsoft from any claims, including attorneys’ fees, related to the distribution or use of your applications, except to the extent that any claim is based solely on the Distributable Code. + c. Distribution Restrictions. You may not use Microsoft’s trademarks in your applications’ names or branding in a way that suggests your applications come from or are endorsed by Microsoft; or modify or distribute the source code of any Distributable Code so that any part of it becomes subject to an Excluded License. An Excluded License is one that requires, as a condition of use, modification or distribution, that + i. the code be disclosed or distributed in source code form; or + ii. others have the right to modify it. +4. DATA. + a. Data Collection. The software may collect information about you and your use of the software, and send that to Microsoft. Microsoft may use this information to provide services and improve our products and services. You may opt-out of many of these scenarios, but not all, as described in the product documentation. There are also some features in the software that may enable you and Microsoft to collect data from users of your applications. If you use these features, you must comply with applicable law, including providing appropriate notices to users of your applications together with a copy of Microsoft’s privacy statement. Our privacy statement is located at https://go.microsoft.com/fwlink/?LinkID=824704. You can learn more about data collection and use in the help documentation and our privacy statement. Your use of the software operates as your consent to these practices. + b. Processing of Personal Data. To the extent Microsoft is a processor or subprocessor of personal data in connection with the software, Microsoft makes the commitments in the European Union General Data Protection Regulation Terms of the Online Services Terms to all customers effective May 25, 2018, at http://go.microsoft.com/?linkid=9840733. +5. SCOPE OF LICENSE. The software is licensed, not sold. This agreement only gives you some rights to use the software. Microsoft reserves all other rights. Unless applicable law gives you more rights despite this limitation, you may use the software only as expressly permitted in this agreement. In doing so, you must comply with any technical limitations in the software that only allow you to use it in certain ways. You may not + • work around any technical limitations in the software; + • reverse engineer, decompile or disassemble the software, or otherwise attempt to derive the source code for the software, except and to the extent required by third party licensing terms governing use of certain open source components that may be included in the software; + • remove, minimize, block or modify any notices of Microsoft or its suppliers in the software; + • use the software in any way that is against the law; or + • share, publish, rent or lease the software, provide the software as a stand-alone offering for others to use, or transfer the software or this agreement to any third party. +6. EXPORT RESTRICTIONS. You must comply with all domestic and international export laws and regulations that apply to the software, which include restrictions on destinations, end users, and end use. For further information on export restrictions, visit www.microsoft.com/exporting. +7. SUPPORT SERVICES. Because this software is “as is,” we may not provide support services for it. +8. ENTIRE AGREEMENT. This agreement, and the terms for supplements, updates, Internet-based services and support services that you use, are the entire agreement for the software and support services. +9. APPLICABLE LAW. If you acquired the software in the United States, Washington law applies to interpretation of and claims for breach of this agreement, and the laws of the state where you live apply to all other claims. If you acquired the software in any other country, its laws apply. +10. CONSUMER RIGHTS; REGIONAL VARIATIONS. This agreement describes certain legal rights. You may have other rights, including consumer rights, under the laws of your state or country. Separate and apart from your relationship with Microsoft, you may also have rights with respect to the party from which you acquired the software. This agreement does not change those other rights if the laws of your state or country do not permit it to do so. For example, if you acquired the software in one of the below regions, or mandatory country law applies, then the following provisions apply to you: + a) Australia. You have statutory guarantees under the Australian Consumer Law and nothing in this agreement is intended to affect those rights. + b) Canada. If you acquired this software in Canada, you may stop receiving updates by turning off the automatic update feature, disconnecting your device from the Internet (if and when you re-connect to the Internet, however, the software will resume checking for and installing updates), or uninstalling the software. The product documentation, if any, may also specify how to turn off updates for your specific device or software. + c) Germany and Austria. + (i) Warranty. The software will perform substantially as described in any Microsoft materials that accompany it. However, Microsoft gives no contractual guarantee in relation to the software. + (ii) Limitation of Liability. In case of intentional conduct, gross negligence, claims based on the Product Liability Act, as well as in case of death or personal or physical injury, Microsoft is liable according to the statutory law. +Subject to the foregoing clause (ii), Microsoft will only be liable for slight negligence if Microsoft is in breach of such material contractual obligations, the fulfillment of which facilitate the due performance of this agreement, the breach of which would endanger the purpose of this agreement and the compliance with which a party may constantly trust in (so-called "cardinal obligations"). In other cases of slight negligence, Microsoft will not be liable for slight negligence +11. DISCLAIMER OF WARRANTY. THE SOFTWARE IS LICENSED “AS-IS.” YOU BEAR THE RISK OF USING IT. MICROSOFT GIVES NO EXPRESS WARRANTIES, GUARANTEES OR CONDITIONS. TO THE EXTENT PERMITTED UNDER YOUR LOCAL LAWS, MICROSOFT EXCLUDES THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. +12. LIMITATION ON AND EXCLUSION OF REMEDIES AND DAMAGES. YOU CAN RECOVER FROM MICROSOFT AND ITS SUPPLIERS ONLY DIRECT DAMAGES UP TO U.S. $5.00. YOU CANNOT RECOVER ANY OTHER DAMAGES, INCLUDING CONSEQUENTIAL, LOST PROFITS, SPECIAL, INDIRECT OR INCIDENTAL DAMAGES. +This limitation applies to (a) anything related to the software, services, content (including code) on third party Internet sites, or third party applications; and (b) claims for breach of contract, breach of warranty, guarantee or condition, strict liability, negligence, or other tort to the extent permitted by applicable law. +It also applies even if Microsoft knew or should have known about the possibility of the damages. The above limitation or exclusion may not apply to you because your state or country may not allow the exclusion or limitation of incidental, consequential or other damages. + +Please note: As this software is distributed in Quebec, Canada, some of the clauses in this agreement are provided below in French. +Remarque : Ce logiciel étant distribué au Québec, Canada, certaines des clauses dans ce contrat sont fournies ci-dessous en français. +EXONÉRATION DE GARANTIE. Le logiciel visé par une licence est offert « tel quel ». Toute utilisation de ce logiciel est à votre seule risque et péril. Microsoft n’accorde aucune autre garantie expresse. Vous pouvez bénéficier de droits additionnels en vertu du droit local sur la protection des consommateurs, que ce contrat ne peut modifier. La ou elles sont permises par le droit locale, les garanties implicites de qualité marchande, d’adéquation à un usage particulier et d’absence de contrefaçon sont exclues. +LIMITATION DES DOMMAGES-INTÉRÊTS ET EXCLUSION DE RESPONSABILITÉ POUR LES DOMMAGES. Vous pouvez obtenir de Microsoft et de ses fournisseurs une indemnisation en cas de dommages directs uniquement à hauteur de 5,00 $ US. Vous ne pouvez prétendre à aucune indemnisation pour les autres dommages, y compris les dommages spéciaux, indirects ou accessoires et pertes de bénéfices. +Cette limitation concerne: + · tout ce qui est relié au logiciel, aux services ou au contenu (y compris le code) figurant sur des sites Internet tiers ou dans des programmes tiers ; et + · les réclamations au titre de violation de contrat ou de garantie, ou au titre de responsabilité stricte, de négligence ou d’une autre faute dans la limite autorisée par la loi en vigueur. +Elle s’applique également, même si Microsoft connaissait ou devrait connaître l’éventualité d’un tel dommage. Si votre pays n’autorise pas l’exclusion ou la limitation de responsabilité pour les dommages indirects, accessoires ou de quelque nature que ce soit, il se peut que la limitation ou l’exclusion ci-dessus ne s’appliquera pas à votre égard. +EFFET JURIDIQUE. Le présent contrat décrit certains droits juridiques. Vous pourriez avoir d’autres droits prévus par les lois de votre pays. Le présent contrat ne modifie pas les droits que vous confèrent les lois de votre pays si celles-ci ne le permettent pas. + diff --git a/releases/UWP/README.md b/releases/UWP/README.md new file mode 100644 index 000000000..6178c7d49 --- /dev/null +++ b/releases/UWP/README.md @@ -0,0 +1,25 @@ +# .NET Native (UWP) Releases + +You can learn about Microsoft.NETCore.UniversalWindowsPlatform [releases](#releases), below. See [resources](#resources) for additional information. + +## Release Notes + +You can see what was included in each .NET Native (Microsoft.NETCore.UniversalWindowsPlatform) release. + +- [.NET Native 2.2 (UWP 6.2.x)](net-native2.2/README.md) +- [.NET Native 2.1 (UWP 6.1.x)](net-native2.1/README.md) +- [.NET Native 2.0 (UWP 6.0.x)](net-native2.0/README.md) +- [.NET Native 1.7 (UWP 5.4.x)](net-native1.7/README.md) +- [.NET Native 1.6 (UWP 5.3.x)](net-native1.6/README.md) +- [.NET Native 1.4 (UWP 5.2.x)](net-native1.4/README.md) + +## Resources + +- [Getting Started with .NET Native](https://docs.microsoft.com/en-us/dotnet/framework/net-native/getting-started-with-net-native) +- [Microsoft.NETCore.UniversalWindowsPlatform NuGet Package Details](https://www.nuget.org/packages/Microsoft.NETCore.UniversalWindowsPlatform) +- [Windows Dev Center](https://developer.microsoft.com/en-us/windows/apps/getstarted) +- [Downloads and tools for Windows 10](https://developer.microsoft.com/en-us/windows/downloads) + +## Provide Feedback + +Please continue to send questions and suggestions to dotnetnative@microsoft.com. We look forward to hearing from you and seeing what great things you will build. diff --git a/releases/UWP/net-native1.4/README.md b/releases/UWP/net-native1.4/README.md new file mode 100644 index 000000000..81dd1f25d --- /dev/null +++ b/releases/UWP/net-native1.4/README.md @@ -0,0 +1,35 @@ +# .NET Native 1.4 (UWP 5.2.x) Release Notes + +You can see what was included in each .NET Native 1.4 ([Microsoft.NETCore.UniversalWindowsPlatform 5.2.x](https://www.nuget.org/packages/Microsoft.NETCore.UniversalWindowsPlatform)) release, below. + +When using Visual Studio these packages require Visual Studio 2015 Update 3 or later. + +### 5.2.9 (March 13th, 2019) +- Fix for a domain spoofing vulnerability which causes the meaning of a URI to change when International Domain Name encoding is applied. An attacker who successfully exploited the vulnerability could redirect a URI. (https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0657) + +### 5.2.6 (July 27th, 2018) +- Fixed CVE-2018-8356: Security Feature Bypass in X509 Certificate Validation: https://github.com/dotnet/announcements/issues/73 + +### 5.2.4 (January 9th, 2018) +- Fixed CVE-2018-0786: Security Feature Bypass in X509 Certificate Validation: https://github.com/Microsoft/dotnet/issues/597 + +### 5.2.3 (March 7, 2017) +- Fixed an [issue](https://github.com/dotnet/corefx/issues/10374) that caused DataContractJsonSerializer to fail to serialize any [DataContract] type whose default constructor is not public. +- Fixed a regression in 5.2.2 where [4 Libraries were accidently no longer referenced by default](https://github.com/dotnet/corefx/issues/10338) + - System.Collections.NonGeneric + - System.Collections.Specialized + - System.Threading.Overlapped + - System.Xml.XmlDocument + +### 5.2.2 (July 14, 2016) +You can read more about these changes in the Visual Studio 2015 Update 3 blog [post](https://www.visualstudio.com/en-us/news/releasenotes/vs2015-update3-vs). + +- Fixed several customer reported bugs. +- Improved release build compilation times of large applications. +- Improved runtime performance for XAML applications and Unity games. + +## Resources +- [Getting Started with .NET Native](https://docs.microsoft.com/en-us/dotnet/framework/net-native/getting-started-with-net-native) +- [Microsoft.NETCore.UniversalWindowsPlatform NuGet Package Details](https://www.nuget.org/packages/Microsoft.NETCore.UniversalWindowsPlatform) +- [Windows Dev Center](https://developer.microsoft.com/en-us/windows/apps/getstarted) +- [Downloads and tools for Windows 10](https://developer.microsoft.com/en-us/windows/downloads) diff --git a/releases/UWP/net-native1.6/README.md b/releases/UWP/net-native1.6/README.md new file mode 100644 index 000000000..a2ee3f45f --- /dev/null +++ b/releases/UWP/net-native1.6/README.md @@ -0,0 +1,62 @@ +# .NET Native 1.6 (UWP 5.3.x) Release Notes + +You can see what was included in each .NET Native 1.6 ([Microsoft.NETCore.UniversalWindowsPlatform 5.3.x](https://www.nuget.org/packages/Microsoft.NETCore.UniversalWindowsPlatform)) release, below. + +When using Visual Studio these packages require Visual Studio 2017 or later. + +### UWP 5.3.10 (March 13th, 2019) +- Fix for a domain spoofing vulnerability which causes the meaning of a URI to change when International Domain Name encoding is applied. An attacker who successfully exploited the vulnerability could redirect a URI. (https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0657) + +### UWP 5.3.7 (July 27th, 2018) +- Fixed CVE-2018-8356: Security Feature Bypass in X509 Certificate Validation: https://github.com/dotnet/announcements/issues/73 + +### 5.3.5 (January 9th, 2018) +- Fixed CVE-2018-0786: Security Feature Bypass in X509 Certificate Validation: https://github.com/Microsoft/dotnet/issues/597 + +### 5.3.4 (August 4, 2017) +- Corrected an issue where System.Threading.Thread.MemoryBarrier was implemented as no-op on x86 release builds. + +### 5.3.3 (April 24, 2017) +- Corrected an [issue](http://stackoverflow.com/questions/43530071/how-to-fix-app-submission-error-of-1300) for projects that have Visual Studio configuration values that are not "DEBUG" or "RELEASE" that causes Windows Store submission failure (error code 1300). For example, most Unity apps use a configuration named "Master". + +### 5.3.2 (April 6, 2017) +- Fixed an issue that caused MAKEPRI build warnings to be emitted when building app packages for UWP projects. + +### 5.3.1 (March 7, 2017) +- Fixed an [issue](https://github.com/dotnet/corefx/issues/10374) that caused DataContractJsonSerializer to fail to serialize any [DataContract] type whose default constructor is not public. +- Fixed a regression in 5.3.0 where [4 Libraries were accidently no longer referenced by default](https://github.com/dotnet/corefx/issues/10338) + - System.Collections.NonGeneric + - System.Collections.Specialized + - System.Threading.Overlapped + - System.Xml.XmlDocument + +### 5.3.0 (January 27, 2017) +You can read more about these changes in our announcement blog [post](https://blogs.msdn.microsoft.com/dotnet/2017/01/30/announcing-net-core-net-native-and-nuget-updates-in-vs-2017-rc/). + +- Added NuGet support for Visual Studio 2017 or later. +- Added hardware-accelerated support for System.Numerics.Vectors. +- Added the ability to inspect static fields that contain the ThreadStatic attribute. +- Added x64 support for Shared Library package with profile-guided optimizations which reduces the package size and improves startup time for x64 native apps. This change brings x64 to parity with x86 and ARM32. +- Integrated .NET Native garbage collector with Windows Runtime MemoryManager API to properly calculate memory load factor in UWP applications. +- Reduced compile times for applications that contain large and/or complex methods by ~25% in certain scenarios. +- Increased performance improvements in reverse p/invoke (up to 400%) and when accessing Windows Runtime objects (up to 135% in certain scenarios). +- Improvements to the relfection stack and metadata formats which result in up to 30% performance increase in some scenarios. +- Improvements to delegate invocation that reduce code size and give up to 7% faster performance. +- General code quality improvements which improve start up times, better steady-state performance, less memory usage and smaller app size. +- Resolved an issue that sometimes resulted in a 1300 error when submitting a package to the store after upgrading / cherry-picking .NET Core assembly packages. +- resolved an issue that caused a memory leak when interacting with certain Windows Runtime objects in a different process. +- significantly reduced global lock contention when accessing Windows Runtime objects from multiple threads. +- Resolved an issue that resulted in queries not executing properly in Entity Framework when enabling .NET Native. ([GitHub #6381](https://github.com/aspnet/EntityFramework/issues/6381)) +- Resolved an issue with System.Linq.Expressions that resulted in unsupressable error messages. ([GitHub #5088](https://github.com/dotnet/corefx/issues/5088)) +- .NET Native will now show a warning if you have a native DLL in a different CPU architecture than the application being built. This is a common mistake that results in the application not being able to launch. + +#### Known issues + +- .NET native does not currently support portable PDBs. When debugging managed components with portable PDBs in application compiled with .NET native, you may have trouble setting breakpoints, stepping in, and/or inspecting variables of related types in those components. You can delete the files from the local package directory (users\userName.nuget\packages) to workaround the warning. This change was also made in the servicing update for .NET Native 1.4 in the latest update to Visual Studio 2017 RC. Earlier versions of .NET native may incorrectly throw OutOfMemoryException and crash during build when consuming portable PDBs. + +## Resources + +- [Getting Started with .NET Native](https://docs.microsoft.com/en-us/dotnet/framework/net-native/getting-started-with-net-native) +- [Microsoft.NETCore.UniversalWindowsPlatform NuGet Package Details](https://www.nuget.org/packages/Microsoft.NETCore.UniversalWindowsPlatform) +- [Windows Dev Center](https://developer.microsoft.com/en-us/windows/apps/getstarted) +- [Downloads and tools for Windows 10](https://developer.microsoft.com/en-us/windows/downloads) diff --git a/releases/UWP/net-native1.7/README.md b/releases/UWP/net-native1.7/README.md new file mode 100644 index 000000000..d04eb461c --- /dev/null +++ b/releases/UWP/net-native1.7/README.md @@ -0,0 +1,65 @@ +# .NET native tools 1.7 Release Notes +You can see what was included in each .NET Native 1.7 ([Microsoft.NETCore.UniversalWindowsPlatform 5.4.x](https://www.nuget.org/packages/Microsoft.NETCore.UniversalWindowsPlatform)) release below. + +When using Visual Studio these packages require Visual Studio 2017 or later. + +### UWP 5.4.7 | UWP 6.0.15 | UWP 6.1.12 | UWP 6.2.7 (.NET native tools 1.7.6) (March 13th, 2019) +- Fix for a domain spoofing vulnerability which causes the meaning of a URI to change when International Domain Name encoding is applied. An attacker who successfully exploited the vulnerability could redirect a URI. (https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0657) + +### UWP 6.1.7 (.NET native tools 1.7.3) (July 27th, 2018) +- Fixed CVE-2018-8356: Security Feature Bypass in X509 Certificate Validation: https://github.com/dotnet/announcements/issues/73 + +### UWP 6.0.6 (.NET native tools 1.7.3) (January 9th, 2018) +- Fixed CVE-2018-0786: Security Feature Bypass in X509 Certificate Validation: https://github.com/Microsoft/dotnet/issues/597 + +### UWP 6.0.5 (.NET native tools 1.7.3) (December 12th, 2017) +- Fixed a GC memory leak. [506391] + +### UWP 6.0.4 (.NET native tools 1.7.2) (December 4th, 2017) +- Fixed an unhandled exception when ClientWebSocket loses connection to server. [518456] +- Fixed a regression in the 1.7 toolchain causing winmd file corruption when the file stream is left open. [496929] + +### UWP 5.4.4 (.NET native tools 1.7.1) (July 27th, 2018) +- Fixed CVE-2018-8356: Security Feature Bypass in X509 Certificate Validation: https://github.com/dotnet/announcements/issues/73 + +### UWP 5.4.2 (.NET native tools 1.7.1) (January 9th, 2018) +- Fixed CVE-2018-0786: Security Feature Bypass in X509 Certificate Validation: https://github.com/Microsoft/dotnet/issues/597 + +### UWP 5.4.1 (.NET native tools 1.7.1) (October 9th, 2017) +- Fixed an issue with Microsoft.NetNative.targets that prevented C++ hybrid apps from compiling; apps would fail to compile due to an attempt to write a file to a folder that does not exist. [511674] + +### UWP 5.4.0 (.NET native tools 1.7.0) (August 11th, 2017) + +#### Improved Diagnostics and Better Support for Portable PDBs +- In .NET Native 1.7, we added support for the new [Portable PDB format](https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md) for representing symbol information in the .NET Native UWP compiler. The portable PDB format was originally developed to support cross-platform symbol information for managed code as well as drastically reduce the size of debug info - the format makes use of the MSIL module metadata instead of duplicating it and, because of this, it is typically an order of magnitude shorter than the equivalent Windows PDB. In addition to that, the portable PDB format supports an "embedded" flavor in which the symbol information is directly attached to the MSIL executable in form of a binary blob, making it much easier to deploy such managed binaries, not having to care about two different files (with all the related problems of mutual compatibility, signing etc.). The debugging experience is on par with Windows PDB's - we encode the same debug information just in a more compact manner. The previous version of the .NET Native toolchain was oblivious of the portable PDB format. [1640097] + +- Improved the debug experience for apps compiled with "/debug:embedded" [364639] + +#### Fixes for Build Warnings and other Compilation Improvements +- Fixed an issue that caused MAKEPRI to emit a spurious build warning [378512] +- Fixed an issue that prevented embedding a win32 resource into a C# UWP project [370533] +- Fixed an MSBuild targets issue that caused UWP App Release builds to fail occasionally (Error MSB6003: The specified task executable "ilc.exe" could not be run. The handle is invalid) [401406] +- Fixed a build crash when using ValueTuple with embedded null values in the string[] passed to TupleElementNamesAttribute [409209] + +#### Fixes for Localization and non-English Scenarios +- Fixed an issue where string resources emitted by Microsoft.NetNative.IL2IL were English-only and not localized [438193] + +#### Fixes for Crashes and other Application Reliability Improvements +- Fixed an issue where System.Reflection would sometimes return two copies of every Attribute in an assembly [392708] +- Fixed an issue that caused System.ServiceModel.MessageParameterAttribute to not work properly in C# UWP projects [394307] +- Fixed a crash with obfuscated applications [396131] +- Fixed a WinMD data corruption issue [430881] +- Fixed Watson-reported crashes in .NET Native 1.6 [432913] +- Fixed a crash in Module::DoCustomImports [432987] +- Fixed incorrect data reported in telemetry [443373] +- Upgraded to newer VSTelemetry SDK and dependent package versions [442135] +- Improved telemetry handling of internal usage [444253] +- Fixed crash in optimizing compiler c2n.dll [300136, 300146] +- Fixed an issue where memory barrier is implemented as no-op on x86 [452729] + +## Resources + +- [Getting Started with .NET Native](https://docs.microsoft.com/en-us/dotnet/framework/net-native/getting-started-with-net-native) +- [Microsoft.NETCore.UniversalWindowsPlatform NuGet Package Details](https://www.nuget.org/packages/Microsoft.NETCore.UniversalWindowsPlatform) +- [Windows Dev Center](https://developer.microsoft.com/en-us/windows/apps/getstarted) +- [Downloads and tools for Windows 10](https://developer.microsoft.com/en-us/windows/downloads) diff --git a/releases/UWP/net-native2.0/README.md b/releases/UWP/net-native2.0/README.md new file mode 100644 index 000000000..44b6541b4 --- /dev/null +++ b/releases/UWP/net-native2.0/README.md @@ -0,0 +1,101 @@ +# .NET native tools 2.0 (UWP 6.0.x) Release Notes + +You can see what was included in each .NET Native 2.0 ([Microsoft.NETCore.UniversalWindowsPlatform 6.0.x](https://www.nuget.org/packages/Microsoft.NETCore.UniversalWindowsPlatform)) release below. + +When using Visual Studio these packages require Visual Studio 2017 Version 15.4 or later. + +### UWP 6.0.15 (.NET native tools 2.0.3) (March 13th, 2019) +- Fix for a domain spoofing vulnerability which causes the meaning of a URI to change when International Domain Name encoding is applied. An attacker who successfully exploited the vulnerability could redirect a URI. (https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0657) + +### UWP 6.0.12 (.NET native tools 2.0.3) (October 9th, 2018) +- Fixed CVE-2018-8292:.NET Information Disclosure Vulnerability: https://github.com/dotnet/announcements/issues/88 + +### UWP 6.0.10 (.NET native tools 2.0.3) (July 27th, 2018) +- Fixed CVE-2018-8356: Security Feature Bypass in X509 Certificate Validation: https://github.com/dotnet/announcements/issues/73 + +### UWP 6.0.8 (.NET native tools 2.0.3) (March 5th, 2018) +- Fixed a packaging and publishing issue. [570878] + +### UWP 6.0.7 (.NET native tools 2.0.3) (February 7th, 2018) +- Updated ILC to copy all .pdb files to the output .appxsyms, including ones that do not have matching binaries. [524755] + +### UWP 6.0.6 (.NET native tools 2.0.2) (January 9th, 2018) +- Fixed CVE-2018-0786: Security Feature Bypass in X509 Certificate Validation: https://github.com/Microsoft/dotnet/issues/597 + +### UWP 6.0.5 (.NET native tools 2.0.2) (December 12th, 2017) +- Updated the .NET native 1.7 tool chain to 1.7.3 [.NET Native 1.7 (UWP 5.4.x) Release Notes](https://github.com/Microsoft/dotnet/blob/master/releases/UWP/net-native1.7/README.md). + +### UWP 6.0.4 (.NET native tools 2.0.2) (December 4th, 2017) +- Fixed a crash in debug config with static analysis enabled in project properties. [473689] +- Improved telemetry included in ILC crashes, enabling failure determination. [521523] +- Fixed for a GC memory leak. [506391] +- Updated the .NET native 1.7 tool chain to 1.7.2. [.NET Native 1.7 (UWP 5.4.x) Release Notes](https://github.com/Microsoft/dotnet/blob/master/releases/UWP/net-native1.7/README.md). + +### UWP 6.0.2 (.NET native tools 2.0.1) (November 20, 2017) +- Fixed an issue when building UWP apps that target RS3 and reference the Microsoft Store Services SDK and Microsoft Advertising SDK or Store Engagement SDK [514498] +- Fixed crashes due to an error in the compiler's garbage collection reporting (affects ARM apps built with .NET Native) [507618] +- Improved performance for creating new UWP Projects. [512775] +- Fixed issues that enable Windows Application Packaging (Centennial) projects publishing scenarios [521438] +- Enabled a P/Invoke feature for WindowsSDK Store in RS3 [518300] + +### 6.0.1 (October 5, 2017) + +#### .NET Standard 2.0 Support + +- The Windows Fall Creators Update brings support for .NET Standard 2.0 to UWP development. In order to leverage the new APIs with .NET Standard 2.0, you need to set the minimum version target of your application to the Windows Fall Creators Update SDK. You will then have the ability to reference .NET Standard 2.0 NuGet packages, class libraries, and APIs directly from your UWP application. +- More information is available on .NET Standard 2.0 support [here](https://docs.microsoft.com/en-us/dotnet/standard/net-standard). + +#### Improvements to Program Optimization, Throughput and Debuggability. + +- This release of the .NET Native code generator includes substantial improvements to optimization, throughput and debuggability. This includes many new features from the Visual C++ compiler in Visual Studio 2017 Version 15.4. For example, a new SSA optimizer has been enabled and adapted to managed code and carefully tuned. +- This release also includes targeted improvements in + - native pointer tracking + - static initialization of scalars and arrays + - loop unrolling and vectorization + - write barrier and interference analysis + - code motion in the presence of exception handling + - iterative devirtualization-inlining which allows deeper inlining of small routines in common scenarios like class iterators. +- The code generator also generates accurate optimized debugging support for dead parameters, inlined functions, and default value initialization. There are 78 code generator improvements in this release, including 8 GC-hole bug fixes which improved the quality and reliability of the compiler itself. + +#### Changes to the Debug Runtime (CoreCLR) + +- The Debug runtime (CoreCLR) is now based on the open source .NET Core, including the RyuJIT code generator. Users might notice slight differences in behavior, such as floating-point precision in the x86 runtime, but most code should run just as it did in earlier releases. + + +#### .NET Native Incremental Build Support (Preview) + +- This release contains an opt-in preview for .NET Native incremental compilation support. +- More information is available on incremental compilation support [here](incremental-compilation.md). + +#### .NET Native Function Evaluation Debugger Support (Preview) + +- This release contains an opt-in preview for .NET Native Function Evaluation (aka "FuncEval") Debugger support. +- More information is available on FuncEval support [here](funceval.md). + + +#### Known Issues and Workarounds + +- **.NET Standard 2.0 and other .NET Library NuGet Packages** + - While the vast majority of .NET Standard 2.0 APIs will work normally on the .NET Native platform, there are a small number of exceptions where the .NET Native platform could not fully support the expected behavior, typically because it would require JIT compilation or it is restricted by the app sandbox (AppContainer). An example is reading and writing process information with the Process class. As well, there are also some limitations in certain API that is not part of .NET Standard 2.0. See [https://github.com/dotnet/corefx/wiki/UWP-Compat](https://github.com/dotnet/corefx/wiki/UWP-Compat) for more details. + - Although NuGet will now allow you to reference packages that expect the desktop .NET Framework, it cannot determine whether those libraries use an API that is not available on .NET Native. To warn you of this, NuGet and Visual Studio will display a warning like, ```NU1701: Package 'PackageNameHere 1.0.0' was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETStandard,Version=v2.0'. This package may not be fully compatible with your project.```. When you receive this warning, you will want to make sure through testing or by reference to the library author that the package will indeed work in your .NET Native project. Over time, we expect many of these packages to re-package to avoid the warning. + - ```System.Diagnostics.Debugger.Log``` and ```System.Diagnostics.Debugger.IsLogging``` do not report the message to the debugger on Release (.NET Native) builds. Debug (CoreCLR) builds function as expected. [405171] + - ```System.Net.HttpWebRequest``` behavior change regarding POST'ing empty content with entity body related request headers (i.e. 'Content-Type', et. al.) from prior .NET Native releases. See [https://github.com/dotnet/corefx/wiki/ApiCompat](https://github.com/dotnet/corefx/wiki/ApiCompat) for more details. + - Exception thrown from C# dynamic binder when calling interface methods on WinRT objects. [476163] + - Exception: ```Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:The call is ambiguous between the following methods or properties: System.Collections.Generic.IDictionary.Add(string, object) and System.Collections.Generic.IDictionary.Add(string, object)``` + - Workaround: The recommended fix would be to cast the dynamic object to the desired interface type and just make a call statically. + - Example: ```dynamicObject.Add("key", value);``` + - Fix: ```((IDictionary)dynamicObject).Add("key", value);``` + +- **Build Warnings and other Compilation Changes** + - App developers encountering an OutOfMemoryException during Release compilation can specify ```true``` in their project properties. This will run part of the toolchain on a single thread reducing the amount of memory used, and it may prevent the exception. + - App sizes and build times have increased by approximately 20% due to support for additional .NET Standard 2.0 APIs + - ```MCG0004:InternalAssert Assert Failed: unexpectedly found non-native type during [UNKNOWN] Caused by an interop-eligible struct(outer) containing a second struct(inner) as a field with explicit layout and one or more static fields.``` The workaround is to declare all the static fields of the inner struct before the instance fields. [484367] + - Clicking ```"Enable static analysis for .NET Native"``` option in UWP project properties fails with the error: ```Could not find file 'x86\ilc\lib\Facades'``` + - Workaround: Uncheck the ```"Enable static analysis for .NET Native"``` option in project properties under the Build pane + +## Resources + +- [Getting Started with .NET Native](https://docs.microsoft.com/en-us/dotnet/framework/net-native/getting-started-with-net-native) +- [Microsoft.NETCore.UniversalWindowsPlatform NuGet Package Details](https://www.nuget.org/packages/Microsoft.NETCore.UniversalWindowsPlatform) +- [Windows Dev Center](https://developer.microsoft.com/en-us/windows/apps/getstarted) +- [Downloads and tools for Windows 10](https://developer.microsoft.com/en-us/windows/downloads) diff --git a/releases/UWP/net-native2.0/funceval.md b/releases/UWP/net-native2.0/funceval.md new file mode 100644 index 000000000..be93a31ab --- /dev/null +++ b/releases/UWP/net-native2.0/funceval.md @@ -0,0 +1,61 @@ +# .NET Native 2.0 Function Evaluation Debugger Support (Preview) + +As part of the [.NET Native 2.0 release](README.md), we have shipped a preview of the FuncEval feature that aims to improve diagnostics and overall debugging experience for UWP Applications compiled with the .NET Native 2.0 toolchain. Please note that since this is only a public preview of the feature, it is turned off by default and can be turned on by setting a registry key. Once FuncEval support is enabled, you should be able to inspect WinRT Properties under the debugger, that you previously could not. + +## How to use Function Evaluation (FuncEval) in Visual Studio 2017 15.4 + +1. Start by creating a blank UWP Application +2. Switch the application to use **Debug Configuration** and select **Compile with .NET Native tool chain** in the project property page + + ![Visual Studio FuncEval Config](images/funceval-0.png) + +3. Create a TextBox and a Button and then write the following code : + ```private void Button_Click(object sender, RoutedEventArgs e) + { + this.TextField.Text = this.TextField.Text + "Blah"; + } + ``` +4. Set a breakpoint in the Button_Click event handler + - Inspecting the ```this.TextField.Text``` will report ```Evaluation of method Windows.UI.Xaml.Controls.TextBox.get_Text requires reading field.System.RuntimeTypeHandle._value, which is not available in this context.``` + + ![Visual Studio FuncEval Disabled](images/funceval-1.png) + +5. Now enable FuncEval support by setting the NetNativeFuncEvalEnabled registry key + - Open a command prompt and execute: + - ```"C:\Program Files (x86)\Microsoft Visual Studio\Enterprise\Common7\IDE\VsRegEdit.exe" set "C:\Program Files (x86)\Microsoft Visual Studio\Enterprise" HKCU Debugger NetNativeFuncEvalEnabled DWORD 1``` + - Note that you will have to change the Visual Studio Path (```"C:\Program Files (x86)\Microsoft\Visual Studio\Enterprise"```) to match your local environment. + +6. There is no need to close or restart Visual Studio, just run the command and debug again. Now the debugger autos menu will show you the contents of this.TextField.Text: + +![Visual Studio FuncEval Enabled](images/funceval-2.png) + +## How to disable Function Evaluation (FuncEval) in Visual Studio 2017 15.4 + +- If the FuncEval preview is causing any problems, you can turn it off by changing the registry key value to zero (0) + - Open a command prompt and execute: + - ```"C:\Program Files (x86)\Microsoft Visual Studio\Enterprise\Common7\IDE\VsRegEdit.exe" set "C:\Program Files (x86)\Microsoft Visual Studio\Enterprise" HKCU Debugger NetNativeFuncEvalEnabled DWORD 0``` + - Again, you will have to change the Visual Studio Path (```"C:\Program Files (x86)\Microsoft\Visual Studio\Enterprise"```) to match your local environment. + + +## Windows.UI.Xaml.UnhandledExceptionEventArgs + +One particular property that developers really want to inspect is the Exception field on the Windows.UI.Xaml.UnhandledExceptionEventArgs object. To do so, add the following to your Default.rd.xml: + +``` + + + + + + +``` + +With the Default.rd.xml setup and the FuncEval feature enabled you can inspect the expection object now. In general, this approach should work for all properties that you would like to inspect. + +## Known Issues + +- The FuncEval Preview currently does not support inspection of generic functions or properties. + +## Provide Feedback + +Please continue to send questions and suggestions to dotnetnative@microsoft.com. We look forward to hearing from you and seeing what great things you will build. diff --git a/releases/UWP/net-native2.0/images/funceval-0.png b/releases/UWP/net-native2.0/images/funceval-0.png new file mode 100644 index 000000000..644eef5f2 Binary files /dev/null and b/releases/UWP/net-native2.0/images/funceval-0.png differ diff --git a/releases/UWP/net-native2.0/images/funceval-1.png b/releases/UWP/net-native2.0/images/funceval-1.png new file mode 100644 index 000000000..0fb99b19c Binary files /dev/null and b/releases/UWP/net-native2.0/images/funceval-1.png differ diff --git a/releases/UWP/net-native2.0/images/funceval-2.png b/releases/UWP/net-native2.0/images/funceval-2.png new file mode 100644 index 000000000..e88a7d0f5 Binary files /dev/null and b/releases/UWP/net-native2.0/images/funceval-2.png differ diff --git a/releases/UWP/net-native2.0/incremental-compilation.md b/releases/UWP/net-native2.0/incremental-compilation.md new file mode 100644 index 000000000..bbc1f468c --- /dev/null +++ b/releases/UWP/net-native2.0/incremental-compilation.md @@ -0,0 +1,92 @@ +# .NET Native 2.0 Incremental Build Support Preview + +By default, UWP apps use .NET Core runtime (with its JIT) in Debug builds (F5 scenario) and .NET Native compiler and runtime for Release builds. There are inherent differences between the two runtimes both in behavior (for example reflection) as well as performance characteristics. This means that there might be situations where the code works well with CoreCLR but shows some undesirable behavior on .NET Native. Switching to release build to find these issues is cumbersome. +While it is possible to turn on .NET Native even for Debug builds today, the compilation can take a long time which makes the typical developer cycle slow. As part of the [.NET Native 2.0 release](README.md), .NET Native incremental build support is trying to address this by providing a better Debug build experience while using the .NET Native compiler and runtime. + +This new build mode only recompiles assemblies which have changed or those which have dependencies which have changed. It also intentionally avoids some expensive compilation steps favoring faster compilation time over smaller and faster code (unlike the Release build mode which is the exact opposite). This new behavior can substantially reduce the compilation time of an application using the .NET Native tool chain. +Using .NET Native incremental build mode allows developers to use the .NET Native compiler and runtime for the app development, avoiding issues caused by differences between the CoreCLR and .NET Native runtimes while still maintaining a good developer experience. + +Please note that .NET Native incremental build is a feature preview. While it is much faster in most cases than normal build modes, we still expect to improve the compiler performance as we get closer to the final release of this feature. There are also some known issues which can lead to failures specific to this build mode. Please find the list of known issues below. +As of now the .NET Native incremental build is rather slow when there's a change in the WinRT interop the app uses as it will trigger almost a full rebuild. This is typically the case when the app's XAML or XAML related code is edited. As such we would recommend to keep using the .NET Core runtime based build while iterating on the UI of the app. The experience with .NET Native incremental build in this case would not be ideal. + +## How to enable .NET Native 2.0 Incremental Build Support + +Currently the new build mode is only supported in Debug configurations of UWP apps which use the shared framework package. To turn it on please follow these steps: +1. In the project settings for the UWP app, under the Build tab turn on the "Compile with .NET Native tool chain" for the Debug configuration. +2. Open the project file for the UWP application in a text editor and add this property group: + +``` + + true + +``` +3. After making these changes, please make sure to cleanly Rebuild the entire solution in the Debug configuration first. Subsequent incremental builds should then work as usual. You should be able to develop, build, run and debug the application as usual. + +To go back and forth between .NET Native and .NET Core just use the checkbox in the build configuration tab of the project. + +The incremental build is only supported on .NET Native 2.0, which in turn is only used if the app has its minimum target version of Windows SDK set to the Windows Fall Creators Update SDK. + +## Known Issues + +**WCF Proxies with XmlSerializer are not supported** +- ```ILT0042: WCF proxies with types which require use of XmlSerializer are not supported in incremental build mode. Found type '...'``` which requires XmlSerializer and is used by WCF proxy. Please turn off incremental .NET Native build mode for this project. +- No workaround. For such apps please turn incremental build off. + +**Compilation fails due to missing assemblies** +- ```Internal compiler error: MCG0023:UnresolvableAssemblyReference Unresolvable assembly reference 'Assembly(Name=…, Version=…, Culture=…, PublicKeyToken=...)' found. Please check the references in your build system. A reference is either missing or an assembly is missing an expected type.``` +- Incremental build is more sensitive to missing assemblies in the app since it doesn't remove dead code in any way. The solution is to not have missing assemblies in the app. If that is not possible there's no workaround and incremental build should be turned off. + +**Compilation fails due to duplicate assemblies** +- ```RHBIND : error RHB0007: Could not load input file 'SharedLibrary.mdildll'.``` +- .NET Native generates and uses certain assemblies which must not exist in the input application. The incremental build is a little bit more sensitive to this condition than the non-incremental builds. +- Application assemblies should avoid names that begin with ```System.``` as well as ```SharedLibrary.dll.``` +- Workaround: rename the application assembly which causes the problem. + +**WinRT Types or properties on WinRT types which are only accessed through reflection might not work** +- This can show up as various runtime exceptions. MissingMetadataException, NullReferenceException and so on. The code behaves as if the type or property simply doesn't exist most of the time. +- One such example would be: ```typeof(someWinRTType).GetProperty("propertyName")``` +- This would return null even though the property does exist on the type. +- Workarounds (one or the other, or both but it's not necessary): + - Add a new .xr.xml file (the name doesn't matter, only the extension is recognized) into the app and mark the type/property as rooted. For the above sample it would look like this: `````` +``` + + + + + + + +``` +- In the application code reference the property/type directly from the code. There's no need to do anything with them, just have a reference. So for types, having a typeof(someWinRTType) is enough. For properties some type of access to the property is enough. It can be dead code which nobody calls (in fact that's preferable). +- Both approaches should have very minimal effect on non-incremental builds, but should fix the incremental build problem. + +**Non-Generic Marshal API might not work.** +- MissingMetadataException will be thrown during runtime when calling these non-generic Marshal API +- Example: ```Marshal.PtrToStructure(IntPtr, Object)``` +- Workaround: Use generic version Marshal API + +**Bad Pinvoke might not work** +- Fail to launch app +- Example: ```[DllImport("neverexists.dll")] void Func();``` +- Workaround: remove these bad pinvokes or provide a fake dll + +**Object methods Override for WinRT type might not work** +- The result from calling WinRT Types's ToString()/GetHashCode()/Equals() in managed code will be from default implementation Object's ToString()/GetHashCode()/Equals() instead of WinRT's Override methods. +- Example: Create a WinRT interface which contains ToString()/GetHashCode()/Equals() methods, and Create a WinRT class to implements this WinRT interface to override Object default implementation for ToString()/GetHashCode()/Equals(). +- Workaround: Use IStringable to Override Object ToString() behavior + +**Serialize WinRT enum might not work** +- System.Runtime.Serialization.SerializationException:Enum value '0' is invalid for type 'Windows.UI.Xaml.Visibility' and cannot be serialized. +- No workaround. Please turn off incremental build. + +**Lookup of WinRT enum values in WinRT dictionaries might not work** +- System.ArgumentException:Requested value 'Collapsed' was not found. +- No workaround. Please turn off incremental build. + +**Compilation might fail with stack overflow if the app has an attribute class which is used as an attribute on itself** +- For example: ```[ReproAttribute] public class ReproAttribute : Attribute {}``` +- If possible remove the attribute on the attribute class itself. Otherwise there's no workaround and incremental build should be turned off. + +## Provide Feedback + +Please continue to send questions and suggestions to dotnetnative@microsoft.com. We look forward to hearing from you and seeing what great things you will build. diff --git a/releases/UWP/net-native2.1/README.md b/releases/UWP/net-native2.1/README.md new file mode 100644 index 000000000..687b53b3b --- /dev/null +++ b/releases/UWP/net-native2.1/README.md @@ -0,0 +1,28 @@ +# .NET native tools 2.1 (UWP 6.1.x) Release Notes + +You can see what was included in each .NET Native 2.1 ([Microsoft.NETCore.UniversalWindowsPlatform 6.1.x](https://www.nuget.org/packages/Microsoft.NETCore.UniversalWindowsPlatform)) release below. + +When using Visual Studio these packages require Visual Studio 2017 Version 15.7 or later. + +### UWP 6.1.12 (.NET native tools 2.1.8) (March 13th, 2019) +- Fix for a domain spoofing vulnerability which causes the meaning of a URI to change when International Domain Name encoding is applied. An attacker who successfully exploited the vulnerability could redirect a URI. (https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0657) + +### UWP 6.1.9 (.NET native tools 2.1.8) (October 9th, 2018) +- Fixed CVE-2018-8292:.NET Information Disclosure Vulnerability: https://github.com/dotnet/announcements/issues/88 + +### UWP 6.1.7 (.NET native tools 2.1.8) (July 27th, 2018) +- Fixed CVE-2018-8356: Security Feature Bypass in X509 Certificate Validation: https://github.com/dotnet/announcements/issues/73 + +### UWP 6.1.5 (.NET native tools 2.1.8) (May 30th, 2018) +- Updates NETStandard.Library reference from version 2.0.2 to 2.0.3 to fix [UWP reference additional NetStandard dll after 15.7](https://developercommunity.visualstudio.com/content/problem/251571/uwp-reference-additional-netstandard-dll-after-157.html) and [After installing ..., a lot of warnings occur](https://github.com/dotnet/standard/issues/708) + +### UWP 6.1.4 (.NET native tools 2.1.8) (May 7th, 2018) +- Adds support for [Optional packages with executable code](https://docs.microsoft.com/en-us/windows/uwp/packaging/optional-packages-with-executable-code) +- Fixes multiple errors caused by low memory issues when compiling .NET native apps [521825, 574099, 574102] +- Fixes Binding issues when using ReactiveUI [406415 and 406417] +- Fixes VS new project scenarios to include the correct Runtime Directives [464683] +- Fixes an issue handling unicode characters in .NET native targets [482808] +- Adds support for the Diagnostics.DisableMetadataStackTraceResolution AppContextSwitch [519008] +- Fixes crashes during compilation [525417] +- Fixes issue found when compiling complex generic types like those found in NPGSQL NuGet package [588948] +- Fixes an issue when using System.Runtime.InteropServices.SafeHandle as an argument in native to managed scenarios [601979] diff --git a/releases/UWP/net-native2.2/README.md b/releases/UWP/net-native2.2/README.md new file mode 100644 index 000000000..d70ddb4aa --- /dev/null +++ b/releases/UWP/net-native2.2/README.md @@ -0,0 +1,84 @@ +# .NET native tools 2.2 (UWP 6.2.x) Release Notes + +You can see what was included in each .NET Native 2.2 ([Microsoft.NETCore.UniversalWindowsPlatform 6.2.x](https://www.nuget.org/packages/Microsoft.NETCore.UniversalWindowsPlatform)) release below. + +When using Visual Studio, these packages require Visual Studio 2019 or Visual Studio 2017 Version 15.9. + +### UWP 6.2.14 (June 13th, 2022) +- Address Brotli Library Buffer Overflow Vulnerability (https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2020-8927) +- Opt-in fix to generate PDB's out of process. This is an alternate to `NoLinkerSymbols` which generates .NET native symbols and addresses the error `Error code RHBIND : error RHB0002: Failed to write PDB. Fix for build failures with RHBIN error when building Xamarin and SyncFusion UWP projects.` To enable the change, add `true` to the appropriate property groups in the application csproj file. +- Fix `ILT0014: Failed to compile interop source code. See the build log for error details.` +- Fix ARM64 application crash when calling methods with more than 8 arguments in finally block +- Fix ARM64 compilation issues when targeting latest Windows SDK breaks + +### UWP 6.2.13 (October 13th, 2021) +- Fix data serialization on .NET Native +- Update clrcompression zlib from 1.2.8 to 1.2.11 +- Fix F5 inner dev-loop performance issue by generating System.Private.Corelib Ready-To-Run image + +### UWP 6.2.12 (February 9th, 2021) +- Error code RHBIND : error RHB0002: Failed to write PDB. Fix for build failures with RHBIN error when building Xamarin and SyncFusion UWP projects. This is an opt-in fix and requires customer to setting the msbuild property NoLinkerSymbols +- Fix to execution engine exception when loading InAppUI in Xamarin. + +### UWP 6.2.11 (November 19th, 2020) +- .NET Native fix for call to `string.Replace` does not terminate and goes into an infinite loop +- Fix is to consume updated Telemetry files which is shipped in UWP 6.2.11 +- Fix denial of service (DoS) by cap the maximum length passed to the StringBuilder(int capacity) ctor +- Fix to avoid incorrectly leaking thread COM state to default thread pool by turning on AppContext switch by default. 6.2.10 had shipped the original fix but with this release the switch is enabled by default +- Fix for crashes seen in WireUpCoreRuntime on duplicate executables +- Fix ILT0005 error when building InMobiSDk. This Fix addresses an access violation in complier when building InMobiSDK resulting in ILT0005 error +- This build provides a workaround that resolves OOM issues for ARM64 compilation scenarios + +### UWP 6.2.10 (March 18th, 2020) +- Fix for RhpCallFilterFunclet stack misalignment on ARM causing runtime failures +(https://github.com/dotnet/corert/pull/7744) +- Fix for compiler crashes seen for SixLabors.ImageSharp API when targeting x86 and trying to generate mixed floating point/vector code +- Fix for crashes seen when using System.IO.Directory.GetFiles and System.IO.DirectoryInfo.GetDirectories on ARM32 with UWP apps +(https://github.com/dotnet/runtime/issues/27943#issuecomment-529400749) +- Fix for crashes seen in rhbind.exe for some Unity apps +- Fix to avoid incorrectly leaking COM thread state when returning threads to the OS thread pool +- Fix for app crashes seen during garbage collection on ARM 32 due to heap corruption + +### UWP 6.2.9 (August 23rd, 2019) + +- Reduce optimizer maximum thread count for Store compilations to increase ingestion reliability +- Fix issue in the analysis engine related to unsafe patterns that could lead to NullReferenceException (https://github.com/dotnet/core/issues/2614) +- Fix gatekeeper errors due to bad System.Private.Uri AssemblyVersion +- Fix "Invalid IL" warning from some unsafe code patterns +- Fix type system issue regarding parameter constraints on methods (https://github.com/SixLabors/ImageSharp/issues/828) +- Fix interop compilation failure for gRPC Authentication package (https://github.com/grpc/grpc/issues/18188) +- Fix intop code generation failure for System.IO.ISoreafeItemHandleAccess.Create (https://developercommunity.visualstudio.com/content/problem/310750/release-compile-fails-due-to-errors-in-mcg-generat.html) +- Adjust garbage collection timing during interop to eliminate memory increase in UWP app when navigating between pages +- Fix issue leading to Access Violation in the garbage collector caused by ARM32 volatile registers not being populated correctly +- Fix reference assemblies for WCF so they have the expected public key (https://github.com/dotnet/wcf/issues/3743) +- Fix issue causing Visual Studio 2017 hangs during debugging sessions + +### UWP 6.2.8 (March 13th, 2019) +- Fixes package publishing issues + +### UWP 6.2.7 (March 12th, 2019) +- Adds support for ARM64 +- Improved performance for debugging scenarios (F5) +- Addresses top customer issues with 6.1 and 6.2 Preview. +- Addresses some issues when used with ReactiveUI 4.1. It is still recommended that projects wishing to use this package add ShortcutGenericAnalysis flag set to true to the projects. +- Fix metadata reader issue leading to build failure when using Microsoft.ML.Net (https://github.com/XamlBrewer/UWP-MachineLearning-Sample/pull/1#issuecomment-469988557) +- Fix crashes during resource loading for some locales (https://developercommunity.visualstudio.com/content/problem/386760/net-native-22-uwp-project-build-fail.html) +- Fix crashes caused by improper escaping for application assets with spaces in path (https://github.com/Microsoft/dotnet/issues/930) +- Add PackageConflictPreferredPackages property to avoid build breaks with certain package graphs +- Fix issues related to Store upload failures (Error 1201) +- Fix for a domain spoofing vulnerability which causes the meaning of a URI to change when International Domain Name encoding is applied. An attacker who successfully exploited the vulnerability could redirect a URI. (https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-0657) + + +### UWP 6.2.0-preview1-26926-04 Preview (October 2nd, 2018) +These are preview bits in advance of the release in November 2018 available in Visual Studio 15.9 Preview 3 +- Improved performance for debugging scenarios (F5) +- Addresses bugs when used with React Framework 4.1 + +### UWP 6.2.0-preview1-26831-02 Preview (September 11th, 2018) +These are preview bits in advance of the release in November 2018 available in Visual Studio 15.9 Preview 2 +- Integrates support for ARM64 into the Visual Studio tooling experience +- Addresses top cusomter issues with 6.1 and 6.2 Preview. + +### UWP 6.2.0-Preview1-26502-02 Preview (May 7th, 2018) +These are preview bits in advance of the release at the end of 2018 +- Adds support for ARM64 diff --git a/releases/net45/README.md b/releases/net45/README.md new file mode 100644 index 000000000..d1c239b11 --- /dev/null +++ b/releases/net45/README.md @@ -0,0 +1,10 @@ +# .NET Framework 4.5 Release Notes + +You can learn about the changes made in the .NET Framework 4.5. + +The .NET Framework 4.5 is no longer supported by Microsoft. + +- [.NET Framework 4.5 announcement blog post](https://blogs.msdn.microsoft.com/dotnet/2012/08/15/announcing-the-release-of-net-framework-4-5-rtm-product-and-source-code/) +- [What's new in the .NET Framework 4.5](https://docs.microsoft.com/dotnet/articles/framework/whats-new/index#v45) +- [Application compatibility](../../Documentation/compatibility/README.md#net-framework-45) +- [Known issues](https://support.microsoft.com/en-us/help/2890857/known-issues-for-the-.net-framework-4.5) diff --git a/releases/net451/README.md b/releases/net451/README.md new file mode 100644 index 000000000..e82fd6dd0 --- /dev/null +++ b/releases/net451/README.md @@ -0,0 +1,11 @@ +# .NET Framework 4.5.1 Release Notes + +You can learn about the changes made in the .NET Framework 4.5.1. + +The .NET Framework 4.5.1 is no longer supported by Microsoft. + +- [Download](http://go.microsoft.com/fwlink/?LinkId=321326) +- [.NET Framework 4.5.1 announcement blog post](https://blogs.msdn.microsoft.com/dotnet/2013/10/17/net-framework-4-5-1-rtm-start-coding/) +- [What's new in the .NET Framework 4.5.1](https://docs.microsoft.com/dotnet/articles/framework/whats-new/index#v451) +- [Application compatibility](../../Documentation/compatibility/README.md#net-framework-451) +- [Known issues](https://support.microsoft.com/en-us/help/2890857/known-issues-for-the-.net-framework-4.5.1) diff --git a/releases/net452/README.md b/releases/net452/README.md new file mode 100644 index 000000000..2637c8838 --- /dev/null +++ b/releases/net452/README.md @@ -0,0 +1,9 @@ +# .NET Framework 4.5.2 Release Notes + +You can learn about the changes made in the .NET Framework 4.5.2. + +- [Download](http://go.microsoft.com/fwlink/?LinkId=397674) +- [.NET Framework 4.5.2 announcement blog post](https://blogs.msdn.microsoft.com/dotnet/2014/05/05/announcing-the-net-framework-4-5-2/) +- [What's new in the .NET Framework 4.5.2](https://docs.microsoft.com/dotnet/articles/framework/whats-new/index#v452) +- [Application compatibility](../../Documentation/compatibility/README.md#net-framework-452) +- [Known issues](https://support.microsoft.com/en-us/help/2962547/known-issues-for-the-.net-framework-4.5.2) diff --git a/releases/net46/README.md b/releases/net46/README.md new file mode 100644 index 000000000..365a87206 --- /dev/null +++ b/releases/net46/README.md @@ -0,0 +1,23 @@ +# .NET Framework 4.6 Release Notes + +You can learn about the changes made in the .NET Framework 4.6. + +- [Download](http://go.microsoft.com/fwlink/?LinkId=528259) +- [.NET Framework 4.6 announcement blog post](https://blogs.msdn.microsoft.com/dotnet/2015/07/20/announcing-net-framework-4-6/) +- [What's new in the .NET Framework 4.6](https://docs.microsoft.com/dotnet/articles/framework/whats-new/index#v46) +- [Release notes](dotnet46-changes.md) +- [Application compatibility](../../Documentation/compatibility/README.md#net-framework-46) +- [API changes](dotnet46-api-changes.md) +- [Reference Source](https://github.com/Microsoft/referencesource/commit/ec178a5e7deb87a9cc7e0982ee32b7d965735b16) +- [Known issues](https://support.microsoft.com/en-us/help/3047761/known-issues-for-the-.net-framework-4.6) + +# Release Notes by Product Area + +- [ASP.NET](dotnet46-changes.md#aspnet) +- [BCL](dotnet46-changes.md#bcl) +- [CLR](dotnet46-changes.md#clr) +- [Entity Framework](dotnet46-changes.md#entity-framework) +- [WCF](dotnet46-changes.md#wcf) +- [Windows Forms](dotnet46-changes.md#windows-forms) +- [Workflow](dotnet46-changes.md#workflow) +- [WPF](dotnet46-changes.md#wpf) diff --git a/releases/net46/dotnet46-api-changes.html b/releases/net46/dotnet46-api-changes.html new file mode 100644 index 000000000..4ccf111fb --- /dev/null +++ b/releases/net46/dotnet46-api-changes.html @@ -0,0 +1,1222 @@ + + + + + +

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2
+C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6
+namespace Microsoft.Win32 {
+  public sealed class RegistryKey : MarshalByRefObject, IDisposable {
+    public RegistryKey CreateSubKey(string subkey, bool writable);
+    public RegistryKey CreateSubKey(string subkey, bool writable, RegistryOptions options);
+    public RegistryKey OpenSubKey(string name, RegistryRights rights);
+  }
+}
+namespace Microsoft.Win32.SafeHandles {
+  public sealed class SafeAccessTokenHandle : SafeHandle {
+    public SafeAccessTokenHandle(IntPtr handle);
+    public static SafeAccessTokenHandle InvalidHandle { get; }
+    public override bool IsInvalid { get; }
+    protected override bool ReleaseHandle();
+  }
+  public sealed class SafeProcessHandle : SafeHandleZeroOrMinusOneIsInvalid {
+    public SafeProcessHandle(IntPtr existingHandle, bool ownsHandle);
+    protected override bool ReleaseHandle();
+  }
+  public sealed class SafeX509ChainHandle : SafeHandleZeroOrMinusOneIsInvalid {
+    protected override bool ReleaseHandle();
+  }
+}
+namespace System {
+  public static class AppContext {
+    public static string BaseDirectory { get; }
+    public static void SetSwitch(string switchName, bool isEnabled);
+    public static bool TryGetSwitch(string switchName, out bool isEnabled);
+  }
+  public abstract class Array : ICloneable, ICollection, IEnumerable, IList, IStructuralComparable, IStructuralEquatable {
+    public static T[] Empty<T>();
+  }
+  public static class Buffer {
+    [MethodImpl(AggressiveInlining)]public unsafe static void MemoryCopy(void* source, void* destination, long destinationSizeInBytes, long sourceBytesToCopy);
+    [MethodImpl(AggressiveInlining)]public unsafe static void MemoryCopy(void* source, void* destination, ulong destinationSizeInBytes, ulong sourceBytesToCopy);
+  }
+  public static class Console {
+    [MethodImpl(NoInlining)]public static int Read();
+    [MethodImpl(NoInlining)]public static string ReadLine();
+    [MethodImpl(NoInlining)]public static void Write(bool value);
+    [MethodImpl(NoInlining)]public static void Write(char value);
+    [MethodImpl(NoInlining)]public static void Write(char[] buffer);
+    [MethodImpl(NoInlining)]public static void Write(char[] buffer, int index, int count);
+    [MethodImpl(NoInlining)]public static void Write(decimal value);
+    [MethodImpl(NoInlining)]public static void Write(double value);
+    [MethodImpl(NoInlining)]public static void Write(int value);
+    [MethodImpl(NoInlining)]public static void Write(long value);
+    [MethodImpl(NoInlining)]public static void Write(object value);
+    [MethodImpl(NoInlining)]public static void Write(float value);
+    [MethodImpl(NoInlining)]public static void Write(string value);
+    [MethodImpl(NoInlining)]public static void Write(string format, object arg0);
+    [MethodImpl(NoInlining)]public static void Write(string format, object arg0, object arg1);
+    [MethodImpl(NoInlining)]public static void Write(string format, object arg0, object arg1, object arg2);
+    [MethodImpl(NoInlining)]public static void Write(string format, object arg0, object arg1, object arg2, object arg3, __arglist);
+    [MethodImpl(NoInlining)]public static void Write(string format, params object[] arg);
+    [MethodImpl(NoInlining)]public static void Write(uint value);
+    [MethodImpl(NoInlining)]public static void Write(ulong value);
+    [MethodImpl(NoInlining)]public static void WriteLine();
+    [MethodImpl(NoInlining)]public static void WriteLine(bool value);
+    [MethodImpl(NoInlining)]public static void WriteLine(char value);
+    [MethodImpl(NoInlining)]public static void WriteLine(char[] buffer);
+    [MethodImpl(NoInlining)]public static void WriteLine(char[] buffer, int index, int count);
+    [MethodImpl(NoInlining)]public static void WriteLine(decimal value);
+    [MethodImpl(NoInlining)]public static void WriteLine(double value);
+    [MethodImpl(NoInlining)]public static void WriteLine(int value);
+    [MethodImpl(NoInlining)]public static void WriteLine(long value);
+    [MethodImpl(NoInlining)]public static void WriteLine(object value);
+    [MethodImpl(NoInlining)]public static void WriteLine(float value);
+    [MethodImpl(NoInlining)]public static void WriteLine(string value);
+    [MethodImpl(NoInlining)]public static void WriteLine(string format, object arg0);
+    [MethodImpl(NoInlining)]public static void WriteLine(string format, object arg0, object arg1);
+    [MethodImpl(NoInlining)]public static void WriteLine(string format, object arg0, object arg1, object arg2);
+    [MethodImpl(NoInlining)]public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3, __arglist);
+    [MethodImpl(NoInlining)]public static void WriteLine(string format, params object[] arg);
+    [MethodImpl(NoInlining)]public static void WriteLine(uint value);
+    [MethodImpl(NoInlining)]public static void WriteLine(ulong value);
+  }
+  public struct DateTimeOffset : IComparable, IComparable<DateTimeOffset>, IDeserializationCallback, IEquatable<DateTimeOffset>, IFormattable, ISerializable {
+    public static DateTimeOffset FromUnixTimeMilliseconds(long milliseconds);
+    public static DateTimeOffset FromUnixTimeSeconds(long seconds);
+    public long ToUnixTimeMilliseconds();
+    public long ToUnixTimeSeconds();
+  }
+  public abstract class FormattableString : IFormattable {
+    protected FormattableString();
+    public abstract int ArgumentCount { get; }
+    public abstract string Format { get; }
+    public abstract object GetArgument(int index);
+    public abstract object[] GetArguments();
+    public static string Invariant(FormattableString formattable);
+    string System.IFormattable.ToString(string ignored, IFormatProvider formatProvider);
+    public override string ToString();
+    public abstract string ToString(IFormatProvider formatProvider);
+  }
+  public static class GC {
+    public static void Collect(int generation, GCCollectionMode mode, bool blocking, bool compacting);
+    public static void EndNoGCRegion();
+    public static bool TryStartNoGCRegion(long totalSize);
+    public static bool TryStartNoGCRegion(long totalSize, bool disallowFullBlockingGC);
+    public static bool TryStartNoGCRegion(long totalSize, long lohSize);
+    public static bool TryStartNoGCRegion(long totalSize, long lohSize, bool disallowFullBlockingGC);
+  }
+  public sealed class String : ICloneable, IComparable, IComparable<string>, IConvertible, IEnumerable, IEnumerable<char>, IEquatable<string> {
+    public static string Format(IFormatProvider provider, string format, object arg0);
+    public static string Format(IFormatProvider provider, string format, object arg0, object arg1);
+    public static string Format(IFormatProvider provider, string format, object arg0, object arg1, object arg2);
+  }
+  public class Uri : ISerializable {
+    public string IdnHost { get; }
+  }
+}
+namespace System.Collections.Concurrent {
+  public class BlockingCollection<T> : ICollection, IDisposable, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T> {
+  }
+  public class ConcurrentBag<T> : ICollection, IEnumerable, IEnumerable<T>, IProducerConsumerCollection<T>, IReadOnlyCollection<T> {
+  }
+  public class ConcurrentDictionary<TKey, TValue> : ICollection, ICollection<KeyValuePair<TKey, TValue>>, IDictionary, IDictionary<TKey, TValue>, IEnumerable, IEnumerable<KeyValuePair<TKey, TValue>>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IReadOnlyDictionary<TKey, TValue> {
+    IEnumerable<TKey> System.Collections.Generic.IReadOnlyDictionary<TKey,TValue>.Keys { get; }
+    IEnumerable<TValue> System.Collections.Generic.IReadOnlyDictionary<TKey,TValue>.Values { get; }
+  }
+  public class ConcurrentQueue<T> : ICollection, IEnumerable, IEnumerable<T>, IProducerConsumerCollection<T>, IReadOnlyCollection<T> {
+  }
+  public class ConcurrentStack<T> : ICollection, IEnumerable, IEnumerable<T>, IProducerConsumerCollection<T>, IReadOnlyCollection<T> {
+  }
+}
+namespace System.Collections.Generic {
+  public class HashSet<T> : ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+  }
+  public class LinkedList<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable {
+  }
+  public class Queue<T> : ICollection, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T> {
+  }
+  public class SortedDictionary<TKey, TValue> : ICollection, ICollection<KeyValuePair<TKey, TValue>>, IDictionary, IDictionary<TKey, TValue>, IEnumerable, IEnumerable<KeyValuePair<TKey, TValue>>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IReadOnlyDictionary<TKey, TValue> {
+    IEnumerable<TKey> System.Collections.Generic.IReadOnlyDictionary<TKey,TValue>.Keys { get; }
+    IEnumerable<TValue> System.Collections.Generic.IReadOnlyDictionary<TKey,TValue>.Values { get; }
+    public sealed class KeyCollection : ICollection, ICollection<TKey>, IEnumerable, IEnumerable<TKey>, IReadOnlyCollection<TKey> {
+    }
+    public sealed class ValueCollection : ICollection, ICollection<TValue>, IEnumerable, IEnumerable<TValue>, IReadOnlyCollection<TValue> {
+    }
+  }
+  public class SortedList<TKey, TValue> : ICollection, ICollection<KeyValuePair<TKey, TValue>>, IDictionary, IDictionary<TKey, TValue>, IEnumerable, IEnumerable<KeyValuePair<TKey, TValue>>, IReadOnlyCollection<KeyValuePair<TKey, TValue>>, IReadOnlyDictionary<TKey, TValue> {
+    IEnumerable<TKey> System.Collections.Generic.IReadOnlyDictionary<TKey,TValue>.Keys { get; }
+    IEnumerable<TValue> System.Collections.Generic.IReadOnlyDictionary<TKey,TValue>.Values { get; }
+  }
+  public class SortedSet<T> : ICollection, ICollection<T>, IDeserializationCallback, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T>, ISerializable, ISet<T> {
+  }
+  public class Stack<T> : ICollection, IEnumerable, IEnumerable<T>, IReadOnlyCollection<T> {
+  }
+}
+namespace System.Configuration {
+  public sealed class RsaProtectedConfigurationProvider : ProtectedConfigurationProvider {
+    public bool UseFIPS { get; }
+  }
+}
+namespace System.Data.Common {
+  public class DbEnumerator : IEnumerator {
+    public DbEnumerator(DbDataReader reader);
+    public DbEnumerator(DbDataReader reader, bool closeReader);
+  }
+}
+namespace System.Data.SqlClient {
+  public enum SqlAuthenticationMethod {
+    ActiveDirectoryIntegrated = 3,
+    ActiveDirectoryPassword = 2,
+    NotSpecified = 0,
+    SqlPassword = 1,
+  }
+  public sealed class SqlBulkCopy : IDisposable {
+    public void WriteToServer(DbDataReader reader);
+    public Task WriteToServerAsync(DbDataReader reader);
+    public Task WriteToServerAsync(DbDataReader reader, CancellationToken cancellationToken);
+  }
+  public sealed class SqlColumnEncryptionCertificateStoreProvider : SqlColumnEncryptionKeyStoreProvider {
+    public SqlColumnEncryptionCertificateStoreProvider();
+    public override byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] encryptedColumnEncryptionKey);
+    public override byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey);
+  }
+  public abstract class SqlColumnEncryptionKeyStoreProvider {
+    protected SqlColumnEncryptionKeyStoreProvider();
+    public abstract byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] encryptedColumnEncryptionKey);
+    public abstract byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey);
+  }
+  public sealed class SqlCommand : DbCommand, ICloneable {
+    public SqlCommand(string cmdText, SqlConnection connection, SqlTransaction transaction, SqlCommandColumnEncryptionSetting columnEncryptionSetting);
+    public SqlCommandColumnEncryptionSetting ColumnEncryptionSetting { get; }
+  }
+  public enum SqlCommandColumnEncryptionSetting {
+    Disabled = 3,
+    Enabled = 1,
+    ResultSetOnly = 2,
+    UseConnectionSetting = 0,
+  }
+  public sealed class SqlConnection : DbConnection, ICloneable {
+    public string AccessToken { get; set; }
+    public static IDictionary<string, IList<string>> ColumnEncryptionTrustedMasterKeyPaths { get; }
+    public static void RegisterColumnEncryptionKeyStoreProviders(IDictionary<string, SqlColumnEncryptionKeyStoreProvider> customProviders);
+  }
+  public enum SqlConnectionColumnEncryptionSetting {
+    Disabled = 0,
+    Enabled = 1,
+  }
+  public sealed class SqlConnectionStringBuilder : DbConnectionStringBuilder {
+    public SqlAuthenticationMethod Authentication { get; set; }
+    public SqlConnectionColumnEncryptionSetting ColumnEncryptionSetting { get; set; }
+  }
+  public sealed class SqlParameter : DbParameter, ICloneable, IDataParameter, IDbDataParameter {
+    public bool ForceColumnEncryption { get; set; }
+  }
+}
+namespace System.Diagnostics {
+  public sealed class Debugger {
+    public static bool IsAttached { [MethodImpl(InternalCall)]get; }
+  }
+  public class Process : Component {
+    public SafeProcessHandle SafeHandle { get; }
+  }
+  public sealed class ProcessStartInfo {
+    public IDictionary<string, string> Environment { get; }
+  }
+}
+namespace System.Diagnostics.Tracing {
+  public enum EventActivityOptions {
+    Detachable = 8,
+    Disable = 2,
+    None = 0,
+    Recursive = 4,
+  }
+  public sealed class EventAttribute : Attribute {
+    public EventActivityOptions ActivityOptions { get; set; }
+    public EventChannel Channel { get; set; }
+    public EventTags Tags { get; set; }
+  }
+  public enum EventChannel : byte {
+    Admin = (byte)16,
+    Analytic = (byte)18,
+    Debug = (byte)19,
+    None = (byte)0,
+    Operational = (byte)17,
+  }
+  public class EventDataAttribute : Attribute {
+    public EventDataAttribute();
+    public string Name { get; set; }
+  }
+  public class EventFieldAttribute : Attribute {
+    public EventFieldAttribute();
+    public EventFieldFormat Format { get; set; }
+    public EventFieldTags Tags { get; set; }
+  }
+  public enum EventFieldFormat {
+    Boolean = 3,
+    Default = 0,
+    Hexadecimal = 4,
+    HResult = 15,
+    Json = 12,
+    String = 2,
+    Xml = 11,
+  }
+  public enum EventFieldTags {
+    None = 0,
+  }
+  public class EventIgnoreAttribute : Attribute {
+    public EventIgnoreAttribute();
+  }
+  public enum EventKeywords : long {
+    All = (long)-1,
+    MicrosoftTelemetry = (long)562949953421312,
+  }
+  public enum EventManifestOptions {
+    AllCultures = 2,
+    AllowEventSourceOverride = 8,
+    None = 0,
+    OnlyIfNeededForRegistration = 4,
+    Strict = 1,
+  }
+  public class EventSource : IDisposable {
+    protected EventSource(EventSourceSettings settings);
+    protected EventSource(EventSourceSettings settings, params string[] traits);
+    public EventSource(string eventSourceName);
+    public EventSource(string eventSourceName, EventSourceSettings config);
+    public EventSource(string eventSourceName, EventSourceSettings config, params string[] traits);
+    public EventSourceSettings Settings { get; }
+    public static string GenerateManifest(Type eventSourceType, string assemblyPathToIncludeInManifest, EventManifestOptions flags);
+    public string GetTrait(string key);
+    public bool IsEnabled(EventLevel level, EventKeywords keywords, EventChannel channel);
+    public void Write(string eventName);
+    public void Write(string eventName, EventSourceOptions options);
+    public void Write<T>(string eventName, ref EventSourceOptions options, ref Guid activityId, ref Guid relatedActivityId, ref T data);
+    public void Write<T>(string eventName, ref EventSourceOptions options, ref T data);
+    public void Write<T>(string eventName, T data);
+    protected void WriteEvent(int eventId, byte[] arg1);
+    protected void WriteEvent(int eventId, int arg1, string arg2);
+    protected void WriteEvent(int eventId, long arg1, byte[] arg2);
+    protected void WriteEvent(int eventId, long arg1, string arg2);
+    protected void WriteEventWithRelatedActivityId(int eventId, Guid childActivityIDrelatedActivityId, params object[] args);
+    protected unsafe void WriteEventWithRelatedActivityIdCore(int eventId, Guid* childActivityIDrelatedActivityId, int eventDataCount, EventSource.EventData* data);
+  }
+  [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+  public struct EventSourceOptions {
+    public EventActivityOptions ActivityOptions { get; set; }
+    public EventKeywords Keywords { get; set; }
+    public EventLevel Level { get; set; }
+    public EventOpcode Opcode { get; set; }
+    public EventTags Tags { get; set; }
+  }
+  public enum EventSourceSettings {
+    Default = 0,
+    EtwManifestEventFormat = 4,
+    EtwSelfDescribingEventFormat = 8,
+    ThrowOnEventWriteErrors = 1,
+  }
+  public enum EventTags {
+    None = 0,
+  }
+  public class EventWrittenEventArgs : EventArgs {
+    public EventChannel Channel { get; }
+    public string EventName { get; }
+    public ReadOnlyCollection<string> PayloadNames { get; }
+    public EventTags Tags { get; }
+  }
+}
+namespace System.DirectoryServices.ActiveDirectory {
+  public class Domain : ActiveDirectoryPartition {
+    public int DomainModeLevel { get; }
+    public void RaiseDomainFunctionalityLevel(int domainMode);
+  }
+  public enum DomainMode {
+    Unknown = -1,
+  }
+  public class Forest : IDisposable {
+    public int ForestModeLevel { get; }
+    public void RaiseForestFunctionalityLevel(int forestMode);
+  }
+  public enum ForestMode {
+    Unknown = -1,
+  }
+}
+namespace System.Globalization {
+  public class CompareInfo : IDeserializationCallback {
+    public virtual int GetHashCode(string source, CompareOptions options);
+  }
+  public class CultureInfo : ICloneable, IFormatProvider {
+    public static CultureInfo CurrentCulture { get; set; }
+    public static CultureInfo CurrentUICulture { get; set; }
+  }
+}
+namespace System.IO {
+  public class MemoryStream : Stream {
+    public virtual bool TryGetBuffer(out ArraySegment<byte> buffer);
+  }
+}
+namespace System.IO.MemoryMappedFiles {
+  public class MemoryMappedFile : IDisposable {
+    public static MemoryMappedFile CreateFromFile(FileStream fileStream, string mapName, long capacity, MemoryMappedFileAccess access, HandleInheritability inheritability, bool leaveOpen);
+    public static MemoryMappedFile CreateNew(string mapName, long capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, HandleInheritability inheritability);
+    public static MemoryMappedFile CreateOrOpen(string mapName, long capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, HandleInheritability inheritability);
+  }
+}
+namespace System.IO.Pipes {
+  public sealed class NamedPipeClientStream : PipeStream {
+    public Task ConnectAsync();
+    public Task ConnectAsync(int timeout);
+    public Task ConnectAsync(int timeout, CancellationToken cancellationToken);
+    public Task ConnectAsync(CancellationToken cancellationToken);
+  }
+  public sealed class NamedPipeServerStream : PipeStream {
+    public Task WaitForConnectionAsync();
+    public Task WaitForConnectionAsync(CancellationToken cancellationToken);
+  }
+}
+namespace System.Linq.Expressions {
+  public class DynamicExpression : Expression, IArgumentProvider, IDynamicExpression {
+    int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; }
+    Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index);
+    object System.Linq.Expressions.IDynamicExpression.CreateCallSite();
+    Expression System.Linq.Expressions.IDynamicExpression.Rewrite(Expression[] args);
+  }
+  public sealed class ElementInit : IArgumentProvider {
+    int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; }
+    Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index);
+  }
+  public interface IArgumentProvider {
+    int ArgumentCount { get; }
+    Expression GetArgument(int index);
+  }
+  public interface IDynamicExpression : IArgumentProvider {
+    Type DelegateType { get; }
+    object CreateCallSite();
+    Expression Rewrite(Expression[] args);
+  }
+  public sealed class IndexExpression : Expression, IArgumentProvider {
+    int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; }
+    Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index);
+  }
+  public sealed class InvocationExpression : Expression, IArgumentProvider {
+    int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; }
+    Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index);
+  }
+  public class MethodCallExpression : Expression, IArgumentProvider {
+    int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; }
+    Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index);
+  }
+  public class NewExpression : Expression, IArgumentProvider {
+    int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; }
+    Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index);
+  }
+}
+namespace System.Net {
+  public class ServicePointManager {
+    public static bool ReusePort { get; set; }
+  }
+}
+namespace System.Net.Sockets {
+  public enum SocketOptionName {
+    ReuseUnicastPort = 12295,
+  }
+  public class TcpClient : IDisposable {
+    public void Dispose();
+    void System.IDisposable.Dispose();
+  }
+  public class UdpClient : IDisposable {
+    public void Dispose();
+    void System.IDisposable.Dispose();
+  }
+}
+namespace System.Numerics {
+  [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+  public struct Matrix3x2 : IEquatable<Matrix3x2> {
+    public float M11;
+    public float M12;
+    public float M21;
+    public float M22;
+    public float M31;
+    public float M32;
+    public Matrix3x2(float m11, float m12, float m21, float m22, float m31, float m32);
+    public static Matrix3x2 Identity { get; }
+    public bool IsIdentity { get; }
+    public Vector2 Translation { get; set; }
+    public static Matrix3x2 Add(Matrix3x2 value1, Matrix3x2 value2);
+    public static Matrix3x2 CreateRotation(float radians);
+    public static Matrix3x2 CreateRotation(float radians, Vector2 centerPoint);
+    public static Matrix3x2 CreateScale(Vector2 scales);
+    public static Matrix3x2 CreateScale(Vector2 scales, Vector2 centerPoint);
+    public static Matrix3x2 CreateScale(float scale);
+    public static Matrix3x2 CreateScale(float scale, Vector2 centerPoint);
+    public static Matrix3x2 CreateScale(float xScale, float yScale);
+    public static Matrix3x2 CreateScale(float xScale, float yScale, Vector2 centerPoint);
+    public static Matrix3x2 CreateSkew(float radiansX, float radiansY);
+    public static Matrix3x2 CreateSkew(float radiansX, float radiansY, Vector2 centerPoint);
+    public static Matrix3x2 CreateTranslation(Vector2 position);
+    public static Matrix3x2 CreateTranslation(float xPosition, float yPosition);
+    public bool Equals(Matrix3x2 other);
+    public override bool Equals(object obj);
+    public float GetDeterminant();
+    public override int GetHashCode();
+    public static bool Invert(Matrix3x2 matrix, out Matrix3x2 result);
+    public static Matrix3x2 Lerp(Matrix3x2 matrix1, Matrix3x2 matrix2, float amount);
+    public static Matrix3x2 Multiply(Matrix3x2 value1, Matrix3x2 value2);
+    public static Matrix3x2 Multiply(Matrix3x2 value1, float value2);
+    public static Matrix3x2 Negate(Matrix3x2 value);
+    public static Matrix3x2 operator +(Matrix3x2 value1, Matrix3x2 value2);
+    public static bool operator ==(Matrix3x2 value1, Matrix3x2 value2);
+    public static bool operator !=(Matrix3x2 value1, Matrix3x2 value2);
+    public static Matrix3x2 operator *(Matrix3x2 value1, Matrix3x2 value2);
+    public static Matrix3x2 operator *(Matrix3x2 value1, float value2);
+    public static Matrix3x2 operator -(Matrix3x2 value1, Matrix3x2 value2);
+    public static Matrix3x2 operator -(Matrix3x2 value);
+    public static Matrix3x2 Subtract(Matrix3x2 value1, Matrix3x2 value2);
+    public override string ToString();
+  }
+  [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+  public struct Matrix4x4 : IEquatable<Matrix4x4> {
+    public float M11;
+    public float M12;
+    public float M13;
+    public float M14;
+    public float M21;
+    public float M22;
+    public float M23;
+    public float M24;
+    public float M31;
+    public float M32;
+    public float M33;
+    public float M34;
+    public float M41;
+    public float M42;
+    public float M43;
+    public float M44;
+    public Matrix4x4(Matrix3x2 value);
+    public Matrix4x4(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44);
+    public static Matrix4x4 Identity { get; }
+    public bool IsIdentity { get; }
+    public Vector3 Translation { get; set; }
+    public static Matrix4x4 Add(Matrix4x4 value1, Matrix4x4 value2);
+    public static Matrix4x4 CreateBillboard(Vector3 objectPosition, Vector3 cameraPosition, Vector3 cameraUpVector, Vector3 cameraForwardVector);
+    public static Matrix4x4 CreateConstrainedBillboard(Vector3 objectPosition, Vector3 cameraPosition, Vector3 rotateAxis, Vector3 cameraForwardVector, Vector3 objectForwardVector);
+    public static Matrix4x4 CreateFromAxisAngle(Vector3 axis, float angle);
+    public static Matrix4x4 CreateFromQuaternion(Quaternion quaternion);
+    public static Matrix4x4 CreateFromYawPitchRoll(float yaw, float pitch, float roll);
+    public static Matrix4x4 CreateLookAt(Vector3 cameraPosition, Vector3 cameraTarget, Vector3 cameraUpVector);
+    public static Matrix4x4 CreateOrthographic(float width, float height, float zNearPlane, float zFarPlane);
+    public static Matrix4x4 CreateOrthographicOffCenter(float left, float right, float bottom, float top, float zNearPlane, float zFarPlane);
+    public static Matrix4x4 CreatePerspective(float width, float height, float nearPlaneDistance, float farPlaneDistance);
+    public static Matrix4x4 CreatePerspectiveFieldOfView(float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance);
+    public static Matrix4x4 CreatePerspectiveOffCenter(float left, float right, float bottom, float top, float nearPlaneDistance, float farPlaneDistance);
+    public static Matrix4x4 CreateReflection(Plane value);
+    public static Matrix4x4 CreateRotationX(float radians);
+    public static Matrix4x4 CreateRotationX(float radians, Vector3 centerPoint);
+    public static Matrix4x4 CreateRotationY(float radians);
+    public static Matrix4x4 CreateRotationY(float radians, Vector3 centerPoint);
+    public static Matrix4x4 CreateRotationZ(float radians);
+    public static Matrix4x4 CreateRotationZ(float radians, Vector3 centerPoint);
+    public static Matrix4x4 CreateScale(Vector3 scales);
+    public static Matrix4x4 CreateScale(Vector3 scales, Vector3 centerPoint);
+    public static Matrix4x4 CreateScale(float scale);
+    public static Matrix4x4 CreateScale(float scale, Vector3 centerPoint);
+    public static Matrix4x4 CreateScale(float xScale, float yScale, float zScale);
+    public static Matrix4x4 CreateScale(float xScale, float yScale, float zScale, Vector3 centerPoint);
+    public static Matrix4x4 CreateShadow(Vector3 lightDirection, Plane plane);
+    public static Matrix4x4 CreateTranslation(Vector3 position);
+    public static Matrix4x4 CreateTranslation(float xPosition, float yPosition, float zPosition);
+    public static Matrix4x4 CreateWorld(Vector3 position, Vector3 forward, Vector3 up);
+    public static bool Decompose(Matrix4x4 matrix, out Vector3 scale, out Quaternion rotation, out Vector3 translation);
+    public bool Equals(Matrix4x4 other);
+    public override bool Equals(object obj);
+    public float GetDeterminant();
+    public override int GetHashCode();
+    public static bool Invert(Matrix4x4 matrix, out Matrix4x4 result);
+    public static Matrix4x4 Lerp(Matrix4x4 matrix1, Matrix4x4 matrix2, float amount);
+    public static Matrix4x4 Multiply(Matrix4x4 value1, Matrix4x4 value2);
+    public static Matrix4x4 Multiply(Matrix4x4 value1, float value2);
+    public static Matrix4x4 Negate(Matrix4x4 value);
+    public static Matrix4x4 operator +(Matrix4x4 value1, Matrix4x4 value2);
+    public static bool operator ==(Matrix4x4 value1, Matrix4x4 value2);
+    public static bool operator !=(Matrix4x4 value1, Matrix4x4 value2);
+    public static Matrix4x4 operator *(Matrix4x4 value1, Matrix4x4 value2);
+    public static Matrix4x4 operator *(Matrix4x4 value1, float value2);
+    public static Matrix4x4 operator -(Matrix4x4 value1, Matrix4x4 value2);
+    public static Matrix4x4 operator -(Matrix4x4 value);
+    public static Matrix4x4 Subtract(Matrix4x4 value1, Matrix4x4 value2);
+    public override string ToString();
+    public static Matrix4x4 Transform(Matrix4x4 value, Quaternion rotation);
+    public static Matrix4x4 Transpose(Matrix4x4 matrix);
+  }
+  [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+  public struct Plane : IEquatable<Plane> {
+    public Vector3 Normal;
+    public float D;
+    public Plane(Vector3 normal, float d);
+    public Plane(Vector4 value);
+    public Plane(float x, float y, float z, float d);
+    [MethodImpl(AggressiveInlining)]public static Plane CreateFromVertices(Vector3 point1, Vector3 point2, Vector3 point3);
+    [MethodImpl(AggressiveInlining)]public static float Dot(Plane plane, Vector4 value);
+    [MethodImpl(AggressiveInlining)]public static float DotCoordinate(Plane plane, Vector3 value);
+    [MethodImpl(AggressiveInlining)]public static float DotNormal(Plane plane, Vector3 value);
+    [MethodImpl(AggressiveInlining)]public bool Equals(Plane other);
+    [MethodImpl(AggressiveInlining)]public override bool Equals(object obj);
+    public override int GetHashCode();
+    [MethodImpl(AggressiveInlining)]public static Plane Normalize(Plane value);
+    [MethodImpl(AggressiveInlining)]public static bool operator ==(Plane value1, Plane value2);
+    [MethodImpl(AggressiveInlining)]public static bool operator !=(Plane value1, Plane value2);
+    public override string ToString();
+    [MethodImpl(AggressiveInlining)]public static Plane Transform(Plane plane, Matrix4x4 matrix);
+    [MethodImpl(AggressiveInlining)]public static Plane Transform(Plane plane, Quaternion rotation);
+  }
+  [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+  public struct Quaternion : IEquatable<Quaternion> {
+    public float W;
+    public float X;
+    public float Y;
+    public float Z;
+    public Quaternion(Vector3 vectorPart, float scalarPart);
+    public Quaternion(float x, float y, float z, float w);
+    public static Quaternion Identity { get; }
+    public bool IsIdentity { get; }
+    public static Quaternion Add(Quaternion value1, Quaternion value2);
+    public static Quaternion Concatenate(Quaternion value1, Quaternion value2);
+    public static Quaternion Conjugate(Quaternion value);
+    public static Quaternion CreateFromAxisAngle(Vector3 axis, float angle);
+    public static Quaternion CreateFromRotationMatrix(Matrix4x4 matrix);
+    public static Quaternion CreateFromYawPitchRoll(float yaw, float pitch, float roll);
+    public static Quaternion Divide(Quaternion value1, Quaternion value2);
+    public static float Dot(Quaternion quaternion1, Quaternion quaternion2);
+    public bool Equals(Quaternion other);
+    public override bool Equals(object obj);
+    public override int GetHashCode();
+    public static Quaternion Inverse(Quaternion value);
+    public float Length();
+    public float LengthSquared();
+    public static Quaternion Lerp(Quaternion quaternion1, Quaternion quaternion2, float amount);
+    public static Quaternion Multiply(Quaternion value1, Quaternion value2);
+    public static Quaternion Multiply(Quaternion value1, float value2);
+    public static Quaternion Negate(Quaternion value);
+    public static Quaternion Normalize(Quaternion value);
+    public static Quaternion operator +(Quaternion value1, Quaternion value2);
+    public static Quaternion operator /(Quaternion value1, Quaternion value2);
+    public static bool operator ==(Quaternion value1, Quaternion value2);
+    public static bool operator !=(Quaternion value1, Quaternion value2);
+    public static Quaternion operator *(Quaternion value1, Quaternion value2);
+    public static Quaternion operator *(Quaternion value1, float value2);
+    public static Quaternion operator -(Quaternion value1, Quaternion value2);
+    public static Quaternion operator -(Quaternion value);
+    public static Quaternion Slerp(Quaternion quaternion1, Quaternion quaternion2, float amount);
+    public static Quaternion Subtract(Quaternion value1, Quaternion value2);
+    public override string ToString();
+  }
+  [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+  public struct Vector2 : IEquatable<Vector2>, IFormattable {
+    public float X;
+    public float Y;
+    public Vector2(float value);
+    public Vector2(float x, float y);
+    public static Vector2 One { get; }
+    public static Vector2 UnitX { get; }
+    public static Vector2 UnitY { get; }
+    public static Vector2 Zero { get; }
+    [MethodImpl(AggressiveInlining)]public static Vector2 Abs(Vector2 value);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Add(Vector2 left, Vector2 right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Clamp(Vector2 value1, Vector2 min, Vector2 max);
+    [MethodImpl(AggressiveInlining)]public void CopyTo(float[] array);
+    public void CopyTo(float[] array, int index);
+    [MethodImpl(AggressiveInlining)]public static float Distance(Vector2 value1, Vector2 value2);
+    [MethodImpl(AggressiveInlining)]public static float DistanceSquared(Vector2 value1, Vector2 value2);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Divide(Vector2 left, Vector2 right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Divide(Vector2 left, float divisor);
+    [MethodImpl(AggressiveInlining)]public static float Dot(Vector2 value1, Vector2 value2);
+    public bool Equals(Vector2 other);
+    [MethodImpl(AggressiveInlining)]public override bool Equals(object obj);
+    public override int GetHashCode();
+    [MethodImpl(AggressiveInlining)]public float Length();
+    [MethodImpl(AggressiveInlining)]public float LengthSquared();
+    [MethodImpl(AggressiveInlining)]public static Vector2 Lerp(Vector2 value1, Vector2 value2, float amount);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Max(Vector2 value1, Vector2 value2);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Min(Vector2 value1, Vector2 value2);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Multiply(Vector2 left, Vector2 right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Multiply(Vector2 left, float right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Multiply(float left, Vector2 right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Negate(Vector2 value);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Normalize(Vector2 value);
+    [MethodImpl(AggressiveInlining)]public static Vector2 operator +(Vector2 left, Vector2 right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 operator /(Vector2 left, Vector2 right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 operator /(Vector2 value1, float value2);
+    [MethodImpl(AggressiveInlining)]public static bool operator ==(Vector2 left, Vector2 right);
+    [MethodImpl(AggressiveInlining)]public static bool operator !=(Vector2 left, Vector2 right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 operator *(Vector2 left, Vector2 right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 operator *(Vector2 left, float right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 operator *(float left, Vector2 right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 operator -(Vector2 left, Vector2 right);
+    [MethodImpl(AggressiveInlining)]public static Vector2 operator -(Vector2 value);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Reflect(Vector2 vector, Vector2 normal);
+    [MethodImpl(AggressiveInlining)]public static Vector2 SquareRoot(Vector2 value);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Subtract(Vector2 left, Vector2 right);
+    public override string ToString();
+    public string ToString(string format);
+    public string ToString(string format, IFormatProvider formatProvider);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Transform(Vector2 position, Matrix3x2 matrix);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Transform(Vector2 position, Matrix4x4 matrix);
+    [MethodImpl(AggressiveInlining)]public static Vector2 Transform(Vector2 value, Quaternion rotation);
+    [MethodImpl(AggressiveInlining)]public static Vector2 TransformNormal(Vector2 normal, Matrix3x2 matrix);
+    [MethodImpl(AggressiveInlining)]public static Vector2 TransformNormal(Vector2 normal, Matrix4x4 matrix);
+  }
+  [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+  public struct Vector3 : IEquatable<Vector3>, IFormattable {
+    public float X;
+    public float Y;
+    public float Z;
+    public Vector3(Vector2 value, float z);
+    public Vector3(float value);
+    public Vector3(float x, float y, float z);
+    public static Vector3 One { get; }
+    public static Vector3 UnitX { get; }
+    public static Vector3 UnitY { get; }
+    public static Vector3 UnitZ { get; }
+    public static Vector3 Zero { get; }
+    [MethodImpl(AggressiveInlining)]public static Vector3 Abs(Vector3 value);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Add(Vector3 left, Vector3 right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Clamp(Vector3 value1, Vector3 min, Vector3 max);
+    [MethodImpl(AggressiveInlining)]public void CopyTo(float[] array);
+    [MethodImpl(AggressiveInlining)]public void CopyTo(float[] array, int index);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Cross(Vector3 vector1, Vector3 vector2);
+    [MethodImpl(AggressiveInlining)]public static float Distance(Vector3 value1, Vector3 value2);
+    [MethodImpl(AggressiveInlining)]public static float DistanceSquared(Vector3 value1, Vector3 value2);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Divide(Vector3 left, Vector3 right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Divide(Vector3 left, float divisor);
+    [MethodImpl(AggressiveInlining)]public static float Dot(Vector3 vector1, Vector3 vector2);
+    public bool Equals(Vector3 other);
+    [MethodImpl(AggressiveInlining)]public override bool Equals(object obj);
+    public override int GetHashCode();
+    [MethodImpl(AggressiveInlining)]public float Length();
+    [MethodImpl(AggressiveInlining)]public float LengthSquared();
+    [MethodImpl(AggressiveInlining)]public static Vector3 Lerp(Vector3 value1, Vector3 value2, float amount);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Max(Vector3 value1, Vector3 value2);
+    public static Vector3 Min(Vector3 value1, Vector3 value2);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Multiply(Vector3 left, Vector3 right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Multiply(Vector3 left, float right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Multiply(float left, Vector3 right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Negate(Vector3 value);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Normalize(Vector3 value);
+    [MethodImpl(AggressiveInlining)]public static Vector3 operator +(Vector3 left, Vector3 right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 operator /(Vector3 left, Vector3 right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 operator /(Vector3 value1, float value2);
+    [MethodImpl(AggressiveInlining)]public static bool operator ==(Vector3 left, Vector3 right);
+    [MethodImpl(AggressiveInlining)]public static bool operator !=(Vector3 left, Vector3 right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 operator *(Vector3 left, Vector3 right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 operator *(Vector3 left, float right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 operator *(float left, Vector3 right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 operator -(Vector3 left, Vector3 right);
+    [MethodImpl(AggressiveInlining)]public static Vector3 operator -(Vector3 value);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Reflect(Vector3 vector, Vector3 normal);
+    [MethodImpl(AggressiveInlining)]public static Vector3 SquareRoot(Vector3 value);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Subtract(Vector3 left, Vector3 right);
+    public override string ToString();
+    public string ToString(string format);
+    public string ToString(string format, IFormatProvider formatProvider);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Transform(Vector3 position, Matrix4x4 matrix);
+    [MethodImpl(AggressiveInlining)]public static Vector3 Transform(Vector3 value, Quaternion rotation);
+    [MethodImpl(AggressiveInlining)]public static Vector3 TransformNormal(Vector3 normal, Matrix4x4 matrix);
+  }
+  [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+  public struct Vector4 : IEquatable<Vector4>, IFormattable {
+    public float W;
+    public float X;
+    public float Y;
+    public float Z;
+    public Vector4(Vector2 value, float z, float w);
+    public Vector4(Vector3 value, float w);
+    public Vector4(float value);
+    public Vector4(float x, float y, float z, float w);
+    public static Vector4 One { get; }
+    public static Vector4 UnitW { get; }
+    public static Vector4 UnitX { get; }
+    public static Vector4 UnitY { get; }
+    public static Vector4 UnitZ { get; }
+    public static Vector4 Zero { get; }
+    [MethodImpl(AggressiveInlining)]public static Vector4 Abs(Vector4 value);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Add(Vector4 left, Vector4 right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Clamp(Vector4 value1, Vector4 min, Vector4 max);
+    [MethodImpl(AggressiveInlining)]public void CopyTo(float[] array);
+    [MethodImpl(AggressiveInlining)]public void CopyTo(float[] array, int index);
+    [MethodImpl(AggressiveInlining)]public static float Distance(Vector4 value1, Vector4 value2);
+    [MethodImpl(AggressiveInlining)]public static float DistanceSquared(Vector4 value1, Vector4 value2);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Divide(Vector4 left, Vector4 right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Divide(Vector4 left, float divisor);
+    [MethodImpl(AggressiveInlining)]public static float Dot(Vector4 vector1, Vector4 vector2);
+    public bool Equals(Vector4 other);
+    [MethodImpl(AggressiveInlining)]public override bool Equals(object obj);
+    public override int GetHashCode();
+    [MethodImpl(AggressiveInlining)]public float Length();
+    [MethodImpl(AggressiveInlining)]public float LengthSquared();
+    [MethodImpl(AggressiveInlining)]public static Vector4 Lerp(Vector4 value1, Vector4 value2, float amount);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Max(Vector4 value1, Vector4 value2);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Min(Vector4 value1, Vector4 value2);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Multiply(Vector4 left, Vector4 right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Multiply(Vector4 left, float right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Multiply(float left, Vector4 right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Negate(Vector4 value);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Normalize(Vector4 vector);
+    [MethodImpl(AggressiveInlining)]public static Vector4 operator +(Vector4 left, Vector4 right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 operator /(Vector4 left, Vector4 right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 operator /(Vector4 value1, float value2);
+    [MethodImpl(AggressiveInlining)]public static bool operator ==(Vector4 left, Vector4 right);
+    [MethodImpl(AggressiveInlining)]public static bool operator !=(Vector4 left, Vector4 right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 operator *(Vector4 left, Vector4 right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 operator *(Vector4 left, float right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 operator *(float left, Vector4 right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 operator -(Vector4 left, Vector4 right);
+    [MethodImpl(AggressiveInlining)]public static Vector4 operator -(Vector4 value);
+    [MethodImpl(AggressiveInlining)]public static Vector4 SquareRoot(Vector4 value);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Subtract(Vector4 left, Vector4 right);
+    public override string ToString();
+    public string ToString(string format);
+    public string ToString(string format, IFormatProvider formatProvider);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector2 position, Matrix4x4 matrix);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector2 value, Quaternion rotation);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector3 position, Matrix4x4 matrix);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector3 value, Quaternion rotation);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector4 vector, Matrix4x4 matrix);
+    [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector4 value, Quaternion rotation);
+  }
+}
+namespace System.Reflection {
+  public sealed class AssemblyName : _AssemblyName, ICloneable, IDeserializationCallback, ISerializable {
+    public string CultureName { get; set; }
+  }
+}
+namespace System.Runtime {
+  public enum GCLatencyMode {
+    NoGCRegion = 4,
+  }
+}
+namespace System.Runtime.CompilerServices {
+  public sealed class DisablePrivateReflectionAttribute : Attribute {
+    public DisablePrivateReflectionAttribute();
+  }
+  public static class FormattableStringFactory {
+    public static FormattableString Create(string format, params object[] arguments);
+  }
+}
+namespace System.Runtime.InteropServices {
+  public static class Marshal {
+    [MethodImpl(InternalCall)]public static IntPtr CreateAggregatedObject(IntPtr pOuter, object o);
+    [MethodImpl(InternalCall)]public static void DestroyStructure(IntPtr ptr, Type structuretype);
+    [MethodImpl(InternalCall)]public static int GetExceptionCode();
+    [MethodImpl(InternalCall)]public static void GetNativeVariantForObject(object obj, IntPtr pDstNativeVariant);
+    [MethodImpl(InternalCall)]public static object GetObjectForIUnknown(IntPtr pUnk);
+    [MethodImpl(InternalCall)]public static object GetObjectForNativeVariant(IntPtr pSrcNativeVariant);
+    [MethodImpl(InternalCall)]public static object[] GetObjectsForNativeVariants(IntPtr aSrcNativeVariant, int cVars);
+    [MethodImpl(InternalCall)]public static int GetStartComSlot(Type t);
+    [MethodImpl(InternalCall)]public static object GetUniqueObjectForIUnknown(IntPtr unknown);
+    [MethodImpl(InternalCall)]public static void StructureToPtr(object structure, IntPtr ptr, bool fDeleteOld);
+    [MethodImpl(InternalCall)]public static IntPtr UnsafeAddrOfPinnedArrayElement(Array arr, int index);
+  }
+}
+namespace System.Runtime.Serialization {
+  public sealed class CollectionDataContractAttribute : Attribute {
+    public bool IsItemNameSetExplicitly { get; }
+    public bool IsKeyNameSetExplicitly { get; }
+    public bool IsNameSetExplicitly { get; }
+    public bool IsNamespaceSetExplicitly { get; }
+    public bool IsReferenceSetExplicitly { get; }
+    public bool IsValueNameSetExplicitly { get; }
+  }
+  public sealed class DataContractAttribute : Attribute {
+    public bool IsNameSetExplicitly { get; }
+    public bool IsNamespaceSetExplicitly { get; }
+    public bool IsReferenceSetExplicitly { get; }
+  }
+  public sealed class DataMemberAttribute : Attribute {
+    public bool IsNameSetExplicitly { get; }
+  }
+  public sealed class EnumMemberAttribute : Attribute {
+    public bool IsValueSetExplicitly { get; }
+  }
+}
+namespace System.Security.AccessControl {
+  public sealed class AuthorizationRuleCollection : ReadOnlyCollectionBase {
+    public AuthorizationRuleCollection();
+    public void AddRule(AuthorizationRule rule);
+  }
+  public sealed class CommonSecurityDescriptor : GenericSecurityDescriptor {
+    public void AddDiscretionaryAcl(byte revision, int trusted);
+    public void AddSystemAcl(byte revision, int trusted);
+  }
+  public sealed class DiscretionaryAcl : CommonAcl {
+    public void AddAccess(AccessControlType accessType, SecurityIdentifier sid, ObjectAccessRule rule);
+    public bool RemoveAccess(AccessControlType accessType, SecurityIdentifier sid, ObjectAccessRule rule);
+    public void RemoveAccessSpecific(AccessControlType accessType, SecurityIdentifier sid, ObjectAccessRule rule);
+    public void SetAccess(AccessControlType accessType, SecurityIdentifier sid, ObjectAccessRule rule);
+  }
+  public abstract class ObjectSecurity {
+    protected ObjectSecurity();
+    protected ObjectSecurity(CommonSecurityDescriptor securityDescriptor);
+  }
+  public sealed class SystemAcl : CommonAcl {
+    public void AddAudit(SecurityIdentifier sid, ObjectAuditRule rule);
+    public bool RemoveAudit(SecurityIdentifier sid, ObjectAuditRule rule);
+    public void RemoveAuditSpecific(SecurityIdentifier sid, ObjectAuditRule rule);
+    public void SetAudit(SecurityIdentifier sid, ObjectAuditRule rule);
+  }
+}
+namespace System.Security.Claims {
+  public class Claim {
+    public Claim(BinaryReader reader);
+    public Claim(BinaryReader reader, ClaimsIdentity subject);
+    protected Claim(Claim other);
+    protected Claim(Claim other, ClaimsIdentity subject);
+    protected virtual byte[] CustomSerializationData { get; }
+    public virtual void WriteTo(BinaryWriter writer);
+    protected virtual void WriteTo(BinaryWriter writer, byte[] userData);
+  }
+  public class ClaimsIdentity : IIdentity {
+    public ClaimsIdentity(BinaryReader reader);
+    protected ClaimsIdentity(ClaimsIdentity other);
+    protected virtual byte[] CustomSerializationData { get; }
+    protected virtual Claim CreateClaim(BinaryReader reader);
+    public virtual void WriteTo(BinaryWriter writer);
+    protected virtual void WriteTo(BinaryWriter writer, byte[] userData);
+  }
+  public class ClaimsPrincipal : IPrincipal {
+    public ClaimsPrincipal(BinaryReader reader);
+    protected virtual byte[] CustomSerializationData { get; }
+    public virtual ClaimsPrincipal Clone();
+    protected virtual ClaimsIdentity CreateClaimsIdentity(BinaryReader reader);
+    public virtual void WriteTo(BinaryWriter writer);
+    protected virtual void WriteTo(BinaryWriter writer, byte[] userData);
+  }
+}
+namespace System.Security.Cryptography {
+  public abstract class AsymmetricAlgorithm : IDisposable {
+    public abstractvirtual string KeyExchangeAlgorithm { get; }
+    public abstractvirtual string SignatureAlgorithm { get; }
+    public abstractvirtual void FromXmlString(string xmlString);
+    public abstractvirtual string ToXmlString(bool includePrivateParameters);
+  }
+  public sealed class CngAlgorithm : IEquatable<CngAlgorithm> {
+    public static CngAlgorithm Rsa { get; }
+  }
+  [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+  public struct HashAlgorithmName : IEquatable<HashAlgorithmName> {
+    public HashAlgorithmName(string name);
+    public static HashAlgorithmName MD5 { get; }
+    public string Name { get; }
+    public static HashAlgorithmName SHA1 { get; }
+    public static HashAlgorithmName SHA256 { get; }
+    public static HashAlgorithmName SHA384 { get; }
+    public static HashAlgorithmName SHA512 { get; }
+    public override bool Equals(object obj);
+    public bool Equals(HashAlgorithmName other);
+    public override int GetHashCode();
+    public static bool operator ==(HashAlgorithmName left, HashAlgorithmName right);
+    public static bool operator !=(HashAlgorithmName left, HashAlgorithmName right);
+    public override string ToString();
+  }
+  public abstract class RandomNumberGenerator : IDisposable {
+    public virtual void GetBytes(byte[] data, int offset, int count);
+  }
+  public class Rfc2898DeriveBytes : DeriveBytes {
+    public byte[] CryptDeriveKey(string algname, string alghashname, int keySize, byte[] rgbIV);
+  }
+  public abstract class RSA : AsymmetricAlgorithm {
+    public override string KeyExchangeAlgorithm { get; }
+    public override string SignatureAlgorithm { get; }
+    public virtual byte[] Decrypt(byte[] data, RSAEncryptionPadding padding);
+    public abstractvirtual byte[] DecryptValue(byte[] rgb);
+    public virtual byte[] Encrypt(byte[] data, RSAEncryptionPadding padding);
+    public abstractvirtual byte[] EncryptValue(byte[] rgb);
+    protected virtual byte[] HashData(byte[] data, int offset, int count, HashAlgorithmName hashAlgorithm);
+    protected virtual byte[] HashData(Stream data, HashAlgorithmName hashAlgorithm);
+    public virtual byte[] SignData(byte[] data, int offset, int count, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+    public byte[] SignData(byte[] data, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+    public virtual byte[] SignData(Stream data, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+    public virtual byte[] SignHash(byte[] hash, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+    public bool VerifyData(byte[] data, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+    public virtual bool VerifyData(byte[] data, int offset, int count, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+    public bool VerifyData(Stream data, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+    public virtual bool VerifyHash(byte[] hash, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+  }
+  public sealed class RSACng : RSA {
+    public RSACng();
+    public RSACng(int keySize);
+    public RSACng(CngKey key);
+    public CngKey Key { get; }
+    public override byte[] Decrypt(byte[] data, RSAEncryptionPadding padding);
+    protected override void Dispose(bool disposing);
+    public override byte[] Encrypt(byte[] data, RSAEncryptionPadding padding);
+    public override RSAParameters ExportParameters(bool includePrivateParameters);
+    protected override byte[] HashData(byte[] data, int offset, int count, HashAlgorithmName hashAlgorithm);
+    protected override byte[] HashData(Stream data, HashAlgorithmName hashAlgorithm);
+    public override void ImportParameters(RSAParameters parameters);
+    public override byte[] SignHash(byte[] hash, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+    public override bool VerifyHash(byte[] hash, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+  }
+  public sealed class RSACryptoServiceProvider : RSA, ICspAsymmetricAlgorithm {
+    public override byte[] Decrypt(byte[] data, RSAEncryptionPadding padding);
+    public override byte[] Encrypt(byte[] data, RSAEncryptionPadding padding);
+    protected override byte[] HashData(byte[] data, int offset, int count, HashAlgorithmName hashAlgorithm);
+    protected override byte[] HashData(Stream data, HashAlgorithmName hashAlgorithm);
+    public override byte[] SignHash(byte[] hash, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+    public override bool VerifyHash(byte[] hash, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding);
+  }
+  public sealed class RSAEncryptionPadding : IEquatable<RSAEncryptionPadding> {
+    public RSAEncryptionPaddingMode Mode { get; }
+    public HashAlgorithmName OaepHashAlgorithm { get; }
+    public static RSAEncryptionPadding OaepSHA1 { get; }
+    public static RSAEncryptionPadding OaepSHA256 { get; }
+    public static RSAEncryptionPadding OaepSHA384 { get; }
+    public static RSAEncryptionPadding OaepSHA512 { get; }
+    public static RSAEncryptionPadding Pkcs1 { get; }
+    public static RSAEncryptionPadding CreateOaep(HashAlgorithmName hashAlgorithm);
+    public override bool Equals(object obj);
+    public bool Equals(RSAEncryptionPadding other);
+    public override int GetHashCode();
+    public static bool operator ==(RSAEncryptionPadding left, RSAEncryptionPadding right);
+    public static bool operator !=(RSAEncryptionPadding left, RSAEncryptionPadding right);
+    public override string ToString();
+  }
+  public enum RSAEncryptionPaddingMode {
+    Oaep = 1,
+    Pkcs1 = 0,
+  }
+  public sealed class RSASignaturePadding : IEquatable<RSASignaturePadding> {
+    public RSASignaturePaddingMode Mode { get; }
+    public static RSASignaturePadding Pkcs1 { get; }
+    public static RSASignaturePadding Pss { get; }
+    public override bool Equals(object obj);
+    public bool Equals(RSASignaturePadding other);
+    public override int GetHashCode();
+    public static bool operator ==(RSASignaturePadding left, RSASignaturePadding right);
+    public static bool operator !=(RSASignaturePadding left, RSASignaturePadding right);
+    public override string ToString();
+  }
+  public enum RSASignaturePaddingMode {
+    Pkcs1 = 0,
+    Pss = 1,
+  }
+}
+namespace System.Security.Cryptography.X509Certificates {
+  public static class RSACertificateExtensions {
+    public static RSA GetRSAPrivateKey(this X509Certificate2 certificate);
+    public static RSA GetRSAPublicKey(this X509Certificate2 certificate);
+  }
+  public class X509Certificate : IDeserializationCallback, IDisposable, ISerializable {
+    public void Dispose();
+    protected virtual void Dispose(bool disposing);
+  }
+  public class X509Chain : IDisposable {
+    public SafeX509ChainHandle SafeHandle { get; }
+    public void Dispose();
+    protected virtual void Dispose(bool disposing);
+  }
+  public sealed class X509Store : IDisposable {
+    public void Dispose();
+  }
+}
+namespace System.Security.Cryptography.Xml {
+  public class EncryptedXml {
+    public int XmlDSigSearchDepth { get; set; }
+  }
+}
+namespace System.Security.Principal {
+  public class WindowsIdentity : ClaimsIdentity, IDeserializationCallback, IDisposable, ISerializable {
+    public SafeAccessTokenHandle AccessToken { get; }
+    public static void RunImpersonated(SafeAccessTokenHandle safeAccessTokenHandle, Action action);
+    public static T RunImpersonated<T>(SafeAccessTokenHandle safeAccessTokenHandle, Func<T> func);
+  }
+}
+namespace System.ServiceModel {
+  public sealed class TcpTransportSecurity {
+    public SslProtocols SslProtocols { get; set; }
+  }
+}
+namespace System.ServiceModel.Channels {
+  public class SslStreamSecurityBindingElement : StreamUpgradeBindingElement, IPolicyExportExtension, ITransportTokenAssertionProvider {
+    public SslProtocols SslProtocols { get; set; }
+  }
+}
+namespace System.ServiceModel.Configuration {
+  public sealed class SslStreamSecurityElement : BindingElementExtensionElement {
+    public SslProtocols SslProtocols { get; }
+  }
+  public sealed class TcpTransportSecurityElement : ServiceModelConfigurationElement {
+    public SslProtocols SslProtocols { get; }
+  }
+}
+namespace System.Text {
+  public abstract class Encoding : ICloneable {
+    protected Encoding(int codePage, EncoderFallback encoderFallback, DecoderFallback decoderFallback);
+    public unsafe string GetString(byte* bytes, int byteCount);
+    public static void RegisterProvider(EncodingProvider provider);
+  }
+  public abstract class EncodingProvider {
+    public EncodingProvider();
+    public abstract Encoding GetEncoding(int codepage);
+    public virtual Encoding GetEncoding(int codepage, EncoderFallback encoderFallback, DecoderFallback decoderFallback);
+    public abstract Encoding GetEncoding(string name);
+    public virtual Encoding GetEncoding(string name, EncoderFallback encoderFallback, DecoderFallback decoderFallback);
+  }
+  public sealed class StringBuilder : ISerializable {
+    public unsafe StringBuilder Append(char* value, int valueCount);
+    public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0);
+    public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0, object arg1);
+    public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0, object arg1, object arg2);
+  }
+}
+namespace System.Threading {
+  public sealed class AsyncLocal<T> {
+    public AsyncLocal();
+    public AsyncLocal(Action<AsyncLocalValueChangedArgs<T>> valueChangedHandler);
+    public T Value { get; set; }
+  }
+  [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+  public struct AsyncLocalValueChangedArgs<T> {
+    public T CurrentValue { get; }
+    public T PreviousValue { get; }
+    public bool ThreadContextChanged { get; }
+  }
+  public static class WaitHandleExtensions {
+    public static SafeWaitHandle GetSafeWaitHandle(this WaitHandle waitHandle);
+    public static void SetSafeWaitHandle(this WaitHandle waitHandle, SafeWaitHandle value);
+  }
+}
+namespace System.Threading.Tasks {
+  public class Task : IAsyncResult, IDisposable {
+    public static Task CompletedTask { get; }
+    public static Task FromCanceled(CancellationToken cancellationToken);
+    public static Task<TResult> FromCanceled<TResult>(CancellationToken cancellationToken);
+    public static Task FromException(Exception exception);
+    public static Task<TResult> FromException<TResult>(Exception exception);
+  }
+  public class TaskCompletionSource<TResult> {
+    public bool TrySetCanceled(CancellationToken cancellationToken);
+  }
+  public enum TaskContinuationOptions {
+    RunContinuationsAsynchronously = 64,
+  }
+  public enum TaskCreationOptions {
+    RunContinuationsAsynchronously = 64,
+  }
+}
+namespace System.Web {
+  public sealed class HttpRequest {
+    public ITlsTokenBindingInfo TlsTokenBindingInfo { get; }
+  }
+  public abstract class HttpRequestBase {
+    public virtual ITlsTokenBindingInfo TlsTokenBindingInfo { get; }
+  }
+  public class HttpRequestWrapper : HttpRequestBase {
+    public override ITlsTokenBindingInfo TlsTokenBindingInfo { get; }
+  }
+  public sealed class HttpResponse {
+    public Task FlushAsync();
+    public void PushPromise(string path);
+    public void PushPromise(string path, string method, NameValueCollection headers);
+  }
+  public abstract class HttpResponseBase {
+    public virtual Task FlushAsync();
+    public virtual void PushPromise(string path);
+    public virtual void PushPromise(string path, string method, NameValueCollection headers);
+  }
+  public class HttpResponseWrapper : HttpResponseBase {
+    public override Task FlushAsync();
+    public override void PushPromise(string path);
+    public override void PushPromise(string path, string method, NameValueCollection headers);
+  }
+  public interface ITlsTokenBindingInfo {
+    byte[] GetProvidedTokenBindingId();
+    byte[] GetReferredTokenBindingId();
+  }
+}
+namespace System.Web.UI.WebControls {
+  public class ModelDataSourceView : DataSourceView, IStateManager {
+    public override void Delete(IDictionary keys, IDictionary oldValues, DataSourceViewOperationCallback callback);
+    public override void Insert(IDictionary values, DataSourceViewOperationCallback callback);
+    public override void Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback);
+    public override void Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback);
+  }
+  public sealed class SelectResult {
+    public SelectResult(int totalRowCount, IEnumerable results);
+    public IEnumerable Results { get; }
+    public int TotalRowCount { get; }
+  }
+}
+namespace System.Windows {
+  public static class CoreCompatibilityPreferences {
+    public static Nullable<bool> EnableMultiMonitorDisplayClipping { get; set; }
+  }
+}
+namespace System.Windows.Diagnostics {
+  public static class VisualDiagnostics {
+    public static event EventHandler<VisualTreeChangeEventArgs> VisualTreeChanged;
+    public static XamlSourceInfo GetXamlSourceInfo(object obj);
+  }
+  public class VisualTreeChangeEventArgs : EventArgs {
+    public VisualTreeChangeEventArgs(DependencyObject parent, DependencyObject child, int childIndex, VisualTreeChangeType changeType);
+    public VisualTreeChangeType ChangeType { get; }
+    public DependencyObject Child { get; }
+    public int ChildIndex { get; }
+    public DependencyObject Parent { get; }
+  }
+  public enum VisualTreeChangeType {
+    Add = 0,
+    Remove = 1,
+  }
+  public class XamlSourceInfo {
+    public XamlSourceInfo(Uri sourceUri, int lineNumber, int linePosition);
+    public int LineNumber { get; }
+    public int LinePosition { get; }
+    public Uri SourceUri { get; }
+  }
+}
+namespace System.Windows.Forms {
+  public class MonthCalendar : Control {
+    protected override void DefWndProc(ref Message m);
+  }
+}
+namespace System.Windows.Input {
+  public sealed class Cursor : IDisposable {
+    public Cursor(Stream cursorStream, bool scaleWithDpi);
+    public Cursor(string cursorFile, bool scaleWithDpi);
+  }
+  public sealed class StylusDevice : InputDevice {
+    public bool IsValid { get; }
+  }
+}
+namespace System.Windows.Interop {
+  [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)]
+  public struct HwndSourceParameters {
+    public bool UsesPerPixelTransparency { get; set; }
+  }
+}
+namespace System.Xaml {
+  public class XamlObjectEventArgs : EventArgs {
+    public int ElementLineNumber { get; }
+    public int ElementLinePosition { get; }
+    public Uri SourceBamlUri { get; }
+  }
+}
+namespace System.Xml {
+  public class XmlCDataSection : XmlCharacterData {
+    public override XmlNode PreviousText { get; }
+  }
+  public abstract class XmlNode : ICloneable, IEnumerable, IXPathNavigable {
+    public virtual XmlNode PreviousText { get; }
+  }
+  public class XmlSignificantWhitespace : XmlCharacterData {
+    public override XmlNode PreviousText { get; }
+  }
+  public class XmlText : XmlCharacterData {
+    public override XmlNode PreviousText { get; }
+  }
+  public class XmlWhitespace : XmlCharacterData {
+    public override XmlNode PreviousText { get; }
+  }
+}
+
+ + diff --git a/releases/net46/dotnet46-api-changes.md b/releases/net46/dotnet46-api-changes.md new file mode 100644 index 000000000..a269e203f --- /dev/null +++ b/releases/net46/dotnet46-api-changes.md @@ -0,0 +1,1331 @@ +```diff + namespace System { ++ public static class AppContext { ++ public static string BaseDirectory { get; } ++ public static void SetSwitch(string switchName, bool isEnabled); ++ public static bool TryGetSwitch(string switchName, out bool isEnabled); ++ } + public abstract class Array : ICloneable, ICollection, IEnumerable, IList, IStructuralComparable, IStructuralEquatable { ++ public static T[] Empty(); + } + public static class Buffer { ++ [MethodImpl(AggressiveInlining)]public unsafe static void MemoryCopy(void* source, void* destination, long destinationSizeInBytes, long sourceBytesToCopy); ++ [MethodImpl(AggressiveInlining)]public unsafe static void MemoryCopy(void* source, void* destination, ulong destinationSizeInBytes, ulong sourceBytesToCopy); + } + public static class Console { +- public static int Read(); ++ [MethodImpl(NoInlining)]public static int Read(); +- public static string ReadLine(); ++ [MethodImpl(NoInlining)]public static string ReadLine(); +- public static void Write(bool value); ++ [MethodImpl(NoInlining)]public static void Write(bool value); +- public static void Write(char value); ++ [MethodImpl(NoInlining)]public static void Write(char value); +- public static void Write(char[] buffer); ++ [MethodImpl(NoInlining)]public static void Write(char[] buffer); +- public static void Write(char[] buffer, int index, int count); ++ [MethodImpl(NoInlining)]public static void Write(char[] buffer, int index, int count); +- public static void Write(decimal value); ++ [MethodImpl(NoInlining)]public static void Write(decimal value); +- public static void Write(double value); ++ [MethodImpl(NoInlining)]public static void Write(double value); +- public static void Write(int value); ++ [MethodImpl(NoInlining)]public static void Write(int value); +- public static void Write(long value); ++ [MethodImpl(NoInlining)]public static void Write(long value); +- public static void Write(object value); ++ [MethodImpl(NoInlining)]public static void Write(object value); +- public static void Write(float value); ++ [MethodImpl(NoInlining)]public static void Write(float value); +- public static void Write(string value); ++ [MethodImpl(NoInlining)]public static void Write(string value); +- public static void Write(string format, object arg0); ++ [MethodImpl(NoInlining)]public static void Write(string format, object arg0); +- public static void Write(string format, object arg0, object arg1); ++ [MethodImpl(NoInlining)]public static void Write(string format, object arg0, object arg1); +- public static void Write(string format, object arg0, object arg1, object arg2); ++ [MethodImpl(NoInlining)]public static void Write(string format, object arg0, object arg1, object arg2); +- public static void Write(string format, object arg0, object arg1, object arg2, object arg3, __arglist); ++ [MethodImpl(NoInlining)]public static void Write(string format, object arg0, object arg1, object arg2, object arg3, __arglist); +- public static void Write(string format, params object[] arg); ++ [MethodImpl(NoInlining)]public static void Write(string format, params object[] arg); +- public static void Write(uint value); ++ [MethodImpl(NoInlining)]public static void Write(uint value); +- public static void Write(ulong value); ++ [MethodImpl(NoInlining)]public static void Write(ulong value); +- public static void WriteLine(); ++ [MethodImpl(NoInlining)]public static void WriteLine(); +- public static void WriteLine(bool value); ++ [MethodImpl(NoInlining)]public static void WriteLine(bool value); +- public static void WriteLine(char value); ++ [MethodImpl(NoInlining)]public static void WriteLine(char value); +- public static void WriteLine(char[] buffer); ++ [MethodImpl(NoInlining)]public static void WriteLine(char[] buffer); +- public static void WriteLine(char[] buffer, int index, int count); ++ [MethodImpl(NoInlining)]public static void WriteLine(char[] buffer, int index, int count); +- public static void WriteLine(decimal value); ++ [MethodImpl(NoInlining)]public static void WriteLine(decimal value); +- public static void WriteLine(double value); ++ [MethodImpl(NoInlining)]public static void WriteLine(double value); +- public static void WriteLine(int value); ++ [MethodImpl(NoInlining)]public static void WriteLine(int value); +- public static void WriteLine(long value); ++ [MethodImpl(NoInlining)]public static void WriteLine(long value); +- public static void WriteLine(object value); ++ [MethodImpl(NoInlining)]public static void WriteLine(object value); +- public static void WriteLine(float value); ++ [MethodImpl(NoInlining)]public static void WriteLine(float value); +- public static void WriteLine(string value); ++ [MethodImpl(NoInlining)]public static void WriteLine(string value); +- public static void WriteLine(string format, object arg0); ++ [MethodImpl(NoInlining)]public static void WriteLine(string format, object arg0); +- public static void WriteLine(string format, object arg0, object arg1); ++ [MethodImpl(NoInlining)]public static void WriteLine(string format, object arg0, object arg1); +- public static void WriteLine(string format, object arg0, object arg1, object arg2); ++ [MethodImpl(NoInlining)]public static void WriteLine(string format, object arg0, object arg1, object arg2); +- public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3, __arglist); ++ [MethodImpl(NoInlining)]public static void WriteLine(string format, object arg0, object arg1, object arg2, object arg3, __arglist); +- public static void WriteLine(string format, params object[] arg); ++ [MethodImpl(NoInlining)]public static void WriteLine(string format, params object[] arg); +- public static void WriteLine(uint value); ++ [MethodImpl(NoInlining)]public static void WriteLine(uint value); +- public static void WriteLine(ulong value); ++ [MethodImpl(NoInlining)]public static void WriteLine(ulong value); + } + public struct DateTimeOffset : IComparable, IComparable, IDeserializationCallback, IEquatable, IFormattable, ISerializable { ++ public static DateTimeOffset FromUnixTimeMilliseconds(long milliseconds); ++ public static DateTimeOffset FromUnixTimeSeconds(long seconds); ++ public long ToUnixTimeMilliseconds(); ++ public long ToUnixTimeSeconds(); + } ++ public abstract class FormattableString : IFormattable { ++ protected FormattableString(); ++ public abstract int ArgumentCount { get; } ++ public abstract string Format { get; } ++ public abstract object GetArgument(int index); ++ public abstract object[] GetArguments(); ++ public static string Invariant(FormattableString formattable); ++ string System.IFormattable.ToString(string ignored, IFormatProvider formatProvider); ++ public override string ToString(); ++ public abstract string ToString(IFormatProvider formatProvider); ++ } + public static class GC { ++ public static void Collect(int generation, GCCollectionMode mode, bool blocking, bool compacting); ++ public static void EndNoGCRegion(); ++ public static bool TryStartNoGCRegion(long totalSize); ++ public static bool TryStartNoGCRegion(long totalSize, bool disallowFullBlockingGC); ++ public static bool TryStartNoGCRegion(long totalSize, long lohSize); ++ public static bool TryStartNoGCRegion(long totalSize, long lohSize, bool disallowFullBlockingGC); + } + public sealed class String : ICloneable, IComparable, IComparable, IConvertible, IEnumerable, IEnumerable, IEquatable { ++ public static string Format(IFormatProvider provider, string format, object arg0); ++ public static string Format(IFormatProvider provider, string format, object arg0, object arg1); ++ public static string Format(IFormatProvider provider, string format, object arg0, object arg1, object arg2); + } + public class Uri : ISerializable { ++ public string IdnHost { get; } + } + } + namespace System.Collections.Concurrent { +- public class BlockingCollection : ICollection, IDisposable, IEnumerable, IEnumerable { ++ public class BlockingCollection : ICollection, IDisposable, IEnumerable, IEnumerable, IReadOnlyCollection { + } +- public class ConcurrentBag : ICollection, IEnumerable, IEnumerable, IProducerConsumerCollection { ++ public class ConcurrentBag : ICollection, IEnumerable, IEnumerable, IProducerConsumerCollection, IReadOnlyCollection { + } +- public class ConcurrentDictionary : ICollection, ICollection>, IDictionary, IDictionary, IEnumerable, IEnumerable> { ++ public class ConcurrentDictionary : ICollection, ICollection>, IDictionary, IDictionary, IEnumerable, IEnumerable>, IReadOnlyCollection>, IReadOnlyDictionary { ++ IEnumerable System.Collections.Generic.IReadOnlyDictionary.Keys { get; } ++ IEnumerable System.Collections.Generic.IReadOnlyDictionary.Values { get; } + } +- public class ConcurrentQueue : ICollection, IEnumerable, IEnumerable, IProducerConsumerCollection { ++ public class ConcurrentQueue : ICollection, IEnumerable, IEnumerable, IProducerConsumerCollection, IReadOnlyCollection { + } +- public class ConcurrentStack : ICollection, IEnumerable, IEnumerable, IProducerConsumerCollection { ++ public class ConcurrentStack : ICollection, IEnumerable, IEnumerable, IProducerConsumerCollection, IReadOnlyCollection { + } + } + namespace System.Collections.Generic { + public class Dictionary : ICollection, ICollection>, IDeserializationCallback, IDictionary, IDictionary, IEnumerable, IEnumerable>, IReadOnlyCollection>, IReadOnlyDictionary, ISerializable { +- public sealed class KeyCollection : ICollection, ICollection, IEnumerable, IEnumerable { ++ public sealed class KeyCollection : ICollection, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection { + } +- public sealed class ValueCollection : ICollection, ICollection, IEnumerable, IEnumerable { ++ public sealed class ValueCollection : ICollection, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection { + } + } +- public class HashSet : ICollection, IDeserializationCallback, IEnumerable, IEnumerable, ISerializable, ISet { ++ public class HashSet : ICollection, IDeserializationCallback, IEnumerable, IEnumerable, IReadOnlyCollection, ISerializable, ISet { + } +- public class LinkedList : ICollection, ICollection, IDeserializationCallback, IEnumerable, IEnumerable, ISerializable { ++ public class LinkedList : ICollection, ICollection, IDeserializationCallback, IEnumerable, IEnumerable, IReadOnlyCollection, ISerializable { + } +- public class Queue : ICollection, IEnumerable, IEnumerable { ++ public class Queue : ICollection, IEnumerable, IEnumerable, IReadOnlyCollection { + } +- public class SortedDictionary : ICollection, ICollection>, IDictionary, IDictionary, IEnumerable, IEnumerable> { ++ public class SortedDictionary : ICollection, ICollection>, IDictionary, IDictionary, IEnumerable, IEnumerable>, IReadOnlyCollection>, IReadOnlyDictionary { +- public sealed class KeyCollection : ICollection, ICollection, IEnumerable, IEnumerable { ++ public sealed class KeyCollection : ICollection, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection { + } +- public sealed class ValueCollection : ICollection, ICollection, IEnumerable, IEnumerable { ++ public sealed class ValueCollection : ICollection, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection { + } ++ IEnumerable System.Collections.Generic.IReadOnlyDictionary.Keys { get; } ++ IEnumerable System.Collections.Generic.IReadOnlyDictionary.Values { get; } + } +- public class SortedList : ICollection, ICollection>, IDictionary, IDictionary, IEnumerable, IEnumerable> { ++ public class SortedList : ICollection, ICollection>, IDictionary, IDictionary, IEnumerable, IEnumerable>, IReadOnlyCollection>, IReadOnlyDictionary { ++ IEnumerable System.Collections.Generic.IReadOnlyDictionary.Keys { get; } ++ IEnumerable System.Collections.Generic.IReadOnlyDictionary.Values { get; } + } +- public class SortedSet : ICollection, ICollection, IDeserializationCallback, IEnumerable, IEnumerable, ISerializable, ISet { ++ public class SortedSet : ICollection, ICollection, IDeserializationCallback, IEnumerable, IEnumerable, IReadOnlyCollection, ISerializable, ISet { + } +- public class Stack : ICollection, IEnumerable, IEnumerable { ++ public class Stack : ICollection, IEnumerable, IEnumerable, IReadOnlyCollection { + } + } + namespace System.Collections.ObjectModel { + public class ReadOnlyDictionary : ICollection, ICollection>, IDictionary, IDictionary, IEnumerable, IEnumerable>, IReadOnlyCollection>, IReadOnlyDictionary { +- public sealed class KeyCollection : ICollection, ICollection, IEnumerable, IEnumerable { ++ public sealed class KeyCollection : ICollection, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection { + } +- public sealed class ValueCollection : ICollection, ICollection, IEnumerable, IEnumerable { ++ public sealed class ValueCollection : ICollection, ICollection, IEnumerable, IEnumerable, IReadOnlyCollection { + } + } + } + namespace System.Configuration { + public sealed class RsaProtectedConfigurationProvider : ProtectedConfigurationProvider { ++ public bool UseFIPS { get; } + } + } + namespace System.Data.Common { + public class DbEnumerator : IEnumerator { ++ public DbEnumerator(DbDataReader reader); ++ public DbEnumerator(DbDataReader reader, bool closeReader); + } + } + namespace System.Data.SqlClient { ++ public enum SqlAuthenticationMethod { ++ ActiveDirectoryIntegrated = 3, ++ ActiveDirectoryPassword = 2, ++ NotSpecified = 0, ++ SqlPassword = 1, ++ } + public sealed class SqlBulkCopy : IDisposable { ++ public void WriteToServer(DbDataReader reader); ++ public Task WriteToServerAsync(DbDataReader reader); ++ public Task WriteToServerAsync(DbDataReader reader, CancellationToken cancellationToken); + } ++ public sealed class SqlColumnEncryptionCertificateStoreProvider : SqlColumnEncryptionKeyStoreProvider { ++ public SqlColumnEncryptionCertificateStoreProvider(); ++ public override byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] encryptedColumnEncryptionKey); ++ public override byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey); ++ } ++ public abstract class SqlColumnEncryptionKeyStoreProvider { ++ protected SqlColumnEncryptionKeyStoreProvider(); ++ public abstract byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] encryptedColumnEncryptionKey); ++ public abstract byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey); ++ } + public sealed class SqlCommand : DbCommand, ICloneable { ++ public SqlCommand(string cmdText, SqlConnection connection, SqlTransaction transaction, SqlCommandColumnEncryptionSetting columnEncryptionSetting); ++ public SqlCommandColumnEncryptionSetting ColumnEncryptionSetting { get; } + } ++ public enum SqlCommandColumnEncryptionSetting { ++ Disabled = 3, ++ Enabled = 1, ++ ResultSetOnly = 2, ++ UseConnectionSetting = 0, ++ } + public sealed class SqlConnection : DbConnection, ICloneable { ++ public string AccessToken { get; set; } ++ public static IDictionary> ColumnEncryptionTrustedMasterKeyPaths { get; } ++ public static void RegisterColumnEncryptionKeyStoreProviders(IDictionary customProviders); + } ++ public enum SqlConnectionColumnEncryptionSetting { ++ Disabled = 0, ++ Enabled = 1, ++ } + public sealed class SqlConnectionStringBuilder : DbConnectionStringBuilder { ++ public SqlAuthenticationMethod Authentication { get; set; } ++ public SqlConnectionColumnEncryptionSetting ColumnEncryptionSetting { get; set; } + } + public sealed class SqlParameter : DbParameter, ICloneable, IDataParameter, IDbDataParameter { ++ public bool ForceColumnEncryption { get; set; } + } + } + namespace System.Diagnostics { + public sealed class Debugger { +- public static bool IsAttached { get; } ++ public static bool IsAttached { [MethodImpl(InternalCall)]get; } + } + public class Process : Component { ++ public SafeProcessHandle SafeHandle { get; } + } + public sealed class ProcessStartInfo { ++ public IDictionary Environment { get; } + } + } + namespace System.Diagnostics.Tracing { ++ public enum EventActivityOptions { ++ Detachable = 8, ++ Disable = 2, ++ None = 0, ++ Recursive = 4, ++ } + public sealed class EventAttribute : Attribute { ++ public EventActivityOptions ActivityOptions { get; set; } ++ public EventChannel Channel { get; set; } ++ public EventTags Tags { get; set; } + } ++ public enum EventChannel : byte { ++ Admin = (byte)16, ++ Analytic = (byte)18, ++ Debug = (byte)19, ++ None = (byte)0, ++ Operational = (byte)17, ++ } + public class EventCommandEventArgs : EventArgs { +- public IDictionary Arguments { get; private set; } ++ public IDictionary Arguments { get; internal set; } +- public EventCommand Command { get; private set; } ++ public EventCommand Command { get; internal set; } + } ++ public class EventDataAttribute : Attribute { ++ public EventDataAttribute(); ++ public string Name { get; set; } ++ } ++ public class EventFieldAttribute : Attribute { ++ public EventFieldAttribute(); ++ public EventFieldFormat Format { get; set; } ++ public EventFieldTags Tags { get; set; } ++ } ++ public enum EventFieldFormat { ++ Boolean = 3, ++ Default = 0, ++ Hexadecimal = 4, ++ HResult = 15, ++ Json = 12, ++ String = 2, ++ Xml = 11, ++ } ++ public enum EventFieldTags { ++ None = 0, ++ } ++ public class EventIgnoreAttribute : Attribute { ++ public EventIgnoreAttribute(); ++ } + public enum EventKeywords : long { ++ All = (long)-1, ++ MicrosoftTelemetry = (long)562949953421312, + } ++ public enum EventManifestOptions { ++ AllCultures = 2, ++ AllowEventSourceOverride = 8, ++ None = 0, ++ OnlyIfNeededForRegistration = 4, ++ Strict = 1, ++ } + public class EventSource : IDisposable { ++ protected EventSource(EventSourceSettings settings); ++ protected EventSource(EventSourceSettings settings, params string[] traits); ++ public EventSource(string eventSourceName); ++ public EventSource(string eventSourceName, EventSourceSettings config); ++ public EventSource(string eventSourceName, EventSourceSettings config, params string[] traits); ++ public EventSourceSettings Settings { get; } ++ public static string GenerateManifest(Type eventSourceType, string assemblyPathToIncludeInManifest, EventManifestOptions flags); ++ public string GetTrait(string key); ++ public bool IsEnabled(EventLevel level, EventKeywords keywords, EventChannel channel); ++ public void Write(string eventName, T data); ++ public void Write(string eventName, EventSourceOptions options, T data); ++ public void Write(string eventName, ref EventSourceOptions options, ref T data); ++ public void Write(string eventName, ref EventSourceOptions options, ref Guid activityId, ref Guid relatedActivityId, ref T data); ++ public void Write(string eventName); ++ public void Write(string eventName, EventSourceOptions options); ++ protected void WriteEvent(int eventId, byte[] arg1); ++ protected void WriteEvent(int eventId, int arg1, string arg2); ++ protected void WriteEvent(int eventId, long arg1, byte[] arg2); ++ protected void WriteEvent(int eventId, long arg1, string arg2); +- protected void WriteEventWithRelatedActivityId(int eventId, Guid childActivityID, params object[] args); ++ protected void WriteEventWithRelatedActivityId(int eventId, Guid relatedActivityId, params object[] args); +- protected unsafe void WriteEventWithRelatedActivityIdCore(int eventId, Guid* childActivityID, int eventDataCount, EventSource.EventData* data); ++ protected unsafe void WriteEventWithRelatedActivityIdCore(int eventId, Guid* relatedActivityId, int eventDataCount, EventSource.EventData* data); + } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct EventSourceOptions { ++ public EventActivityOptions ActivityOptions { get; set; } ++ public EventKeywords Keywords { get; set; } ++ public EventLevel Level { get; set; } ++ public EventOpcode Opcode { get; set; } ++ public EventTags Tags { get; set; } ++ } ++ public enum EventSourceSettings { ++ Default = 0, ++ EtwManifestEventFormat = 4, ++ EtwSelfDescribingEventFormat = 8, ++ ThrowOnEventWriteErrors = 1, ++ } ++ public enum EventTags { ++ None = 0, ++ } + public class EventWrittenEventArgs : EventArgs { ++ public EventChannel Channel { get; } ++ public string EventName { get; internal set; } ++ public ReadOnlyCollection PayloadNames { get; internal set; } ++ public EventTags Tags { get; } + } + } + namespace System.DirectoryServices.ActiveDirectory { + public class Domain : ActiveDirectoryPartition { ++ public int DomainModeLevel { get; } ++ public void RaiseDomainFunctionalityLevel(int domainMode); + } + public enum DomainMode { ++ Unknown = -1, + } + public class Forest : IDisposable { ++ public int ForestModeLevel { get; } ++ public void RaiseForestFunctionalityLevel(int forestMode); + } + public enum ForestMode { ++ Unknown = -1, + } + } + namespace System.Globalization { + public class CompareInfo : IDeserializationCallback { ++ public virtual int GetHashCode(string source, CompareOptions options); + } + public class CultureInfo : ICloneable, IFormatProvider { +- public static CultureInfo CurrentCulture { get; } ++ public static CultureInfo CurrentCulture { get; set; } +- public static CultureInfo CurrentUICulture { get; } ++ public static CultureInfo CurrentUICulture { get; set; } + } + } + namespace System.IO { + public class MemoryStream : Stream { ++ public virtual bool TryGetBuffer(out ArraySegment buffer); + } + } + namespace System.IO.MemoryMappedFiles { + public class MemoryMappedFile : IDisposable { ++ public static MemoryMappedFile CreateFromFile(FileStream fileStream, string mapName, long capacity, MemoryMappedFileAccess access, HandleInheritability inheritability, bool leaveOpen); ++ public static MemoryMappedFile CreateNew(string mapName, long capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, HandleInheritability inheritability); ++ public static MemoryMappedFile CreateOrOpen(string mapName, long capacity, MemoryMappedFileAccess access, MemoryMappedFileOptions options, HandleInheritability inheritability); + } + } + namespace System.IO.Pipes { + public sealed class NamedPipeClientStream : PipeStream { ++ public Task ConnectAsync(); ++ public Task ConnectAsync(CancellationToken cancellationToken); ++ public Task ConnectAsync(int timeout); ++ public Task ConnectAsync(int timeout, CancellationToken cancellationToken); + } + public sealed class NamedPipeServerStream : PipeStream { ++ public Task WaitForConnectionAsync(); ++ public Task WaitForConnectionAsync(CancellationToken cancellationToken); + } + } + namespace System.Linq.Expressions { +- public class DynamicExpression : Expression { ++ public class DynamicExpression : Expression, IArgumentProvider, IDynamicExpression { ++ int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; } ++ Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index); ++ object System.Linq.Expressions.IDynamicExpression.CreateCallSite(); ++ Expression System.Linq.Expressions.IDynamicExpression.Rewrite(Expression[] args); + } +- public sealed class ElementInit { ++ public sealed class ElementInit : IArgumentProvider { ++ int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; } ++ Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index); + } ++ public interface IArgumentProvider { ++ int ArgumentCount { get; } ++ Expression GetArgument(int index); ++ } ++ public interface IDynamicExpression : IArgumentProvider { ++ Type DelegateType { get; } ++ object CreateCallSite(); ++ Expression Rewrite(Expression[] args); ++ } +- public sealed class IndexExpression : Expression { ++ public sealed class IndexExpression : Expression, IArgumentProvider { ++ int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; } ++ Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index); + } +- public sealed class InvocationExpression : Expression { ++ public sealed class InvocationExpression : Expression, IArgumentProvider { ++ int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; } ++ Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index); + } +- public class MethodCallExpression : Expression { ++ public class MethodCallExpression : Expression, IArgumentProvider { ++ int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; } ++ Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index); + } +- public class NewExpression : Expression { ++ public class NewExpression : Expression, IArgumentProvider { ++ int System.Linq.Expressions.IArgumentProvider.ArgumentCount { get; } ++ Expression System.Linq.Expressions.IArgumentProvider.GetArgument(int index); + } + } + namespace System.Net { + public class ServicePointManager { ++ public static bool ReusePort { get; set; } + } + } + namespace System.Net.Sockets { + public enum SocketOptionName { ++ ReuseUnicastPort = 12295, + } + public class TcpClient : IDisposable { ++ public void Dispose(); +- void System.IDisposable.Dispose(); + } + public class UdpClient : IDisposable { ++ public void Dispose(); +- void System.IDisposable.Dispose(); + } + } + namespace System.Numerics { ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct Matrix3x2 : IEquatable { ++ public float M11; ++ public float M12; ++ public float M21; ++ public float M22; ++ public float M31; ++ public float M32; ++ public Matrix3x2(float m11, float m12, float m21, float m22, float m31, float m32); ++ public static Matrix3x2 Identity { get; } ++ public bool IsIdentity { get; } ++ public Vector2 Translation { get; set; } ++ public static Matrix3x2 Add(Matrix3x2 value1, Matrix3x2 value2); ++ public static Matrix3x2 CreateRotation(float radians); ++ public static Matrix3x2 CreateRotation(float radians, Vector2 centerPoint); ++ public static Matrix3x2 CreateScale(float scale); ++ public static Matrix3x2 CreateScale(float xScale, float yScale); ++ public static Matrix3x2 CreateScale(float xScale, float yScale, Vector2 centerPoint); ++ public static Matrix3x2 CreateScale(float scale, Vector2 centerPoint); ++ public static Matrix3x2 CreateScale(Vector2 scales); ++ public static Matrix3x2 CreateScale(Vector2 scales, Vector2 centerPoint); ++ public static Matrix3x2 CreateSkew(float radiansX, float radiansY); ++ public static Matrix3x2 CreateSkew(float radiansX, float radiansY, Vector2 centerPoint); ++ public static Matrix3x2 CreateTranslation(float xPosition, float yPosition); ++ public static Matrix3x2 CreateTranslation(Vector2 position); ++ public bool Equals(Matrix3x2 other); ++ public override bool Equals(object obj); ++ public float GetDeterminant(); ++ public override int GetHashCode(); ++ public static bool Invert(Matrix3x2 matrix, out Matrix3x2 result); ++ public static Matrix3x2 Lerp(Matrix3x2 matrix1, Matrix3x2 matrix2, float amount); ++ public static Matrix3x2 Multiply(Matrix3x2 value1, Matrix3x2 value2); ++ public static Matrix3x2 Multiply(Matrix3x2 value1, float value2); ++ public static Matrix3x2 Negate(Matrix3x2 value); ++ public static Matrix3x2 operator +(Matrix3x2 value1, Matrix3x2 value2); ++ public static bool operator ==(Matrix3x2 value1, Matrix3x2 value2); ++ public static bool operator !=(Matrix3x2 value1, Matrix3x2 value2); ++ public static Matrix3x2 operator *(Matrix3x2 value1, Matrix3x2 value2); ++ public static Matrix3x2 operator *(Matrix3x2 value1, float value2); ++ public static Matrix3x2 operator -(Matrix3x2 value1, Matrix3x2 value2); ++ public static Matrix3x2 operator -(Matrix3x2 value); ++ public static Matrix3x2 Subtract(Matrix3x2 value1, Matrix3x2 value2); ++ public override string ToString(); ++ } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct Matrix4x4 : IEquatable { ++ public float M11; ++ public float M12; ++ public float M13; ++ public float M14; ++ public float M21; ++ public float M22; ++ public float M23; ++ public float M24; ++ public float M31; ++ public float M32; ++ public float M33; ++ public float M34; ++ public float M41; ++ public float M42; ++ public float M43; ++ public float M44; ++ public Matrix4x4(Matrix3x2 value); ++ public Matrix4x4(float m11, float m12, float m13, float m14, float m21, float m22, float m23, float m24, float m31, float m32, float m33, float m34, float m41, float m42, float m43, float m44); ++ public static Matrix4x4 Identity { get; } ++ public bool IsIdentity { get; } ++ public Vector3 Translation { get; set; } ++ public static Matrix4x4 Add(Matrix4x4 value1, Matrix4x4 value2); ++ public static Matrix4x4 CreateBillboard(Vector3 objectPosition, Vector3 cameraPosition, Vector3 cameraUpVector, Vector3 cameraForwardVector); ++ public static Matrix4x4 CreateConstrainedBillboard(Vector3 objectPosition, Vector3 cameraPosition, Vector3 rotateAxis, Vector3 cameraForwardVector, Vector3 objectForwardVector); ++ public static Matrix4x4 CreateFromAxisAngle(Vector3 axis, float angle); ++ public static Matrix4x4 CreateFromQuaternion(Quaternion quaternion); ++ public static Matrix4x4 CreateFromYawPitchRoll(float yaw, float pitch, float roll); ++ public static Matrix4x4 CreateLookAt(Vector3 cameraPosition, Vector3 cameraTarget, Vector3 cameraUpVector); ++ public static Matrix4x4 CreateOrthographic(float width, float height, float zNearPlane, float zFarPlane); ++ public static Matrix4x4 CreateOrthographicOffCenter(float left, float right, float bottom, float top, float zNearPlane, float zFarPlane); ++ public static Matrix4x4 CreatePerspective(float width, float height, float nearPlaneDistance, float farPlaneDistance); ++ public static Matrix4x4 CreatePerspectiveFieldOfView(float fieldOfView, float aspectRatio, float nearPlaneDistance, float farPlaneDistance); ++ public static Matrix4x4 CreatePerspectiveOffCenter(float left, float right, float bottom, float top, float nearPlaneDistance, float farPlaneDistance); ++ public static Matrix4x4 CreateReflection(Plane value); ++ public static Matrix4x4 CreateRotationX(float radians); ++ public static Matrix4x4 CreateRotationX(float radians, Vector3 centerPoint); ++ public static Matrix4x4 CreateRotationY(float radians); ++ public static Matrix4x4 CreateRotationY(float radians, Vector3 centerPoint); ++ public static Matrix4x4 CreateRotationZ(float radians); ++ public static Matrix4x4 CreateRotationZ(float radians, Vector3 centerPoint); ++ public static Matrix4x4 CreateScale(float scale); ++ public static Matrix4x4 CreateScale(float xScale, float yScale, float zScale); ++ public static Matrix4x4 CreateScale(float xScale, float yScale, float zScale, Vector3 centerPoint); ++ public static Matrix4x4 CreateScale(float scale, Vector3 centerPoint); ++ public static Matrix4x4 CreateScale(Vector3 scales); ++ public static Matrix4x4 CreateScale(Vector3 scales, Vector3 centerPoint); ++ public static Matrix4x4 CreateShadow(Vector3 lightDirection, Plane plane); ++ public static Matrix4x4 CreateTranslation(float xPosition, float yPosition, float zPosition); ++ public static Matrix4x4 CreateTranslation(Vector3 position); ++ public static Matrix4x4 CreateWorld(Vector3 position, Vector3 forward, Vector3 up); ++ public static bool Decompose(Matrix4x4 matrix, out Vector3 scale, out Quaternion rotation, out Vector3 translation); ++ public bool Equals(Matrix4x4 other); ++ public override bool Equals(object obj); ++ public float GetDeterminant(); ++ public override int GetHashCode(); ++ public static bool Invert(Matrix4x4 matrix, out Matrix4x4 result); ++ public static Matrix4x4 Lerp(Matrix4x4 matrix1, Matrix4x4 matrix2, float amount); ++ public static Matrix4x4 Multiply(Matrix4x4 value1, Matrix4x4 value2); ++ public static Matrix4x4 Multiply(Matrix4x4 value1, float value2); ++ public static Matrix4x4 Negate(Matrix4x4 value); ++ public static Matrix4x4 operator +(Matrix4x4 value1, Matrix4x4 value2); ++ public static bool operator ==(Matrix4x4 value1, Matrix4x4 value2); ++ public static bool operator !=(Matrix4x4 value1, Matrix4x4 value2); ++ public static Matrix4x4 operator *(Matrix4x4 value1, Matrix4x4 value2); ++ public static Matrix4x4 operator *(Matrix4x4 value1, float value2); ++ public static Matrix4x4 operator -(Matrix4x4 value1, Matrix4x4 value2); ++ public static Matrix4x4 operator -(Matrix4x4 value); ++ public static Matrix4x4 Subtract(Matrix4x4 value1, Matrix4x4 value2); ++ public override string ToString(); ++ public static Matrix4x4 Transform(Matrix4x4 value, Quaternion rotation); ++ public static Matrix4x4 Transpose(Matrix4x4 matrix); ++ } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct Plane : IEquatable { ++ public float D; ++ public Vector3 Normal; ++ public Plane(float x, float y, float z, float d); ++ public Plane(Vector3 normal, float d); ++ public Plane(Vector4 value); ++ [MethodImpl(AggressiveInlining)]public static Plane CreateFromVertices(Vector3 point1, Vector3 point2, Vector3 point3); ++ [MethodImpl(AggressiveInlining)]public static float Dot(Plane plane, Vector4 value); ++ [MethodImpl(AggressiveInlining)]public static float DotCoordinate(Plane plane, Vector3 value); ++ [MethodImpl(AggressiveInlining)]public static float DotNormal(Plane plane, Vector3 value); ++ [MethodImpl(AggressiveInlining)]public override bool Equals(object obj); ++ [MethodImpl(AggressiveInlining)]public bool Equals(Plane other); ++ public override int GetHashCode(); ++ [MethodImpl(AggressiveInlining)]public static Plane Normalize(Plane value); ++ [MethodImpl(AggressiveInlining)]public static bool operator ==(Plane value1, Plane value2); ++ [MethodImpl(AggressiveInlining)]public static bool operator !=(Plane value1, Plane value2); ++ public override string ToString(); ++ [MethodImpl(AggressiveInlining)]public static Plane Transform(Plane plane, Matrix4x4 matrix); ++ [MethodImpl(AggressiveInlining)]public static Plane Transform(Plane plane, Quaternion rotation); ++ } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct Quaternion : IEquatable { ++ public float W; ++ public float X; ++ public float Y; ++ public float Z; ++ public Quaternion(float x, float y, float z, float w); ++ public Quaternion(Vector3 vectorPart, float scalarPart); ++ public static Quaternion Identity { get; } ++ public bool IsIdentity { get; } ++ public static Quaternion Add(Quaternion value1, Quaternion value2); ++ public static Quaternion Concatenate(Quaternion value1, Quaternion value2); ++ public static Quaternion Conjugate(Quaternion value); ++ public static Quaternion CreateFromAxisAngle(Vector3 axis, float angle); ++ public static Quaternion CreateFromRotationMatrix(Matrix4x4 matrix); ++ public static Quaternion CreateFromYawPitchRoll(float yaw, float pitch, float roll); ++ public static Quaternion Divide(Quaternion value1, Quaternion value2); ++ public static float Dot(Quaternion quaternion1, Quaternion quaternion2); ++ public override bool Equals(object obj); ++ public bool Equals(Quaternion other); ++ public override int GetHashCode(); ++ public static Quaternion Inverse(Quaternion value); ++ public float Length(); ++ public float LengthSquared(); ++ public static Quaternion Lerp(Quaternion quaternion1, Quaternion quaternion2, float amount); ++ public static Quaternion Multiply(Quaternion value1, Quaternion value2); ++ public static Quaternion Multiply(Quaternion value1, float value2); ++ public static Quaternion Negate(Quaternion value); ++ public static Quaternion Normalize(Quaternion value); ++ public static Quaternion operator +(Quaternion value1, Quaternion value2); ++ public static Quaternion operator /(Quaternion value1, Quaternion value2); ++ public static bool operator ==(Quaternion value1, Quaternion value2); ++ public static bool operator !=(Quaternion value1, Quaternion value2); ++ public static Quaternion operator *(Quaternion value1, Quaternion value2); ++ public static Quaternion operator *(Quaternion value1, float value2); ++ public static Quaternion operator -(Quaternion value1, Quaternion value2); ++ public static Quaternion operator -(Quaternion value); ++ public static Quaternion Slerp(Quaternion quaternion1, Quaternion quaternion2, float amount); ++ public static Quaternion Subtract(Quaternion value1, Quaternion value2); ++ public override string ToString(); ++ } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct Vector2 : IEquatable, IFormattable { ++ public float X; ++ public float Y; ++ public Vector2(float value); ++ public Vector2(float x, float y); ++ public static Vector2 One { get; } ++ public static Vector2 UnitX { get; } ++ public static Vector2 UnitY { get; } ++ public static Vector2 Zero { get; } ++ [MethodImpl(AggressiveInlining)]public static Vector2 Abs(Vector2 value); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Add(Vector2 left, Vector2 right); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Clamp(Vector2 value1, Vector2 min, Vector2 max); ++ [MethodImpl(AggressiveInlining)]public void CopyTo(float[] array); ++ public void CopyTo(float[] array, int index); ++ [MethodImpl(AggressiveInlining)]public static float Distance(Vector2 value1, Vector2 value2); ++ [MethodImpl(AggressiveInlining)]public static float DistanceSquared(Vector2 value1, Vector2 value2); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Divide(Vector2 left, float divisor); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Divide(Vector2 left, Vector2 right); ++ [MethodImpl(AggressiveInlining)]public static float Dot(Vector2 value1, Vector2 value2); ++ [MethodImpl(AggressiveInlining)]public override bool Equals(object obj); ++ public bool Equals(Vector2 other); ++ public override int GetHashCode(); ++ [MethodImpl(AggressiveInlining)]public float Length(); ++ [MethodImpl(AggressiveInlining)]public float LengthSquared(); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Lerp(Vector2 value1, Vector2 value2, float amount); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Max(Vector2 value1, Vector2 value2); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Min(Vector2 value1, Vector2 value2); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Multiply(float left, Vector2 right); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Multiply(Vector2 left, float right); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Multiply(Vector2 left, Vector2 right); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Negate(Vector2 value); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Normalize(Vector2 value); ++ [MethodImpl(AggressiveInlining)]public static Vector2 operator +(Vector2 left, Vector2 right); ++ [MethodImpl(AggressiveInlining)]public static Vector2 operator /(Vector2 value1, float value2); ++ [MethodImpl(AggressiveInlining)]public static Vector2 operator /(Vector2 left, Vector2 right); ++ [MethodImpl(AggressiveInlining)]public static bool operator ==(Vector2 left, Vector2 right); ++ [MethodImpl(AggressiveInlining)]public static bool operator !=(Vector2 left, Vector2 right); ++ [MethodImpl(AggressiveInlining)]public static Vector2 operator *(float left, Vector2 right); ++ [MethodImpl(AggressiveInlining)]public static Vector2 operator *(Vector2 left, float right); ++ [MethodImpl(AggressiveInlining)]public static Vector2 operator *(Vector2 left, Vector2 right); ++ [MethodImpl(AggressiveInlining)]public static Vector2 operator -(Vector2 left, Vector2 right); ++ [MethodImpl(AggressiveInlining)]public static Vector2 operator -(Vector2 value); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Reflect(Vector2 vector, Vector2 normal); ++ [MethodImpl(AggressiveInlining)]public static Vector2 SquareRoot(Vector2 value); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Subtract(Vector2 left, Vector2 right); ++ public override string ToString(); ++ public string ToString(string format); ++ public string ToString(string format, IFormatProvider formatProvider); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Transform(Vector2 position, Matrix3x2 matrix); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Transform(Vector2 position, Matrix4x4 matrix); ++ [MethodImpl(AggressiveInlining)]public static Vector2 Transform(Vector2 value, Quaternion rotation); ++ [MethodImpl(AggressiveInlining)]public static Vector2 TransformNormal(Vector2 normal, Matrix3x2 matrix); ++ [MethodImpl(AggressiveInlining)]public static Vector2 TransformNormal(Vector2 normal, Matrix4x4 matrix); ++ } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct Vector3 : IEquatable, IFormattable { ++ public float X; ++ public float Y; ++ public float Z; ++ public Vector3(float value); ++ public Vector3(float x, float y, float z); ++ public Vector3(Vector2 value, float z); ++ public static Vector3 One { get; } ++ public static Vector3 UnitX { get; } ++ public static Vector3 UnitY { get; } ++ public static Vector3 UnitZ { get; } ++ public static Vector3 Zero { get; } ++ [MethodImpl(AggressiveInlining)]public static Vector3 Abs(Vector3 value); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Add(Vector3 left, Vector3 right); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Clamp(Vector3 value1, Vector3 min, Vector3 max); ++ [MethodImpl(AggressiveInlining)]public void CopyTo(float[] array); ++ [MethodImpl(AggressiveInlining)]public void CopyTo(float[] array, int index); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Cross(Vector3 vector1, Vector3 vector2); ++ [MethodImpl(AggressiveInlining)]public static float Distance(Vector3 value1, Vector3 value2); ++ [MethodImpl(AggressiveInlining)]public static float DistanceSquared(Vector3 value1, Vector3 value2); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Divide(Vector3 left, float divisor); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Divide(Vector3 left, Vector3 right); ++ [MethodImpl(AggressiveInlining)]public static float Dot(Vector3 vector1, Vector3 vector2); ++ [MethodImpl(AggressiveInlining)]public override bool Equals(object obj); ++ public bool Equals(Vector3 other); ++ public override int GetHashCode(); ++ [MethodImpl(AggressiveInlining)]public float Length(); ++ [MethodImpl(AggressiveInlining)]public float LengthSquared(); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Lerp(Vector3 value1, Vector3 value2, float amount); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Max(Vector3 value1, Vector3 value2); ++ public static Vector3 Min(Vector3 value1, Vector3 value2); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Multiply(float left, Vector3 right); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Multiply(Vector3 left, float right); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Multiply(Vector3 left, Vector3 right); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Negate(Vector3 value); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Normalize(Vector3 value); ++ [MethodImpl(AggressiveInlining)]public static Vector3 operator +(Vector3 left, Vector3 right); ++ [MethodImpl(AggressiveInlining)]public static Vector3 operator /(Vector3 value1, float value2); ++ [MethodImpl(AggressiveInlining)]public static Vector3 operator /(Vector3 left, Vector3 right); ++ [MethodImpl(AggressiveInlining)]public static bool operator ==(Vector3 left, Vector3 right); ++ [MethodImpl(AggressiveInlining)]public static bool operator !=(Vector3 left, Vector3 right); ++ [MethodImpl(AggressiveInlining)]public static Vector3 operator *(float left, Vector3 right); ++ [MethodImpl(AggressiveInlining)]public static Vector3 operator *(Vector3 left, float right); ++ [MethodImpl(AggressiveInlining)]public static Vector3 operator *(Vector3 left, Vector3 right); ++ [MethodImpl(AggressiveInlining)]public static Vector3 operator -(Vector3 left, Vector3 right); ++ [MethodImpl(AggressiveInlining)]public static Vector3 operator -(Vector3 value); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Reflect(Vector3 vector, Vector3 normal); ++ [MethodImpl(AggressiveInlining)]public static Vector3 SquareRoot(Vector3 value); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Subtract(Vector3 left, Vector3 right); ++ public override string ToString(); ++ public string ToString(string format); ++ public string ToString(string format, IFormatProvider formatProvider); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Transform(Vector3 position, Matrix4x4 matrix); ++ [MethodImpl(AggressiveInlining)]public static Vector3 Transform(Vector3 value, Quaternion rotation); ++ [MethodImpl(AggressiveInlining)]public static Vector3 TransformNormal(Vector3 normal, Matrix4x4 matrix); ++ } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct Vector4 : IEquatable, IFormattable { ++ public float W; ++ public float X; ++ public float Y; ++ public float Z; ++ public Vector4(float value); ++ public Vector4(float x, float y, float z, float w); ++ public Vector4(Vector2 value, float z, float w); ++ public Vector4(Vector3 value, float w); ++ public static Vector4 One { get; } ++ public static Vector4 UnitW { get; } ++ public static Vector4 UnitX { get; } ++ public static Vector4 UnitY { get; } ++ public static Vector4 UnitZ { get; } ++ public static Vector4 Zero { get; } ++ [MethodImpl(AggressiveInlining)]public static Vector4 Abs(Vector4 value); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Add(Vector4 left, Vector4 right); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Clamp(Vector4 value1, Vector4 min, Vector4 max); ++ [MethodImpl(AggressiveInlining)]public void CopyTo(float[] array); ++ [MethodImpl(AggressiveInlining)]public void CopyTo(float[] array, int index); ++ [MethodImpl(AggressiveInlining)]public static float Distance(Vector4 value1, Vector4 value2); ++ [MethodImpl(AggressiveInlining)]public static float DistanceSquared(Vector4 value1, Vector4 value2); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Divide(Vector4 left, float divisor); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Divide(Vector4 left, Vector4 right); ++ [MethodImpl(AggressiveInlining)]public static float Dot(Vector4 vector1, Vector4 vector2); ++ [MethodImpl(AggressiveInlining)]public override bool Equals(object obj); ++ public bool Equals(Vector4 other); ++ public override int GetHashCode(); ++ [MethodImpl(AggressiveInlining)]public float Length(); ++ [MethodImpl(AggressiveInlining)]public float LengthSquared(); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Lerp(Vector4 value1, Vector4 value2, float amount); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Max(Vector4 value1, Vector4 value2); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Min(Vector4 value1, Vector4 value2); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Multiply(float left, Vector4 right); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Multiply(Vector4 left, float right); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Multiply(Vector4 left, Vector4 right); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Negate(Vector4 value); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Normalize(Vector4 vector); ++ [MethodImpl(AggressiveInlining)]public static Vector4 operator +(Vector4 left, Vector4 right); ++ [MethodImpl(AggressiveInlining)]public static Vector4 operator /(Vector4 value1, float value2); ++ [MethodImpl(AggressiveInlining)]public static Vector4 operator /(Vector4 left, Vector4 right); ++ [MethodImpl(AggressiveInlining)]public static bool operator ==(Vector4 left, Vector4 right); ++ [MethodImpl(AggressiveInlining)]public static bool operator !=(Vector4 left, Vector4 right); ++ [MethodImpl(AggressiveInlining)]public static Vector4 operator *(float left, Vector4 right); ++ [MethodImpl(AggressiveInlining)]public static Vector4 operator *(Vector4 left, float right); ++ [MethodImpl(AggressiveInlining)]public static Vector4 operator *(Vector4 left, Vector4 right); ++ [MethodImpl(AggressiveInlining)]public static Vector4 operator -(Vector4 left, Vector4 right); ++ [MethodImpl(AggressiveInlining)]public static Vector4 operator -(Vector4 value); ++ [MethodImpl(AggressiveInlining)]public static Vector4 SquareRoot(Vector4 value); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Subtract(Vector4 left, Vector4 right); ++ public override string ToString(); ++ public string ToString(string format); ++ public string ToString(string format, IFormatProvider formatProvider); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector2 position, Matrix4x4 matrix); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector2 value, Quaternion rotation); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector3 position, Matrix4x4 matrix); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector3 value, Quaternion rotation); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector4 vector, Matrix4x4 matrix); ++ [MethodImpl(AggressiveInlining)]public static Vector4 Transform(Vector4 value, Quaternion rotation); ++ } + } + namespace System.Reflection { + public sealed class AssemblyName : _AssemblyName, ICloneable, IDeserializationCallback, ISerializable { +- public string CultureName { get; } ++ public string CultureName { get; set; } + } + } + namespace System.Runtime { + public enum GCLatencyMode { ++ NoGCRegion = 4, + } + } + namespace System.Runtime.CompilerServices { +- [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] +- public struct AsyncTaskMethodBuilder : IAsyncMethodBuilder { ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct AsyncTaskMethodBuilder { + } +- [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] +- public struct AsyncTaskMethodBuilder : IAsyncMethodBuilder { ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct AsyncTaskMethodBuilder { + } +- [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] +- public struct AsyncVoidMethodBuilder : IAsyncMethodBuilder { ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct AsyncVoidMethodBuilder { + } ++ public sealed class DisablePrivateReflectionAttribute : Attribute { ++ public DisablePrivateReflectionAttribute(); ++ } ++ public static class FormattableStringFactory { ++ public static FormattableString Create(string format, params object[] arguments); ++ } + } + namespace System.Runtime.InteropServices { + public static class Marshal { +- public static IntPtr CreateAggregatedObject(IntPtr pOuter, object o); ++ [MethodImpl(InternalCall)]public static IntPtr CreateAggregatedObject(IntPtr pOuter, object o); +- public static void DestroyStructure(IntPtr ptr, Type structuretype); ++ [MethodImpl(InternalCall)]public static void DestroyStructure(IntPtr ptr, Type structuretype); +- public static int GetExceptionCode(); ++ [MethodImpl(InternalCall)]public static int GetExceptionCode(); +- public static void GetNativeVariantForObject(object obj, IntPtr pDstNativeVariant); ++ [MethodImpl(InternalCall)]public static void GetNativeVariantForObject(object obj, IntPtr pDstNativeVariant); +- public static object GetObjectForIUnknown(IntPtr pUnk); ++ [MethodImpl(InternalCall)]public static object GetObjectForIUnknown(IntPtr pUnk); +- public static object GetObjectForNativeVariant(IntPtr pSrcNativeVariant); ++ [MethodImpl(InternalCall)]public static object GetObjectForNativeVariant(IntPtr pSrcNativeVariant); +- public static object[] GetObjectsForNativeVariants(IntPtr aSrcNativeVariant, int cVars); ++ [MethodImpl(InternalCall)]public static object[] GetObjectsForNativeVariants(IntPtr aSrcNativeVariant, int cVars); +- public static int GetStartComSlot(Type t); ++ [MethodImpl(InternalCall)]public static int GetStartComSlot(Type t); +- public static object GetUniqueObjectForIUnknown(IntPtr unknown); ++ [MethodImpl(InternalCall)]public static object GetUniqueObjectForIUnknown(IntPtr unknown); +- public static void StructureToPtr(object structure, IntPtr ptr, bool fDeleteOld); ++ [MethodImpl(InternalCall)]public static void StructureToPtr(object structure, IntPtr ptr, bool fDeleteOld); +- public static IntPtr UnsafeAddrOfPinnedArrayElement(Array arr, int index); ++ [MethodImpl(InternalCall)]public static IntPtr UnsafeAddrOfPinnedArrayElement(Array arr, int index); + } + } + namespace System.Runtime.Serialization { + public sealed class CollectionDataContractAttribute : Attribute { ++ public bool IsItemNameSetExplicitly { get; } ++ public bool IsKeyNameSetExplicitly { get; } ++ public bool IsNameSetExplicitly { get; } ++ public bool IsNamespaceSetExplicitly { get; } ++ public bool IsReferenceSetExplicitly { get; } ++ public bool IsValueNameSetExplicitly { get; } + } + public sealed class DataContractAttribute : Attribute { ++ public bool IsNameSetExplicitly { get; } ++ public bool IsNamespaceSetExplicitly { get; } ++ public bool IsReferenceSetExplicitly { get; } + } + public sealed class DataMemberAttribute : Attribute { ++ public bool IsNameSetExplicitly { get; } + } + public sealed class EnumMemberAttribute : Attribute { ++ public bool IsValueSetExplicitly { get; } + } + } + namespace System.Security.AccessControl { + public sealed class AuthorizationRuleCollection : ReadOnlyCollectionBase { ++ public AuthorizationRuleCollection(); ++ public void AddRule(AuthorizationRule rule); + } + public sealed class CommonSecurityDescriptor : GenericSecurityDescriptor { ++ public void AddDiscretionaryAcl(byte revision, int trusted); ++ public void AddSystemAcl(byte revision, int trusted); + } + public sealed class DiscretionaryAcl : CommonAcl { ++ public void AddAccess(AccessControlType accessType, SecurityIdentifier sid, ObjectAccessRule rule); ++ public bool RemoveAccess(AccessControlType accessType, SecurityIdentifier sid, ObjectAccessRule rule); ++ public void RemoveAccessSpecific(AccessControlType accessType, SecurityIdentifier sid, ObjectAccessRule rule); ++ public void SetAccess(AccessControlType accessType, SecurityIdentifier sid, ObjectAccessRule rule); + } + public abstract class ObjectSecurity { ++ protected ObjectSecurity(); ++ protected ObjectSecurity(CommonSecurityDescriptor securityDescriptor); + } + public sealed class SystemAcl : CommonAcl { ++ public void AddAudit(SecurityIdentifier sid, ObjectAuditRule rule); ++ public bool RemoveAudit(SecurityIdentifier sid, ObjectAuditRule rule); ++ public void RemoveAuditSpecific(SecurityIdentifier sid, ObjectAuditRule rule); ++ public void SetAudit(SecurityIdentifier sid, ObjectAuditRule rule); + } + } + namespace System.Security.Claims { + public class Claim { ++ public Claim(BinaryReader reader); ++ public Claim(BinaryReader reader, ClaimsIdentity subject); ++ protected Claim(Claim other); ++ protected Claim(Claim other, ClaimsIdentity subject); ++ protected virtual byte[] CustomSerializationData { get; } ++ public virtual void WriteTo(BinaryWriter writer); ++ protected virtual void WriteTo(BinaryWriter writer, byte[] userData); + } + public class ClaimsIdentity : IIdentity { ++ public ClaimsIdentity(BinaryReader reader); ++ protected ClaimsIdentity(ClaimsIdentity other); ++ protected virtual byte[] CustomSerializationData { get; } ++ protected virtual Claim CreateClaim(BinaryReader reader); ++ public virtual void WriteTo(BinaryWriter writer); ++ protected virtual void WriteTo(BinaryWriter writer, byte[] userData); + } + public class ClaimsPrincipal : IPrincipal { ++ public ClaimsPrincipal(BinaryReader reader); ++ protected virtual byte[] CustomSerializationData { get; } ++ public virtual ClaimsPrincipal Clone(); ++ protected virtual ClaimsIdentity CreateClaimsIdentity(BinaryReader reader); ++ public virtual void WriteTo(BinaryWriter writer); ++ protected virtual void WriteTo(BinaryWriter writer, byte[] userData); + } + } + namespace System.Security.Cryptography { + public abstract class AsymmetricAlgorithm : IDisposable { +- public abstract string KeyExchangeAlgorithm { get; } ++ public virtual string KeyExchangeAlgorithm { get; } +- public abstract string SignatureAlgorithm { get; } ++ public virtual string SignatureAlgorithm { get; } +- public abstract void FromXmlString(string xmlString); ++ public virtual void FromXmlString(string xmlString); +- public abstract string ToXmlString(bool includePrivateParameters); ++ public virtual string ToXmlString(bool includePrivateParameters); + } + public sealed class CngAlgorithm : IEquatable { ++ public static CngAlgorithm Rsa { get; } + } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct HashAlgorithmName : IEquatable { ++ public HashAlgorithmName(string name); ++ public static HashAlgorithmName MD5 { get; } ++ public string Name { get; } ++ public static HashAlgorithmName SHA1 { get; } ++ public static HashAlgorithmName SHA256 { get; } ++ public static HashAlgorithmName SHA384 { get; } ++ public static HashAlgorithmName SHA512 { get; } ++ public bool Equals(HashAlgorithmName other); ++ public override bool Equals(object obj); ++ public override int GetHashCode(); ++ public static bool operator ==(HashAlgorithmName left, HashAlgorithmName right); ++ public static bool operator !=(HashAlgorithmName left, HashAlgorithmName right); ++ public override string ToString(); ++ } + public abstract class RandomNumberGenerator : IDisposable { ++ public virtual void GetBytes(byte[] data, int offset, int count); + } + public class Rfc2898DeriveBytes : DeriveBytes { ++ public byte[] CryptDeriveKey(string algname, string alghashname, int keySize, byte[] rgbIV); + } + public abstract class RSA : AsymmetricAlgorithm { ++ public override string KeyExchangeAlgorithm { get; } ++ public override string SignatureAlgorithm { get; } ++ public virtual byte[] Decrypt(byte[] data, RSAEncryptionPadding padding); +- public abstract byte[] DecryptValue(byte[] rgb); ++ public virtual byte[] DecryptValue(byte[] rgb); ++ public virtual byte[] Encrypt(byte[] data, RSAEncryptionPadding padding); +- public abstract byte[] EncryptValue(byte[] rgb); ++ public virtual byte[] EncryptValue(byte[] rgb); ++ protected virtual byte[] HashData(byte[] data, int offset, int count, HashAlgorithmName hashAlgorithm); ++ protected virtual byte[] HashData(Stream data, HashAlgorithmName hashAlgorithm); ++ public byte[] SignData(byte[] data, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ public virtual byte[] SignData(byte[] data, int offset, int count, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ public virtual byte[] SignData(Stream data, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ public virtual byte[] SignHash(byte[] hash, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ public bool VerifyData(byte[] data, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ public virtual bool VerifyData(byte[] data, int offset, int count, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ public bool VerifyData(Stream data, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ public virtual bool VerifyHash(byte[] hash, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); + } ++ public sealed class RSACng : RSA { ++ public RSACng(); ++ public RSACng(CngKey key); ++ public RSACng(int keySize); ++ public CngKey Key { get; private set; } ++ public override byte[] Decrypt(byte[] data, RSAEncryptionPadding padding); ++ public override byte[] Encrypt(byte[] data, RSAEncryptionPadding padding); ++ public override RSAParameters ExportParameters(bool includePrivateParameters); ++ public override void ImportParameters(RSAParameters parameters); ++ public override byte[] SignHash(byte[] hash, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ public override bool VerifyHash(byte[] hash, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ } + public sealed class RSACryptoServiceProvider : RSA, ICspAsymmetricAlgorithm { ++ public override byte[] Decrypt(byte[] data, RSAEncryptionPadding padding); ++ public override byte[] Encrypt(byte[] data, RSAEncryptionPadding padding); ++ public override byte[] SignHash(byte[] hash, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ public override bool VerifyHash(byte[] hash, byte[] signature, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); + } ++ public sealed class RSAEncryptionPadding : IEquatable { ++ public RSAEncryptionPaddingMode Mode { get; } ++ public HashAlgorithmName OaepHashAlgorithm { get; } ++ public static RSAEncryptionPadding OaepSHA1 { get; } ++ public static RSAEncryptionPadding OaepSHA256 { get; } ++ public static RSAEncryptionPadding OaepSHA384 { get; } ++ public static RSAEncryptionPadding OaepSHA512 { get; } ++ public static RSAEncryptionPadding Pkcs1 { get; } ++ public static RSAEncryptionPadding CreateOaep(HashAlgorithmName hashAlgorithm); ++ public override bool Equals(object obj); ++ public bool Equals(RSAEncryptionPadding other); ++ public override int GetHashCode(); ++ public static bool operator ==(RSAEncryptionPadding left, RSAEncryptionPadding right); ++ public static bool operator !=(RSAEncryptionPadding left, RSAEncryptionPadding right); ++ public override string ToString(); ++ } ++ public enum RSAEncryptionPaddingMode { ++ Oaep = 1, ++ Pkcs1 = 0, ++ } ++ public sealed class RSASignaturePadding : IEquatable { ++ public RSASignaturePaddingMode Mode { get; } ++ public static RSASignaturePadding Pkcs1 { get; } ++ public static RSASignaturePadding Pss { get; } ++ public override bool Equals(object obj); ++ public bool Equals(RSASignaturePadding other); ++ public override int GetHashCode(); ++ public static bool operator ==(RSASignaturePadding left, RSASignaturePadding right); ++ public static bool operator !=(RSASignaturePadding left, RSASignaturePadding right); ++ public override string ToString(); ++ } ++ public enum RSASignaturePaddingMode { ++ Pkcs1 = 0, ++ Pss = 1, ++ } + } + namespace System.Security.Cryptography.X509Certificates { ++ public static class RSACertificateExtensions { ++ public static RSA GetRSAPrivateKey(this X509Certificate2 certificate); ++ public static RSA GetRSAPublicKey(this X509Certificate2 certificate); ++ } +- public class X509Certificate : IDeserializationCallback, ISerializable { ++ public class X509Certificate : IDeserializationCallback, IDisposable, ISerializable { ++ public void Dispose(); ++ protected virtual void Dispose(bool disposing); + } +- public class X509Chain { ++ public class X509Chain : IDisposable { ++ public SafeX509ChainHandle SafeHandle { get; } ++ public void Dispose(); ++ protected virtual void Dispose(bool disposing); + } +- public sealed class X509Store { ++ public sealed class X509Store : IDisposable { ++ public void Dispose(); + } + } + namespace System.Security.Cryptography.Xml { + public class EncryptedXml { ++ public int XmlDSigSearchDepth { get; set; } + } + } + namespace System.Security.Principal { + public class WindowsIdentity : ClaimsIdentity, IDeserializationCallback, IDisposable, ISerializable { ++ public SafeAccessTokenHandle AccessToken { get; } ++ public static T RunImpersonated(SafeAccessTokenHandle safeAccessTokenHandle, Func func); ++ public static void RunImpersonated(SafeAccessTokenHandle safeAccessTokenHandle, Action action); + } + } + namespace System.ServiceModel { + public sealed class TcpTransportSecurity { ++ public SslProtocols SslProtocols { get; set; } + } + } + namespace System.ServiceModel.Channels { + public class SslStreamSecurityBindingElement : StreamUpgradeBindingElement, IPolicyExportExtension, ITransportTokenAssertionProvider { ++ public SslProtocols SslProtocols { get; set; } + } + } + namespace System.ServiceModel.Configuration { + public sealed class SslStreamSecurityElement : BindingElementExtensionElement { ++ public SslProtocols SslProtocols { get; private set; } + } + public sealed class TcpTransportSecurityElement : ServiceModelConfigurationElement { ++ public SslProtocols SslProtocols { get; private set; } + } + } + namespace System.Text { + public abstract class Encoding : ICloneable { ++ protected Encoding(int codePage, EncoderFallback encoderFallback, DecoderFallback decoderFallback); ++ public unsafe string GetString(byte* bytes, int byteCount); ++ public static void RegisterProvider(EncodingProvider provider); + } ++ public abstract class EncodingProvider { ++ public EncodingProvider(); ++ public abstract Encoding GetEncoding(int codepage); ++ public virtual Encoding GetEncoding(int codepage, EncoderFallback encoderFallback, DecoderFallback decoderFallback); ++ public abstract Encoding GetEncoding(string name); ++ public virtual Encoding GetEncoding(string name, EncoderFallback encoderFallback, DecoderFallback decoderFallback); ++ } + public sealed class StringBuilder : ISerializable { ++ public unsafe StringBuilder Append(char* value, int valueCount); ++ public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0); ++ public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0, object arg1); ++ public StringBuilder AppendFormat(IFormatProvider provider, string format, object arg0, object arg1, object arg2); + } + } + namespace System.Threading { ++ public sealed class AsyncLocal : IAsyncLocal { ++ public AsyncLocal(); ++ public AsyncLocal(Action> valueChangedHandler); ++ public T Value { get; set; } ++ } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct AsyncLocalValueChangedArgs { ++ public T CurrentValue { get; private set; } ++ public T PreviousValue { get; private set; } ++ public bool ThreadContextChanged { get; private set; } ++ } ++ public static class WaitHandleExtensions { ++ public static SafeWaitHandle GetSafeWaitHandle(this WaitHandle waitHandle); ++ public static void SetSafeWaitHandle(this WaitHandle waitHandle, SafeWaitHandle value); ++ } + } + namespace System.Threading.Tasks { + public class Task : IAsyncResult, IDisposable, IThreadPoolWorkItem { ++ public static Task CompletedTask { get; } ++ public static Task FromCanceled(CancellationToken cancellationToken); ++ public static Task FromCanceled(CancellationToken cancellationToken); ++ public static Task FromException(Exception exception); ++ public static Task FromException(Exception exception); + } + public class TaskCompletionSource { ++ public bool TrySetCanceled(CancellationToken cancellationToken); + } + public enum TaskContinuationOptions { ++ RunContinuationsAsynchronously = 64, + } + public enum TaskCreationOptions { ++ RunContinuationsAsynchronously = 64, + } + } + namespace System.Web { + public sealed class HttpRequest { ++ public ITlsTokenBindingInfo TlsTokenBindingInfo { get; } + } + public abstract class HttpRequestBase { ++ public virtual ITlsTokenBindingInfo TlsTokenBindingInfo { get; } + } + public class HttpRequestWrapper : HttpRequestBase { ++ public override ITlsTokenBindingInfo TlsTokenBindingInfo { get; } + } + public sealed class HttpResponse { ++ public Task FlushAsync(); ++ public void PushPromise(string path); ++ public void PushPromise(string path, string method, NameValueCollection headers); + } + public abstract class HttpResponseBase { ++ public virtual Task FlushAsync(); ++ public virtual void PushPromise(string path); ++ public virtual void PushPromise(string path, string method, NameValueCollection headers); + } + public class HttpResponseWrapper : HttpResponseBase { ++ public override Task FlushAsync(); ++ public override void PushPromise(string path); ++ public override void PushPromise(string path, string method, NameValueCollection headers); + } ++ public interface ITlsTokenBindingInfo { ++ byte[] GetProvidedTokenBindingId(); ++ byte[] GetReferredTokenBindingId(); ++ } + } + namespace System.Web.UI.WebControls { + public class ModelDataSourceView : DataSourceView, IStateManager { ++ public override void Delete(IDictionary keys, IDictionary oldValues, DataSourceViewOperationCallback callback); ++ public override void Insert(IDictionary values, DataSourceViewOperationCallback callback); ++ public override void Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback); ++ public override void Update(IDictionary keys, IDictionary values, IDictionary oldValues, DataSourceViewOperationCallback callback); + } ++ public sealed class SelectResult { ++ public SelectResult(int totalRowCount, IEnumerable results); ++ public IEnumerable Results { get; private set; } ++ public int TotalRowCount { get; private set; } ++ } + } + namespace System.Windows { + public static class CoreCompatibilityPreferences { ++ public static Nullable EnableMultiMonitorDisplayClipping { get; set; } + } + } ++namespace System.Windows.Diagnostics { ++ public static class VisualDiagnostics { ++ public static XamlSourceInfo GetXamlSourceInfo(object obj); ++ public static event EventHandler VisualTreeChanged; ++ } ++ public class VisualTreeChangeEventArgs : EventArgs { ++ public VisualTreeChangeEventArgs(DependencyObject parent, DependencyObject child, int childIndex, VisualTreeChangeType changeType); ++ public VisualTreeChangeType ChangeType { get; private set; } ++ public DependencyObject Child { get; private set; } ++ public int ChildIndex { get; private set; } ++ public DependencyObject Parent { get; private set; } ++ } ++ public enum VisualTreeChangeType { ++ Add = 0, ++ Remove = 1, ++ } ++ public class XamlSourceInfo { ++ public XamlSourceInfo(Uri sourceUri, int lineNumber, int linePosition); ++ public int LineNumber { get; private set; } ++ public int LinePosition { get; private set; } ++ public Uri SourceUri { get; private set; } ++ } ++} + namespace System.Windows.Forms { + public class MonthCalendar : Control { ++ protected override void DefWndProc(ref Message m); + } + } + namespace System.Windows.Input { + public sealed class Cursor : IDisposable { ++ public Cursor(Stream cursorStream, bool scaleWithDpi); ++ public Cursor(string cursorFile, bool scaleWithDpi); + } + public sealed class StylusDevice : InputDevice { ++ public bool IsValid { get; } + } + } + namespace System.Windows.Interop { + [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] + public struct HwndSourceParameters { ++ public bool UsesPerPixelTransparency { get; set; } + } + } + namespace System.Xaml { + public class XamlObjectEventArgs : EventArgs { ++ public int ElementLineNumber { get; private set; } ++ public int ElementLinePosition { get; private set; } ++ public Uri SourceBamlUri { get; private set; } + } + } + namespace System.Xml { + public class XmlCDataSection : XmlCharacterData { ++ public override XmlNode PreviousText { get; } + } + public abstract class XmlNode : ICloneable, IEnumerable, IXPathNavigable { ++ public virtual XmlNode PreviousText { get; } + } + public class XmlSignificantWhitespace : XmlCharacterData { ++ public override XmlNode PreviousText { get; } + } + public class XmlText : XmlCharacterData { ++ public override XmlNode PreviousText { get; } + } + public class XmlWhitespace : XmlCharacterData { ++ public override XmlNode PreviousText { get; } + } + } + namespace Microsoft.Win32 { + public sealed class RegistryKey : MarshalByRefObject, IDisposable { ++ public RegistryKey CreateSubKey(string subkey, bool writable); ++ public RegistryKey CreateSubKey(string subkey, bool writable, RegistryOptions options); ++ public RegistryKey OpenSubKey(string name, RegistryRights rights); + } + } + namespace Microsoft.Win32.SafeHandles { ++ public sealed class SafeAccessTokenHandle : SafeHandle { ++ public SafeAccessTokenHandle(IntPtr handle); ++ public static SafeAccessTokenHandle InvalidHandle { get; } ++ public override bool IsInvalid { get; } ++ } ++ public sealed class SafeProcessHandle : SafeHandleZeroOrMinusOneIsInvalid { ++ public SafeProcessHandle(IntPtr existingHandle, bool ownsHandle); ++ } ++ public sealed class SafeX509ChainHandle : SafeHandleZeroOrMinusOneIsInvalid { ++ } + } +``` diff --git a/releases/net46/dotnet46-changes.md b/releases/net46/dotnet46-changes.md new file mode 100644 index 000000000..d269fc388 --- /dev/null +++ b/releases/net46/dotnet46-changes.md @@ -0,0 +1,288 @@ +.NET Framework 4.6 Release Notes +================================ + +.NET Framework release notes describe product improvements grouped by product area. Each change includes a Microsoft-internal VSTS bug number, which acts as a useful unique ID for each change (can be used to report issues or when calling Microsoft Support). + +Post-release servicing updates are also included, appended to the end of each product area. The following servicing updates have been included: + +- [May 2017](https://blogs.msdn.microsoft.com/dotnet/2017/05/17/net-framework-may-2017-preview-of-quality-rollup/) + +## ASP.NET + +* State Service startup type is correctly persisted. [1038077] +* Registry settings preserved during upgrade. [1038147] +* Medium trust in ASP.NET 4.5 application doesn't cause execution permission exception. [1038337] +* WebForm_DoCallback XHR doesn't break IDN support. [1040710] +* .NET quirks and compatibility switches can be specified in ASP.NET configuration file. [1041102] +* SignalR memory leak fixed. [1042247] +* Quirks can be activated from ASP.NET even when a TFM is not specified. [1068433] +* Membership UpdateUser and UpdateUserInfo don't cause SQL deadlock. [1131099] +* Handles aborted XmlHttpRequest correctly. [983362] +* ASP.NET allows config settings changes to affect CLR initialization. [994276] +* HttpEncoder.UrlPathEncode doesn't encode the IDN part of the URL. [995259] +* WebUIValidation.js correctly mapped on WebDev.WebServer 4.5.3. [998958] +* Background flushes don't cause pipeline corruptions when using the TAP-friendly synchronization context. [1020085] +* ASP.NET recognizes Edge browser. [1031688] +* Databinding methods can be used in async binding. [1082492] +* Removed a contention in System.Web.BufferAllocator. [1084913] +* Setting request headers doesn't initialize ServerVariables. [1085748] +* Fixed a crash in IIS Manager when opening content view. [1093488] +* New web site template doesn't cause warnings. [1099514] +* Browsing to an asmx file or wsdl with an IDN binding set in IIS doesn't cause a URI parsing exception. [110223] +* Request validation can be completely disabled in an application. [412689] +* EmailAddress attribute can load error message from resource. [468241] +* GridView.CreateChildControl returns the correct CreatedRowCount when CustomPaging is enabled. [782891] +* Custom output cache providers don't cause exception on cache policy settings serialization when more than one invalidation handler is present. [789904] +* VaryByContentEncoding is now case-insensitive. [830641] +* HttpContextWrapper.IsPostNotification returns the correct value based on pipeline event. [839206] +* HtmlTextWriter renders
element as self-closing tag. [852940] +* Posting invalid payload to ASP.NET with trace and 4.0 request validation enabled doesn't crash the worker process. [867196] +* MemoryCache doesn't throw null reference expression when CacheItemPolicy.UpdateCallback is defined. [879799] +* DiskBuildResultCache.CacheBuildResult has a null check for CompiledResult.ResultAssembly. [880034] +* ContentDisposition constructor doesn't modify date values of the provided disposition string. [884362] +* Calling MachineKey.Decode on ASP.NET application start or on first request doesn't throw null reference exception. [896595] +* MemoryCache Trim method evicts all items. [902234] +* Overloads of HttpUtility.UrlEncode and UrlEncodeToBytes taking (byte[] bytes, int offset, int count) respects the offset and count parameter values. [912606] +* Setting culture to auto:* in web.config doesn't cause CultureNotFoundException. [714999] + +## BCL + +* Projected DirectX value types can be marshalled to WinRT. [1166515] +* New WeakReference() doesn't cause COMException. [973791] +* Persian calendar is a supported formatting calendar, correctly handles part of day formatting, and uses correct era names. [1068336], [1117304], [1154104], [1087763] +* DateTime Parse and TryParse behave the same on en-CA culture. [1117950] +* AAD has integrated check for the pooled connection. [1118488] +* French and Norwegian culture display name includes proper Unicode characters. [1147042] +* ConcurrentDictionary serialization format changed, but is upwards compatible from .NET Framework 4.5 to .NET Framework 4.6. [1167398] +* SqlBulkCopy truncates data before encrypting. [1159595] +* GetProviderSpecificValue returns proper data type for encrypted columns when underlying data is null. [1159595] +* French and Norwegian culture display name includes proper Unicode characters. [1147042] +* X509Certificate2 supports Cng key pairs. [1158068], [1129677] +* GDI+ reentrant paint operations fixed. [1075715] +* System.Diagnostics.ProcessStartInfo can be deserialized. [1076704] +* Culture resources added for newly supported Windows cultures. [1038210] +* Current culture and UI culture travel through async calls. [1038253] +* new TaskCompletionSource(null, TaskCreationOptions.RunContinuationsAsynchronously) doesn't throw ArgumentOutOfRangeException. [1042823] +* WebSockets server doesn't cause false positive AccessViolation exceptions. [1064642] +* FrameworkEventSource doesn't crash on Windows 7. [1067139] +* EventSource.DecodeObject doesn't cause a crash on application launch. [1070394] +* GetCurrentProcess() doesn't throw a SecurityException in a partial trust component. [1071695] +* TimeZoneInfo correctly handles start and end of year transitions. [1072355] +* Connections made using SPN in managed code don't fail with index out of range exception. [1120248] +* XSD schema validation detects violation of unique constraint if compound key is used and one is empty. [1122756] +* SqlSessionStateStore logs exception details when partition resolver is used. [1123428] +* XsdDataContractImporter.Import method doesn't throw InvalidDataContractException when CanImport method returns true. [1124661] +* RangeCheck enforces practical limits in order to avoid stack overflow. [1127981] +* NetTcp with X509 certificates using SslStream allow negotiation for more secure cipher suites. [1128085] +* TrustManager doesn't cause false warnings when comparing certificates. [1134066] +* SqlBulkCopy works with TCE enabled columns. [1134668] +* System.Runtime.Serialization.Primitives expose new public read-only properties for previously internal data contract attributes. [1136078] +* Attribute.GetCustomAttributes doesn't throw AmbiguousMatchException when parameter types can disambiguate. [976721] +* WinRtToNetFxStreamAdapter implements SetLength correctly. [977936] +* Improved performance of System.IO.Path.GetFullPath and NormalizePath. [989059], [989062] +* Improved performance of System.Version.ToString and TryParseVersion. [989081], [989086] +* Security attributes added to Microsoft.JScriptEngine [991436] +* ControlVersionInfo.ProductVersion doesn't throw null reference exception. [997521] +* Encoding.GetEncoding gives clues about failure causes. [997703] +* Introduced 1, 2, and 3-argument overloads of String.Format with IFormatProvider first argument to improve performance. [999405] +* MemoryCache.AddOrGetExisting() checks the right expiration date. [999957] +* Exception.Data on Windows 8 includes IRestrictedErrorInfo information. [1000662] +* ReflectionModelServices.IsExportFactoryImportDefinition doesn't throw ArgumentException. [1005218] +* Private GetRuntimeResourceString method added back to maintain compatibility of CompositeC1 CMS. [1005727] +* AppDomainSetup.DynamicBase supported with UseRandomizedStringHashAlgorithm. [1008953] +* Win32Exception shows a generic error message for messages longer than 256 characters. [1013367] +* PreAuthenticate cache is effective beyond 100 URLs. [1014364] +* CngKey members such as IsEphemeral don't throw CryptographicException on unsupported properties. [1014482] +* Removed contention at BufferOutputAsyncStream for self-hosted WCF restful service using transfermode as Streamed. [1015747] +* Added Array.Empty() to help avoid unnecessary allocations. [1020141] +* HttpWebRequest succeeds when used with tracing against HTTPS endpoints with elliptic curve cryptography. [1020499] +* JIT array of Single not initialized with Double values. [1027378] +* Parallel.Invoke with one delegate executes on the current thread instead of queueing the work. [1027413] +* SortOption uses the SortDirection passed in the constructor. [1030167] +* Fixed timezone conversion in cases when year start or end with daylight savings wasn't correctly handled. [1079914] +* Fixed AssemblyInformationalVersion. [1082536] +* Fixed serialization and de-serialization of DateTime with daylight savings and special values. [1087198] +* IO exceptions moved to System.Runtime. [1090978] +* CultureInfo.CurrentCulture setter works in APPX mode. [1091999] +* ParameterBuilder.SetConstant(null) doesn't throw argument exception for a nullable value type's default value. [1098429] +* GetClassLayout can be called from rejit instrumentation. [1101065] +* GetTypeForTypeID doesn't lock exe of the process being debugged. [1101402] +* Euro is now the currency for Lithuania. [1102772] +* Idnhost property of Uri class is now public. [1103357] +* Fixed issues from initial use of EventSource's activity tracing capability. [1103452] +* Fixed SqlHierarchyId operation failure due to invalid binary string. [1106619] +* ToolboxItem.Equals optimized. [1106966] +* Removed AppVerifier false positives in ISAPI mode. [1108193] +* SQL connection strings greater than 779 characters don't cause application crash. [1109784] +* Improved debuggability when users create incorrect EventSources. [1109972] +* AsyncLocal.Value doesn't lose value when ExecutionContext is modified inside an async method. [1111403] +* Removed unused BinaryCompatibility.TargetsAtLeast_Desktop_v4_5_3 from System.Diagnostics.Eventing.EventSource and System.Xml. [1111861] +* SqlException can be caught. [1112280] +* System.Windows.Diagnostics.VisualDiagnostics.GetXamlSourceInfo supports non-DependencyObjects. [1116127] +* CancellationToken.Register doesn't throw ObjectDisposedException when its CancellationTokenSource is disposed. [369196] +* System.IO.Path performance improved by not boxing characters and then calling ToString. [467858] +* Subdomain cookies are correctly handled by CookieContainer. [520819] +* Decimal parsing can handle [-]0eN where N > 0. [568475] +* Fixed Lybian time zone daylight savings initial transition. [698652] +* Made BinaryCompatibility internal. [808512] +* Fixed InvalidDataException when using ZipArchive.GetEntry. [823402] +* Improved performance of System.Guid.ToString by using fast string allocation instead of new char[]. [825882] +* System.Threading.Gen2GcCallback finalizer checks for uninitialized GCHandle before using it. [837365] +* Fixed four unlocalized strings in DAN and JPN cultures. [840067] +* XmlEncodeRawTextWriter and XmlUTF8RawTextWriter are checking for invalid surrogate pairs correctly. [851030] +* Implemented public static unsafe Buffer.MemoryCopy. [862315] +* Improved performance of String.Format and StringBuilder.AppendFormat by avoiding object array allocations. [915876] +* Removed a bottleneck in System.ComponentModel.DataAnnotations.ValidationAttribute.IsValid by removing a lock. [921828] +* DpapiDataProtector doesn't fail because of SHA256.Create() when FIPS compliance is mandatory. [923431] +* Improved System.Design!System.ComponentModel.MenuCommandService.FindCommand by avoiding the boxing of Guids. [925312] +* Eliminated implicit allocationof WaitCallback objects by caching the delegate in a static field. [925992] +* Eliminated a hang in HttpClient when an exception is thrown during BeginRequestStream. [926740] +* Unix date time strings are now supported through DateTimeOffset.FromUnixTimeSeconds, FromUnixTimeMilliseconds, and ToUnixTimeMilliseconds. [933584] +* Improved performance by using StringBuilderCache in Environment.GetEnvironmentVariable. [934009] +* Fixed ArgumentOutOfRangeException in IPAddress.MapToIPv4(). [944709] +* Read-only interfaces are implemented on collection types HashSet, LinkedList, Queue, SortedDictionary, SortedList, SortedSet, and Stack. [944715] +* AddOnSendingHeaders doesn't fire prematurely. [952802] +* EventSource doesn't aggressively fail when using reserved keywords. [955350] +* Eliminated a leak when calling IReflect.InvokeMemberon a native IDispatchEX implementation through IReflect or IExpando. [957933] +* IsolatedStorage feature works when configured to place storage on roaming profiles. [961127] +* Text encoding is extensible. [963034] +* Fixed the size of Vector. [1020874] +* System.Drawing.Icon.ToBitmap() supports PNG framed icons. [1084802] +* Uri constructor doesn't throw ArgumentOutOfRangeException when parsing certain URIs with escaped international characters. [1173958] +* When using RSACng (or another class which directly or indirectly uses RSACng) to perform encryption using RSAEncryptionPadding.Pkcs1 when the private key is stored on a smartcard (or other hardware security module) an exception of System.Security.Cryptography.CryptographicException: The parameter is incorrect. at System.Security.Cryptography.NCryptNative.DecryptData[T](SafeNCryptKeyHandle key, Byte[] data, T& paddingInfo, AsymmetricPaddingMode paddingMode, NCryptDecryptor`1 decryptor) [299303] [Added: May 2017] + +## CLR + +* AppContext values can be overridden by registry settings. [1076165] +* Asmx service references can be added to store apps. [1078198] +* CrossGen and NGen create identical System.Core native images. [1033601] +* ICorProfilerCallback6 doesn't leak reference count. [1038285] +* Loading design-time metadata at debug time for universal Windows apps is supported. [1038300] +* Multi-core JIT doesn't deadlock from loop of structs and hang Visual Studio. [1043199] +* ICorDebug heap enumeration doesn't skip objects. [1063297] +* WinMDExp/CCI allow reading record kind 0x5/0x6. [1073349] +* ETW tracing for WebRequest works reliably when garbage collection happens. [1136690] +* Fixed a deadlock in case of StackOverflow. [1138065] +* Improved performance reading from the redirected output stream. [997190] +* Product version is correct in binaries' properties. [997577] +* RyuJIT is on by default. [10175592], [1020209] +* Only one GC/Start ETW event is triggered for each GC. [1020142] +* Fixed issue with wrong processor architecture being recorded on non-GAC assemblies, causing them to fail loading. [1020167] +* No opportunistic tail calls when there are pinned variables. [1020867] +* RyuJIT correctly handles edit and continue on instance synchronized methods. [1020967] +* Fixed x64 JIT assignment to struct, where LHS also appears on RHS. [1021056] +* CLR checks assembly architecture when skip IL loading feature is enabled. [1024293] +* Native images generated by CrossGen for .NET Framework have processor architecture data. [1028975] +* CLR emits all versions of the ModuleLoad/ModuleUnload ETW events. [1029164] +* Future DFL and FFL handled. [1030154] +* Unresolvable SID in SDSAM handled. [1030161] +* Crossgen / ReadyToRun images are treated as IL by CLR. [1084749] +* Fixed a RyuJIT regression causing System.Web.HttpApplication.ExecuteStep to incorrectly handle exceptions associated with redirections. [1088278] +* Setup doesn't disable CAPI2 event logs. [1090378] +* WindowsBase uses C# exception filters. [1090886] +* Libraries can define switches without modifying mscorlib. [1092007] +* No GC regions can be specified. [1096946] +* Fixed lock ordering violation between rejit lock and ETW rundown. [1104691] +* NGen compresses native images on devices with limited amount of disk space. [1107517] +* TargetFrameworkAttribute is not always null for non-default AppDomains. [430136] +* Sos.dll dumpheap reports correct TotalSize. [484532] +* Lc.exe can handle response files. [621761] +* MixedMode debugging a Windows Store C# application that calls a C++/CX WinRT component doesn't cause and access violation. [764121] +* Fixed access violation caused by WinRT class names without namespace. [738932] +* Fixed breaking change in COR_PRF_GC_ROOT_HANDLE values. [800872] +* Improved free list efficiency in Gen2 garbage collection. [841334] +* Made heap_of less expensive for server GC. [896400] +* GC datastructure isn't made unreasonably large when the new segment's address is far from the existing ones (64-bit). [897049] +* Win32Native.MEMORYSTATUSEX is a struct, not a class. [899371] +* Eliminated a deadlock condition in RuntimeResourceSet. [905813] +* _Delegate* also has IDispatch vtable entries for non-generic delegates. [922080] +* Module rundown events are generated before method rundown events, improving performance. [939400] +* CLR returns rejit info after first rejit. [952954] +* Fixed the performance for enums based on primitive integral types other than int while maintaining the roundtrip between 4.0 and 4.5. [965865] +* .NET Framework Setup UI correctly scales controls in high DPI. [968115] +* SIMD types in System.Numerics.dll are recognized by the JIT. [1168471] + +## Entity Framework + +* Entity data source can be configured without causing an exception about the provider not returning a ProviderManifest instance. [810937] + +## WCF + +* Adding a service reference to a class library doesn't cause compilation errors. [1063611] +* CustomBinding honors security header layout mode of Lax / LaxTimeStampLast. [1136398] +* DataContractSerializer doesn't throw InvalidCastException on StringDictionary serialization. [1008489] +* Fixed that WCF friendly instance names limited to 64 characters could cause false duplicates as instance names support up to 128 characters. [1022700] +* Roles.GetRolesForUser() doesn't throw NullReferenceException in a WCF service hosted in ASP.NET with the AspNetCompatibilityEnabled flag set to false. [1022754] +* ProcessMessage31 uses cached delegate for ProcessMessage4. [1030713] +* System.ServiceModel.Syndication.SyndicationFeed can parse . [1088425] +* Client certificate information is added as claim by default. [1103426] +* Warning message added if users enable "wcf:ensureUniquePerformanceCounterInstanceNames" app setting without the user hosting the service having the proper permissions. [1108004] +* Fixed null reference and access violation exceptions in System.ServiceModel.Channels.MessageHeaders.GetBufferedMessageHeaderReaderAtHeaderContents. [1116949] +* WebResponseInputStream doesn't swallow the exception stating that the stream doesn't support read timeouts. [288814] +* Auto-generated help produces correct links. [852865] +* Added a keep-alive timeout on WCF ServiceHost. [948289] +* Fixed a null reference exception in System.Runtime.Serialization when ETW is enabled. [1137758] + +## Windows Forms + +* Icon.ToBitmap() supports PNG framed icons. [1074253] +* Adding large image to resource file doesn't cause error in 300% high DPI mode. [1096726] +* System.Windows.Input.Cursor supports multi-image cursor files. [673619] +* Closing a parent form in MDI applications doesn't throw System.ComponentModel.Win32Exception (Error creating window handle) [847648] +* Fixed a null reference exception when messages continue arriving after a native tooltip window has been disposed. [933930] +* Using custom MessageFilter doesn't cause sporadic IndexOutOfRangeException in ThreadContext. [1072924] +* WIT grid's sorting arrows scale for high DPI. [745286] +* NumericUpDown scroll buttons scale for high DPI. [906184] + +## Workflow + +* WorkflowService design-time validation can be cancelled. [1162560] +* ActivityExecutor.OnExecuteWorkItem has improved performance on RyuJIT. [1136333], [1136377] +* Improvements to out-of-sequence calls in WF State Machine [1018947] +* Added synchronization to DynamicModuleManager to prevent debugger from crashing the debugged application. [1112002] +* Default TransactionException extended to include the distributed transaction ID in error message. [954268] +* Workflow Foundation implementation for SQL better handles transient database errors. [1152472] + +## WPF + +* Selecting a XAML element with an empty start tag doesn't select its first child instead. [1117943] +* Retrieving the font family name for DengXian in WPF doesn't cause an argument exception. [1153238] +* Data grid row headers can be right-clicked without changing the current row selection. [1064465] +* GlyphRun.InkBoundingBox() and FormattedText.Extent return the same values. [1068545] +* RibbonGroup background is not transparent. [1119792], [1119821] +* PrintQueue.GetPrintCapabilities doesn't cause memory leak. [1134697] +* TreeView doesn't scroll to random position when nodes are expanded and collapsed repeatedly. [1137957] +* Running MultipleTopWindows cross AppDomain on Windows 8 and 10 doesn't throw. [1138471] +* Debugging WPF in browser application doesn't cause SecurityException in PresentationFramework.dll. [1145697] +* List virtualization doesn't cause crash in GitHub for Windows. [992770] +* Scrolling in virtualized DataGrid with items of different heights doesn't cause ArgumentNullException. [996725] +* WriteableBitmap isn't causing leaks of CWriteProtectedBitmap virtual memory. [997584] +* Selection doesn't incorrectly include the previously selected item when moving selection of ListBoxItem bound to ObservableCollection. [999613] +* Fixed a UI thread deadlock in pen input code. [1010998] +* Margins set in sections in FlowDocuments are respected. [1104560] +* Scaling doesn't suffer from rounding errors on odd DPI. [1104807] +* Improved thread safety when loading the same XAML resource for the first time in multiple UI threads. [12520] +* Touch and stylus events don't stop firing after disconnecting then reconnecting to a remote desktop session. [659672] +* Fixed a bouncing scrollbar with custom WPF DataTemplate. [759702] +* GetFixedDocumentSequence doesn't throw with error message "UnicodeString property does not contain enough characters to correspond to the contents of Indices property." [796882] +* Fixed slow and jumping WPF TreeView issue. [810163] +* Fixed overflow exception in WPF System.ServiceModel.Channels.TransmissionStrategy.AddToWindow. [811734] +* Fixed InvalidOperationException in multithread application by synchronizing access to the static Stack<> that holds SerializationContext for recycling. [834091] +* Snapping and unsnapping the keyboard on a Surface Pro doesn't cause null reference exception in WPF touch input stack. [839668] +* TreeView doesn't vanish after node collapse and expand. [888530] +* Selected items in a WPF ListBox or ListView control are correct when items.refresh is called from code behind. [945407] +* Fixed performance regression in WPF applications caused by the loading of three additional assemblies. [946388] +* XamlBuildTask doesn't sporadically report error "Object '' has been disconnected or does not exist at the server" on TFS builds. [955825] +* Fixed exception at CaretElement.ConvertToInt32 in WPF TextBox.Focus. [958636] +* WPF uses the most recent distance threshold from the registry for recognizing double taps. [959263] +* WPF allows for transparent child windows. [959266] +* Fixed FlowDocument exception "this TextNavigator has no scoping text element." [960678] +* FlowDocument preserves spaces after being saved using XamlWrite. [960699] +* Improved UI scrolling when using a virtualized ListView with a pixel scroll unit. [965665] +* Fixed null reference exceptions in WPF System.Windows.Controls.ItemContainerGenerator.ContainerFromIndex. [966623] +* Improved touch services. [971187] +* Fixed RichTextBox spell checking issue with possessives. [1170165] +* Window chrome doesn't turn black on maximize with GlassFrameThickness -1. [1176703] +* Improved RichTextBox typing performance on low-end GPUs. [1177602] +* Applications continue to promote touch events to click after digitizer is removed and reconnected while touching the digitizer. [1186170] +* A WPF application with a virtualizing list control (ListBox, DataGrid, TreeView, etc.) can encounter an ArgumentNullException when scrolling to an item whose size has substantially decreased since the last time it was re-virtualized. [273803, 282662, 282664, 367282, 367285] [Added: May 2017] diff --git a/releases/net461/README.md b/releases/net461/README.md new file mode 100644 index 000000000..b309362a6 --- /dev/null +++ b/releases/net461/README.md @@ -0,0 +1,22 @@ +# .NET Framework 4.6.1 Release Notes + +You can learn about the changes made in the .NET Framework 4.6.1. + +- [Download](http://go.microsoft.com/fwlink/?LinkId=671729) +- [.NET Framework 4.6.1 announcement blog post](https://blogs.msdn.microsoft.com/dotnet/2015/11/30/net-framework-4-6-1-is-now-available/) +- [What's new in the .NET Framework 4.6.1](https://docs.microsoft.com/dotnet/articles/framework/whats-new/index#v461) +- [Release notes](dotnet461-changes.md) +- [Application compatibility](../../Documentation/compatibility/README.md#net-framework-461) +- [API changes](dotnet461-api-changes.md) +- [Reference Source](https://github.com/Microsoft/referencesource/commit/e458f8df6ded689323d4bd1a2a725ad32668aaec) +- [Known issues](https://support.microsoft.com/en-us/help/3102432/known-issues-for-the-.net-framework-4.6.1) + +# Release Notes by Product Area + +- [ASP.NET](dotnet461-changes.md#aspnet) +- [BCL](dotnet461-changes.md#bcl) +- [CLR](dotnet461-changes.md#clr) +- [WCF](dotnet461-changes.md#wcf) +- [Windows Forms](dotnet461-changes.md#windows-forms) +- [Workflow](dotnet461-changes.md#workflow) +- [WPF](dotnet461-changes.md#wpf) diff --git a/releases/net461/dotnet461-api-changes.md b/releases/net461/dotnet461-api-changes.md new file mode 100644 index 000000000..16329957b --- /dev/null +++ b/releases/net461/dotnet461-api-changes.md @@ -0,0 +1,134 @@ +```diff +---C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6 ++++C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1 + namespace System.ComponentModel.DataAnnotations { + public class RegularExpressionAttribute : ValidationAttribute { ++ public int MatchTimeoutInMilliseconds { get; set; } + } + } + namespace System.Data.SqlClient { + public enum SqlBulkCopyOptions { ++ AllowEncryptedValueModifications = 64, + } + public sealed class SqlColumnEncryptionCertificateStoreProvider : SqlColumnEncryptionKeyStoreProvider { ++ public const string ProviderName = "MSSQL_CERTIFICATE_STORE"; + } ++ public class SqlColumnEncryptionCngProvider : SqlColumnEncryptionKeyStoreProvider { ++ public const string ProviderName = "MSSQL_CNG_STORE"; ++ public SqlColumnEncryptionCngProvider(); ++ public override byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] encryptedColumnEncryptionKey); ++ public override byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey); + } ++ public class SqlColumnEncryptionCspProvider : SqlColumnEncryptionKeyStoreProvider { ++ public const string ProviderName = "MSSQL_CSP_PROVIDER"; ++ public SqlColumnEncryptionCspProvider(); ++ public override byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] encryptedColumnEncryptionKey); ++ public override byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey); + } + public sealed class SqlConnectionStringBuilder : DbConnectionStringBuilder { ++ public bool TransparentNetworkIPResolution { get; set; } + } + } + namespace System.Diagnostics { + public sealed class ProcessStartInfo { ++ public string PasswordInClearText { get; set; } + } + } + namespace System.Drawing.Design { + public class ToolboxItem : ISerializable { ++ public Bitmap OriginalBitmap { get; set; } + } + } + namespace System.Net { + public abstract class TransportContext { ++ public virtual IEnumerable GetTlsTokenBindings(); + } + } + namespace System.Security.Authentication.ExtendedProtection { ++ public class TokenBinding { ++ public TokenBindingType BindingType { get; } ++ public byte[] GetRawTokenBindingId(); + } ++ public enum TokenBindingType { ++ Provided = 0, ++ Referred = 1, + } + } + namespace System.Security.Cryptography { + public abstract class ECDsa : AsymmetricAlgorithm { ++ protected virtual byte[] HashData(byte[] data, int offset, int count, HashAlgorithmName hashAlgorithm); ++ protected virtual byte[] HashData(Stream data, HashAlgorithmName hashAlgorithm); ++ public virtual byte[] SignData(byte[] data, int offset, int count, HashAlgorithmName hashAlgorithm); ++ public virtual byte[] SignData(byte[] data, HashAlgorithmName hashAlgorithm); ++ public virtual byte[] SignData(Stream data, HashAlgorithmName hashAlgorithm); ++ public bool VerifyData(byte[] data, byte[] signature, HashAlgorithmName hashAlgorithm); ++ public virtual bool VerifyData(byte[] data, int offset, int count, byte[] signature, HashAlgorithmName hashAlgorithm); ++ public bool VerifyData(Stream data, byte[] signature, HashAlgorithmName hashAlgorithm); + } + public sealed class ECDsaCng : ECDsa { ++ protected override byte[] HashData(byte[] data, int offset, int count, HashAlgorithmName hashAlgorithm); ++ protected override byte[] HashData(Stream data, HashAlgorithmName hashAlgorithm); + } + } + namespace System.Security.Cryptography.X509Certificates { ++ public static class ECDsaCertificateExtensions { ++ public static ECDsa GetECDsaPrivateKey(this X509Certificate2 certificate); ++ public static ECDsa GetECDsaPublicKey(this X509Certificate2 certificate); + } + public enum X509ChainStatusFlags { ++ ExplicitDistrust = 67108864, ++ HasNotSupportedCriticalExtension = 134217728, ++ HasWeakSignature = 1048576, + } + } + namespace System.ServiceProcess { + public class ServiceController : Component { ++ public ServiceStartMode StartType { get; } + } + public enum ServiceStartMode { ++ Boot = 0, ++ System = 1, + } + } + namespace System.Transactions { + public class Transaction : IDisposable, ISerializable { ++ public Guid PromoterType { get; } ++ public bool EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Guid promoterType); ++ public byte[] GetPromotedToken(); ++ public void SetDistributedTransactionIdentifier(IPromotableSinglePhaseNotification promotableNotification, Guid distributedTransactionIdentifier); + } + public static class TransactionInterop { ++ public static readonly Guid PromoterTypeDtc; + } + } + namespace System.Web.Security { + public class MembershipPasswordAttribute : ValidationAttribute { ++ public Nullable PasswordStrengthRegexTimeout { get; set; } + } + } + namespace System.Web.UI.WebControls { + public class RegularExpressionValidator : BaseValidator { ++ public Nullable MatchTimeout { get; set; } + } + } + namespace System.Windows { + public sealed class TextDecorationCollection : Animatable, ICollection, ICollection, IEnumerable, IEnumerable, IList, IList { ++ public bool TryRemove(IEnumerable textDecorations, out TextDecorationCollection result); + } + } + namespace System.Windows.Controls { + public class ScrollViewer : ContentControl { ++ protected override void OnStylusSystemGesture(StylusSystemGestureEventArgs e); + } + } + namespace System.Windows.Forms { + public class TextBox : TextBoxBase { ++ protected override bool ProcessCmdKey(ref Message m, Keys keyData); + } + } + namespace System.Xaml { + public class XamlObjectWriterSettings : XamlWriterSettings { ++ public Uri SourceBamlUri { get; set; } + } + } +``` \ No newline at end of file diff --git a/releases/net461/dotnet461-changes.md b/releases/net461/dotnet461-changes.md new file mode 100644 index 000000000..3e25b2e2d --- /dev/null +++ b/releases/net461/dotnet461-changes.md @@ -0,0 +1,194 @@ +.NET Framework 4.6.1 Release Notes +================================== + +.NET Framework release notes describe product improvements grouped by product area. Each change includes a Microsoft-internal VSTS bug number, which acts as a useful unique ID for each change (can be used to report issues or when calling Microsoft Support). + +Post-release servicing updates are also included, appended to the end of each product area. The following servicing updates have been included: + +- [May 2017](https://blogs.msdn.microsoft.com/dotnet/2017/05/17/net-framework-may-2017-preview-of-quality-rollup/) + +## ASP.NET + +* TreeNode.ImageTooltip is rendered as title attribute [101518] +* Access to WebAdminFiles re-enabled [144513] +* Fixed 4.6 regression in DataBoundControl.PerformSelect() [145931] +* MaintainScrollPositionOnPostBack works with zoom on Chrome [120243] +* RegEx can be opted out for EmailAddresses, Phone, and URL attributes [142685] +* Added a MatchTimeout property to RegularExpressionAttribute [142685] +* In the following scenarios, ASP.NET may duplicate the cookie in response headers: + - Before a request cookie is loaded, the response cookie is added. + - A response cookie is added, and then a native module sets the response cookie. + + With the fix, ASP.NET makes sure that response cookies are not duplicated. [359376] [Added: May 2017] + +## BCL + +* System.Diagnostics.Process v4.1.0.0 supported in desktop implementation assemblies [142838] +* System.ServiceProcess.ServiceController exposes a StartType property [145866] +* SqlClient has retry logic for cloud service connection opening [145878] +* SqlClient has improved multi-subnet failover connection behavior for AlwaysOn [117760] +* HttpListener API exposes TlsUnique to support token-binding [141263] +* Enhanced the ECDsa RedZone API [142405] +* No overflow exception when using Level in an EventSourceListener on a Write<T> [94974] +* No null reference exception when calling EventSource.GenerateManifest(Type, string) when an event method name ends with "Stop" [129244] +* Added a timeout to HttpOutput when sending a message [130240] +* More reliable connection of TCP local host with named SQL instance [130340] +* Vector2/3/4.CopyTo throws the right exception when a null array is passed in [131600] +* Vector2/3/4.CopyTo doesn't cause access violation when used with a negative startIndex parameter [142102] +* Vector.CopyTo throws consistent exceptions when running with JIT intrinsics [142413] +* Fixed access violation in Vector.CopyTo on an AVX2 machine [146428] +* Fixed SIMD Vector.Equals on AVX [133633] +* Vector3.Dot doesn't cause access violation when value is not stored [142555] +* Vector4 constructor evaluates argument list left to right [142843] +* Optimized memory usage by HttpListenerAsyncEventArgs [109754] +* Fixed a null reference exception in XML validation [111660] +* AppContext.BaseDirectory is configurable [142857] +* Fixed Serbian culture date parsing issue [144893] +* Fixed Norwegian culture date parsing issue [145872] +* TransparentNetworkIPResolution works with more than 64 IPs in DNS [147652] +* SqlBulkCopy works for data movement from encrypted to plain text nchar columns [149383] +* Transparent network IP resolution works if TCP protocol isn't explicitly defined [149824] +* Enumerating cultures yields both Persian languages [145823] +* An archive created with System.IO.Compression.ZipFile.CreateFromDirectory preserves directory structure when unpacked on OSX [142220] +* SqlClient always encrypted supports hardware-protected keys [116442] +* Added support for Token Binding for server-side usage of HttpListener [119817] +* Uri constructor doesn't throw ArgumentOutOfRangeException when parsing certain URIs with escaped international characters [123235] +* Fixed a bug that prevented some localized text from displaying properly [145634] +* Fixed a bug that caused the Exception Catch event to get the incorrect source line [142525] +* When using RSACng (or another class which directly or indirectly uses RSACng) to perform encryption using RSAEncryptionPadding.Pkcs1 when the private key is stored on a smartcard (or other hardware security module) an exception of System.Security.Cryptography.CryptographicException: The parameter is incorrect. at System.Security.Cryptography.NCryptNative.DecryptData[T](SafeNCryptKeyHandle key, Byte[] data, T& paddingInfo, AsymmetricPaddingMode paddingMode, NCryptDecryptor`1 decryptor) [299303] [Added: May 2017] + +## CLR + +* Ngen emits debug section mapping IL to native [145669] +* ICorProfiler implementations can apply metadata changes during rejit [145801] +* ICorProfilerInfo API gives access to PDB content for dynamic assemblies, so profilers can show source for callstack frames [145817] +* Fixed a x64 JIT bug in exception handling [93398] +* Windows runtime metadata export tool allows for major assembly versions greater than 255 [101784] +* Fixed out of order execution caused by byte packed class optimization [114744] +* CLR writes inner exception information to event log for unhandled exceptions [119369] +* Access violations are easier to debug [119373] +* Fixed access violation caused by incorrect spill reload of putarg_reg(this) [134106] +* Improved performance in EventSource manifest generation [134302] +* Check for OS AVX support before using AVX instructions [105782] +* Build properly fails when referring to non-generic EventHandler in public surface in managed winmd components [121641] +* Fixed a memory leak in native CLR CBindingInput [121931] +* Fixed a crash on attach/detach with IntelliTrace [141847] +* Windows runtime metadata export tool allows for C# UAP WinRT project to reference a C++ UAP WinRT project that references the mobile extensions SDK [142092] +* Fixed stack overflow in System.Numerics [143951] +* Fixed bad value numbering for pointer math leading to incorrect CSE optimization [143960] +* Fixed RyuJIT back-compat issue [143967] +* Fixed a case where a function could get passed a 2^32-1 parameter value instead of -1L [144065] +* Fixed a crash in dynamic methods using generic value type parameters [145137] +* Fixed a memory leak in mscoreei!RuntimeRequest::ComputeVersionStringThrowing [145389] +* Fixed garbage collection dependent handle ages [145686] +* Fixed exception handling scopes for IL generated by Roslyn [145835] +* Fixed incorrect result with RyuJIT and VS 2013 compiler optimizations turned on [145846] +* Fixed garbage collection access violation in heap expand in corner cases due to slightly off pad ratio [145905] +* Fixed app packaging resource indexer write access violation at mscoreei!ShimUtil::ReadFileVersion [147707] +* Fixed missed cast during binary XOR operation [142659] +* Profiling event listener sees enums as names rather than numbers [142794] +* Fixed optimization that was incorrectly using a register value for a member variable [142798] +* Fixed bad codegen caused by turning on GSCookie check [145632] +* Fixed access violation in Compiler::fgValueNumberBlock while jitting [145643] +* All floating point reg-to-reg moves use movaps instead of movss/sd [145776] +* Added a way to facilitate specifying the ratio of compacting vs sweeping GCs [145709] +* Free list damage count isn't incorrectly overwritten [145712] +* Improved performance of x64 RyuJIT [145718] +* Mitigated "insufficient memory within specified address space range" errors [145720] +* Fixed unnecessary decommit on the ephemeral segment [145768] +* Fixed an access violation in VB Jit32 codegen when accessing an array expanded by ReDim [142485] +* Improved hash function for float and double in value numbering [142492] +* Fixed an incorrect Assertionprop optimization on legacy x86 JIT that changes a negative zero into a positive zero and impacts the 32-bit Roslyn compiler [142253] +* Improved performance of parallel binary file deserialization [141896] +* Fixed an issue with F# applications that target FSharp.Core 3.1 and .NET 4.5.2 causing a FatalExecutionEngineException when deployed to a machine with .NET 4.6 installed [142619] +* Fixed an issue with x64 POINTF structure passing during a tail call [145688] +* Fixed an issue with !sos.heaptat always looking for unrooted information regardless on if the -iu switch is passed [145696] +* EventLog entry displays the exception type and stack trace string in the proper order [145642] +* Fixed a bug that prevented users from using NGen on non-Microsoft signed assemblies [147703] +* X509Certificates now support Elliptic Curve Digital Signature Algorithm (ECDSA) [145702] +* Fixed an issue that caused local variables not to show up in X++ Debugging [145571] +* Fixed RyuJIT optimizer causing incorrect result [110557] + +## WCF + +* ServiceThrottle uses double-checked locking pattern for calls, sessions, and dynamic properties [96934] +* MessageLogger.LogInternal doesn't call TraceXPathNavigator.ToString() [127642] +* ProtocolException RoutingService to net.tcp doesn't reject all requests after end service recycles [142828] +* Better performance on base64 strings with spaces [143785] +* NetHttpBinding handles synchronous callback from WCF service correctly when called via WPF or WinForms app [145832] +* Fixed a w3wp.exe crash when an exception occurs with WCF activity tracing enabled [145636] +* Fixed a performance regression in selected large object variations [141815] +* Binding including message credential over transport allows for messages where the To header is not signed [140756] +* Fixed a null reference exception in System.Runtime.Serialization when ETW is enabled [105266] +* Fixed IdentityModel.Claims to support multiple DNS entries [140718] + +## Windows Forms + +* CTRL+A works in multiline text boxes [145670] +* Vertical scrollbar's Maximum is in sync with DataGridView's total height if the grid is populated while disabled [127329] +* CancelButton or mnemonics respect Control.CausesValidation [144357] +* Fixed a possible index out of range exception in ThreadContext when using custom MessageFilter [145665] +* Fixed a null reference exception in System.Windows.Forms.ToolTip [145763] +* Fixed the Categories name visibility in the Table/Columns Collection Editor when using high contrast scheme [145631] +* Fixed several VisualStudio Designer Crashes [145639], [145710], [145652] +* Fixed the size of the text for the Generating Previews dialog of the PrintPreviewControl from being cropped when scaling up to 500% in HDPI mode [145775] +* Fixed the icons in the toolbox when scaling above 100% [145824] + +## Workflow + +* Sys.Tx APIs enable distributed transactions with a non-MSDTC coordinator [145813] +* A user of EnlistPromotableSinglePhase can promote transactions to a non-MSDTC distributed transaction coordinator [145770, 142891, 142992] +* System.Transaction allows for snapshot isolation for non-MSDTC promoter types [146607] +* Sql implementation handles transient faults properly [113390] + +## WPF + +* Listbox items can be selected by touch on high precision touch panel [141237] +* Underline can be applied after strikethrough [141662] +* Fixed a crash in XAML in Xceed.Wpf.Toolkit [141966] +* ListCollectionView with NewItemPlaceHolderPosition.AtBeginning removes the last element, not the one before it [93418] +* Fixed an app hang case when scrolling [99716] +* SelectedItem property in DataGrid and UI are in sync even when the selected item is off-screen [117243] +* Fixed an exception in System.Windows.Documents.ImmComposition.OnGotFocus [117523] +* Adding an object to the end of a collection causes correct argument to be passed to VirtualizingPanel.OnItemsChanged [130980] +* TextRange.Save using DataFormats.Rtf exports the last block from FlowDocument [131881] +* Fixed leak of ImmComposition objects in System.Windows.Documents.ImmComposition.GetImmComposition [133134] +* Fixed a hang when scrolling TreeView with large indent [141179] +* Calling window.open from WebBrowser control doesn't result in access denied script error [141608] +* Fixed layout when item-scrolling TreeView [122337] +* Adding an item to CompositeCollection doesn't cause ItemsControl.SelectedIndex to incorrectly increment [122826] +* Glyph elements containing alphanumeric characters aren't always printed using MS Sans Serif [142597] +* VisualTreeUtils.AsNonNullVisual doesn't throw argument null exception when scrolling TreeView [142874] +* Virtualizing TreeView doesn't cause it to scroll to random positions when collapsed and expanded [142912] +* Fixed null reference exception from DataGridCellsPanel.HasCorrectRealizedColumns [143791] +* Fixed a crash when deleting content from RichTextBox when a drawing tablet is installed [143800] +* XamlReader.Save doesn't add extra text when using XmlWriterSettings.Indent [147082] +* Printed characters not blurred if the printed XPS file uses transparent colors [147123] +* All items are printed in XPS file using transparent colors [147125] +* Added support for custom dictionaries in spell checking [142722] +* Restored spell checking features on Windows 10 [142577] +* Fixed a deadlock due to reentrancy in property changed handlers [145690] +* Fixed ReadyToRun bugs that affected managed C++ and IL assemblies [145692] +* Xmlns entries in XAML files withoug code behind don't cause usings to be added to the next XAML file compiled [145704] +* Fixed the rendering of certain unicode characters on Windows 10 [145727] +* Eliminated a delay in touch events [143839] +* Improved touch performance when manipulating image [142488] +* Fixed a null reference exception in GridViewHeaderRowPresenter when Columns is set to null during measure [142184] +* WPF doesn't stop promoting touch to click after digitizer is removed and reconnected while touching the digitizer [142019] +* Fixed TextBox argument exception when using some Chinese characters [141693] +* Improved RichTextBox typing performance on low-end GPU [141828] +* Chrome doesn't turn black on maximize on Windows 8.1 when GlassFrameThickness is -1 [124835] +* Fixed a case where a button click event wasn't raised after deactivating the application's window [141633] +* RichTextBox spellcheck corrections don't create double possessives [141660] +* Data binding for elements in a Popup don't get lost [122280] +* DatePicker DisplayDate binding works inside DataGrid, DataTemplate, and ControlTemplate [120278] +* Using the Binding(string) constructor doesn't degrade performance [120967] +* Fixed a memory leak in TreeView [105337] +* Changing IsEnabled for a parent of a TextBlock affects its contents [91119] +* Fixed an issue with partial trust applications running on a machine with a touch device [151160] +* Fixed a bug caused by loading multiple Microsoft Visual Studio Tools for Office (VSTO) addins on touch enabled devices [142484] +* Fixed a bug that caused Visual Studio to hang when saving a XAML file [110669] +* If two WPF applications that target Side by Side (SxS) .NET versions (3.5 and 4.X) are loaded in the same process issues can occur on touch/stylus enabled machines. A common example of this is loading VSTO add-ins written in WPF. This is due to an issue with choosing the correct PenIMC.dll version for each application. This fix allows WPF to properly differentiate between both DLLs and function correctly. [362710] [Added: May 2017] +* If two WPF applications that target Side by Side (SxS) .NET versions (3.5 and 4.X) are loaded in the same process issues can occur on touch/stylus enabled machines. A common example of this is loading VSTO add-ins written in WPF. This is due to an issue with choosing the correct PenIMC.dll version for each application. This fix allows WPF to properly differentiate between both DLLs and function correctly. [377649] [Added: May 2017] +* In some situations, it is possible that WPF attempts to process a touch/stylus input with a null StylusDevice. This can cause a NullReferenceException. This fix checks for this issue and guards against it. [378295] [Added: May 2017] +* A WPF application with a virtualizing list control (ListBox, DataGrid, TreeView, etc.) can encounter an ArgumentNullException when scrolling to an item whose size has substantially decreased since the last time it was re-virtualized. [273803, 282662, 282664, 367282, 367285] [Added: May 2017] diff --git a/releases/net462/README.md b/releases/net462/README.md new file mode 100644 index 000000000..e1a8c67d4 --- /dev/null +++ b/releases/net462/README.md @@ -0,0 +1,26 @@ +# .NET Framework 4.6.2 Release Notes + +You can learn about the changes made in the .NET Framework 4.6.2. + +- [Download](http://go.microsoft.com/fwlink/?LinkId=780597) +- [.NET Framework 4.6.2 announcement blog post](https://blogs.msdn.microsoft.com/dotnet/2016/08/02/announcing-net-framework-4-6-2/) +- [What's new in the .NET Framework 4.6.2](https://docs.microsoft.com/dotnet/articles/framework/whats-new/index#v462) +- [Release notes](dotnet462-changes.md) +- [Application compatibility](../../Documentation/compatibility/README.md#net-framework-462) +- [API changes](dotnet462-api-changes.md) +- [Reference Source](https://github.com/Microsoft/referencesource/commit/1acafe20a789a55daa17aac6bb47d1b0ec04519f) +- [Known issues](https://support.microsoft.com/en-us/help/3151796/known-issues-for-the-.net-framework-4.6.2) + +# Release Notes by Product Area + +- [Active Directory Services](dotnet462-changes.md#active-directory-services) +- [ASP.NET](dotnet462-changes.md#aspnet) +- [BCL](dotnet462-changes.md#bcl) +- [ClickOnce](dotnet462-changes.md#clickonce) +- [CLR](dotnet462-changes.md#clr) +- [Networking](dotnet462-changes.md#networking) +- [SQL](dotnet462-changes.md#sql) +- [WCF](dotnet462-changes.md#wcf) +- [Windows Forms](dotnet462-changes.md#windows-forms) +- [Workflow](dotnet462-changes.md#workflow) +- [WPF](dotnet462-changes.md#wpf) diff --git a/releases/net462/dotnet462-api-changes.md b/releases/net462/dotnet462-api-changes.md new file mode 100644 index 000000000..ee8d8693d --- /dev/null +++ b/releases/net462/dotnet462-api-changes.md @@ -0,0 +1,360 @@ +```diff + namespace System.ComponentModel { + public abstract class GroupDescription : INotifyPropertyChanged { ++ public IComparer CustomSort { get; set; } ++ public SortDescriptionCollection SortDescriptions { get; } ++ public bool ShouldSerializeSortDescriptions(); + } + } + namespace System.Data.SqlClient { ++ public enum PoolBlockingPeriod { ++ AlwaysBlock = 1, ++ Auto = 0, ++ NeverBlock = 2, ++ } + public sealed class SqlConnection : DbConnection, ICloneable { ++ public static TimeSpan ColumnEncryptionKeyCacheTtl { get; set; } ++ public static bool ColumnEncryptionQueryMetadataCacheEnabled { get; set; } + } + public sealed class SqlConnectionStringBuilder : DbConnectionStringBuilder { ++ public PoolBlockingPeriod PoolBlockingPeriod { get; set; } + } + } + namespace System.Diagnostics.Tracing { +- public abstract class EventListener : IDisposable { ++ public class EventListener : IDisposable { +- protected EventListener(); ++ public EventListener(); +- protected internal abstract void OnEventWritten(EventWrittenEventArgs eventData); ++ protected internal virtual void OnEventWritten(EventWrittenEventArgs eventData); ++ public event EventHandler EventSourceCreated; ++ public event EventHandler EventWritten; + } + public class EventSource : IDisposable { ++ public event EventHandler EventCommandExecuted; + } ++ public class EventSourceCreatedEventArgs : EventArgs { ++ public EventSourceCreatedEventArgs(); ++ public EventSource EventSource { get; internal set; } ++ } + } + namespace System.Security.Cryptography { ++ public sealed class AesCng : Aes { ++ public AesCng(); ++ public AesCng(string keyName); ++ public AesCng(string keyName, CngProvider provider); ++ public AesCng(string keyName, CngProvider provider, CngKeyOpenOptions openOptions); ++ public override byte[] Key { get; set; } ++ public override int KeySize { get; set; } ++ public override ICryptoTransform CreateDecryptor(); ++ public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV); ++ public override ICryptoTransform CreateEncryptor(); ++ public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV); ++ public override void GenerateIV(); ++ public override void GenerateKey(); ++ } + public abstract class DSA : AsymmetricAlgorithm { ++ protected virtual byte[] HashData(byte[] data, int offset, int count, HashAlgorithmName hashAlgorithm); ++ protected virtual byte[] HashData(Stream data, HashAlgorithmName hashAlgorithm); ++ public byte[] SignData(byte[] data, HashAlgorithmName hashAlgorithm); ++ public virtual byte[] SignData(byte[] data, int offset, int count, HashAlgorithmName hashAlgorithm); ++ public virtual byte[] SignData(Stream data, HashAlgorithmName hashAlgorithm); ++ public bool VerifyData(byte[] data, byte[] signature, HashAlgorithmName hashAlgorithm); ++ public virtual bool VerifyData(byte[] data, int offset, int count, byte[] signature, HashAlgorithmName hashAlgorithm); ++ public virtual bool VerifyData(Stream data, byte[] signature, HashAlgorithmName hashAlgorithm); + } ++ public sealed class DSACng : DSA { ++ public DSACng(); ++ public DSACng(CngKey key); ++ public DSACng(int keySize); ++ public CngKey Key { get; private set; } ++ public override string KeyExchangeAlgorithm { get; } ++ public override KeySizes[] LegalKeySizes { get; } ++ public override string SignatureAlgorithm { get; } ++ public override byte[] CreateSignature(byte[] rgbHash); ++ public override DSAParameters ExportParameters(bool includePrivateParameters); ++ public override void ImportParameters(DSAParameters parameters); ++ public override bool VerifySignature(byte[] rgbHash, byte[] rgbSignature); ++ } + public abstract class ECDiffieHellman : AsymmetricAlgorithm { ++ public byte[] DeriveKeyFromHash(ECDiffieHellmanPublicKey otherPartyPublicKey, HashAlgorithmName hashAlgorithm); ++ public virtual byte[] DeriveKeyFromHash(ECDiffieHellmanPublicKey otherPartyPublicKey, HashAlgorithmName hashAlgorithm, byte[] secretPrepend, byte[] secretAppend); ++ public byte[] DeriveKeyFromHmac(ECDiffieHellmanPublicKey otherPartyPublicKey, HashAlgorithmName hashAlgorithm, byte[] hmacKey); ++ public virtual byte[] DeriveKeyFromHmac(ECDiffieHellmanPublicKey otherPartyPublicKey, HashAlgorithmName hashAlgorithm, byte[] hmacKey, byte[] secretPrepend, byte[] secretAppend); ++ public virtual byte[] DeriveKeyTls(ECDiffieHellmanPublicKey otherPartyPublicKey, byte[] prfLabel, byte[] prfSeed); + } + public sealed class ECDiffieHellmanCng : ECDiffieHellman { ++ public override byte[] DeriveKeyFromHash(ECDiffieHellmanPublicKey otherPartyPublicKey, HashAlgorithmName hashAlgorithm, byte[] secretPrepend, byte[] secretAppend); ++ public override byte[] DeriveKeyFromHmac(ECDiffieHellmanPublicKey otherPartyPublicKey, HashAlgorithmName hashAlgorithm, byte[] hmacKey, byte[] secretPrepend, byte[] secretAppend); ++ public override byte[] DeriveKeyTls(ECDiffieHellmanPublicKey otherPartyPublicKey, byte[] prfLabel, byte[] prfSeed); + } + public abstract class ECDiffieHellmanPublicKey : IDisposable { +- public abstract string ToXmlString(); ++ public virtual string ToXmlString(); + } ++ public sealed class TripleDESCng : TripleDES { ++ public TripleDESCng(); ++ public TripleDESCng(string keyName); ++ public TripleDESCng(string keyName, CngProvider provider); ++ public TripleDESCng(string keyName, CngProvider provider, CngKeyOpenOptions openOptions); ++ public override byte[] Key { get; set; } ++ public override int KeySize { get; set; } ++ public override ICryptoTransform CreateDecryptor(); ++ public override ICryptoTransform CreateDecryptor(byte[] rgbKey, byte[] rgbIV); ++ public override ICryptoTransform CreateEncryptor(); ++ public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV); ++ public override void GenerateIV(); ++ public override void GenerateKey(); ++ } + } + namespace System.Security.Cryptography.X509Certificates { ++ public static class DSACertificateExtensions { ++ public static DSA GetDSAPrivateKey(this X509Certificate2 certificate); ++ public static DSA GetDSAPublicKey(this X509Certificate2 certificate); ++ } + } + namespace System.Security.Cryptography.Xml { + public class SignedXml { ++ public const string XmlDsigRSASHA256Url = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"; ++ public const string XmlDsigRSASHA384Url = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha384"; ++ public const string XmlDsigRSASHA512Url = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"; ++ public const string XmlDsigSHA256Url = "http://www.w3.org/2001/04/xmlenc#sha256"; ++ public const string XmlDsigSHA384Url = "http://www.w3.org/2001/04/xmldsig-more#sha384"; ++ public const string XmlDsigSHA512Url = "http://www.w3.org/2001/04/xmlenc#sha512"; + } + } +namespace System.Web { + public sealed class HttpCachePolicy { ++ public DateTime UtcTimestampCreated { get; set; } ++ public HttpCacheability GetCacheability(); ++ public string GetCacheExtensions(); ++ public string GetETag(); ++ public bool GetETagFromFileDependencies(); ++ public DateTime GetExpires(); ++ public bool GetIgnoreRangeRequests(); ++ public bool GetLastModifiedFromFileDependencies(); ++ public TimeSpan GetMaxAge(); ++ public bool GetNoServerCaching(); ++ public bool GetNoStore(); ++ public bool GetNoTransforms(); ++ public int GetOmitVaryStar(); ++ public TimeSpan GetProxyMaxAge(); ++ public HttpCacheRevalidation GetRevalidation(); ++ public DateTime GetUtcLastModified(); ++ public string GetVaryByCustom(); ++ public bool HasSlidingExpiration(); ++ public bool IsModified(); ++ public bool IsValidUntilExpires(); + } + public sealed class HttpCacheVaryByContentEncodings { ++ public string[] GetContentEncodings(); ++ public void SetContentEncodings(string[] contentEncodings); + } + public sealed class HttpCacheVaryByHeaders { ++ public string[] GetHeaders(); ++ public void SetHeaders(string[] headers); + } + public sealed class HttpCacheVaryByParams { ++ public string[] GetParams(); ++ public void SetParams(string[] parameters); + } + } + namespace System.Web.Caching { + public sealed class AggregateCacheDependency : CacheDependency, ICacheDependencyChanged { ++ public override string[] GetFileDependencies(); + } + public class CacheDependency : IDisposable { ++ public virtual string[] GetFileDependencies(); + } ++ public abstract class OutputCacheProviderAsync : OutputCacheProvider { ++ protected OutputCacheProviderAsync(); ++ public abstract Task AddAsync(string key, object entry, DateTime utcExpiry); ++ public abstract Task GetAsync(string key); ++ public abstract Task RemoveAsync(string key); ++ public abstract Task SetAsync(string key, object entry, DateTime utcExpiry); ++ } ++ public static class OutputCacheUtility { ++ public static CacheDependency CreateCacheDependency(HttpResponse response); ++ public static ArrayList GetContentBuffers(HttpResponse response); ++ public static IEnumerable> GetValidationCallbacks(HttpResponse response); ++ public static void SetContentBuffers(HttpResponse response, ArrayList buffers); ++ public static string SetupKernelCaching(string originalCacheUrl, HttpResponse response); ++ } + } ++namespace System.Web.Globalization { ++ public interface IStringLocalizerProvider { ++ string GetLocalizedString(CultureInfo culture, string name, params object[] arguments); ++ } ++ public sealed class ResourceFileStringLocalizerProvider : IStringLocalizerProvider { ++ public const string ResourceFileName = "DataAnnotation.Localization"; ++ public ResourceFileStringLocalizerProvider(); ++ public string GetLocalizedString(CultureInfo culture, string name, params object[] arguments); ++ } ++ public static class StringLocalizerProviders { ++ public static IStringLocalizerProvider DataAnnotationStringLocalizerProvider { get; set; } ++ } ++} + namespace System.Web.ModelBinding { + public class DataAnnotationsModelValidator : ModelValidator { ++ protected virtual string GetLocalizedErrorMessage(string errorMessage); ++ protected string GetLocalizedString(string name, params object[] arguments); + } ++ public sealed class MaxLengthAttributeAdapter : DataAnnotationsModelValidator { ++ public MaxLengthAttributeAdapter(ModelMetadata metadata, ModelBindingExecutionContext context, MaxLengthAttribute attribute); ++ } ++ public sealed class MinLengthAttributeAdapter : DataAnnotationsModelValidator { ++ public MinLengthAttributeAdapter(ModelMetadata metadata, ModelBindingExecutionContext context, MinLengthAttribute attribute); ++ } + } + namespace System.Web.SessionState { ++ public interface ISessionStateModule : IHttpModule { ++ void ReleaseSessionState(HttpContext context); ++ Task ReleaseSessionStateAsync(HttpContext context); ++ } +- public sealed class SessionStateModule : IHttpModule { ++ public sealed class SessionStateModule : IHttpModule, ISessionStateModule { ++ public void ReleaseSessionState(HttpContext context); ++ public Task ReleaseSessionStateAsync(HttpContext context); + } + public static class SessionStateUtility { ++ public static bool IsSessionStateReadOnly(HttpContext context); ++ public static bool IsSessionStateRequired(HttpContext context); + } + } + namespace System.Windows { ++ public sealed class DpiChangedEventArgs : RoutedEventArgs { ++ public DpiScale NewDpi { get; private set; } ++ public DpiScale OldDpi { get; private set; } ++ } ++ public delegate void DpiChangedEventHandler(object sender, DpiChangedEventArgs e); { ++ public DpiChangedEventHandler(object @object, IntPtr method); ++ public virtual IAsyncResult BeginInvoke(object sender, DpiChangedEventArgs e, AsyncCallback callback, object @object); ++ public virtual void EndInvoke(IAsyncResult result); ++ public virtual void Invoke(object sender, DpiChangedEventArgs e); ++ } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct DpiScale { ++ public DpiScale(double dpiScaleX, double dpiScaleY); ++ public double DpiScaleX { get; } ++ public double DpiScaleY { get; } ++ public double PixelsPerDip { get; } ++ public double PixelsPerInchX { get; } ++ public double PixelsPerInchY { get; } ++ } + public static class FrameworkCompatibilityPreferences { ++ public static bool ShouldThrowOnCopyOrCutFailure { get; set; } + } ++ public sealed class HwndDpiChangedEventArgs : HandledEventArgs { ++ public DpiScale NewDpi { get; private set; } ++ public DpiScale OldDpi { get; private set; } ++ public Rect SuggestedRect { get; private set; } ++ } ++ public delegate void HwndDpiChangedEventHandler(object sender, HwndDpiChangedEventArgs e); { ++ public HwndDpiChangedEventHandler(object @object, IntPtr method); ++ public virtual IAsyncResult BeginInvoke(object sender, HwndDpiChangedEventArgs e, AsyncCallback callback, object @object); ++ public virtual void EndInvoke(IAsyncResult result); ++ public virtual void Invoke(object sender, HwndDpiChangedEventArgs e); ++ } + public class Window : ContentControl, IWindowService { ++ public static readonly RoutedEvent DpiChangedEvent; ++ protected override void OnDpiChanged(DpiScale oldDpi, DpiScale newDpi); ++ public event DpiChangedEventHandler DpiChanged; + } + } + namespace System.Windows.Controls { + public class FlowDocumentReader : Control, IAddChild, IJournalState { ++ protected override void OnDpiChanged(DpiScale oldDpiScaleInfo, DpiScale newDpiScaleInfo); + } + public class Image : FrameworkElement, IProvidePropertyFallback, IUriContext { ++ public static readonly RoutedEvent DpiChangedEvent; ++ protected override void OnDpiChanged(DpiScale oldDpi, DpiScale newDpi); ++ public event DpiChangedEventHandler DpiChanged; + } + public class RichTextBox : TextBoxBase, IAddChild { ++ protected override void OnDpiChanged(DpiScale oldDpiScaleInfo, DpiScale newDpiScaleInfo); + } + } + namespace System.Windows.Controls.Primitives { + public class DocumentPageView : FrameworkElement, IDisposable, IServiceProvider { ++ protected override void OnDpiChanged(DpiScale oldDpiScaleInfo, DpiScale newDpiScaleInfo); + } + public abstract class DocumentViewerBase : Control, IAddChild, IServiceProvider { ++ protected override void OnDpiChanged(DpiScale oldDpiScaleInfo, DpiScale newDpiScaleInfo); + } + } + namespace System.Windows.Diagnostics { ++ public static class ResourceDictionaryDiagnostics { ++ public static IEnumerable GenericResourceDictionaries { get; } ++ public static IEnumerable ThemedResourceDictionaries { get; } ++ public static event EventHandler GenericResourceDictionaryLoaded; ++ public static event EventHandler ThemedResourceDictionaryLoaded; ++ public static event EventHandler ThemedResourceDictionaryUnloaded; ++ } ++ public class ResourceDictionaryInfo { ++ public Assembly Assembly { get; private set; } ++ public ResourceDictionary ResourceDictionary { get; private set; } ++ public Assembly ResourceDictionaryAssembly { get; private set; } ++ public Uri SourceUri { get; private set; } ++ } ++ public class ResourceDictionaryLoadedEventArgs : EventArgs { ++ public ResourceDictionaryInfo ResourceDictionaryInfo { get; private set; } ++ } ++ public class ResourceDictionaryUnloadedEventArgs : EventArgs { ++ public ResourceDictionaryInfo ResourceDictionaryInfo { get; private set; } ++ } + } + namespace System.Windows.Documents { + public class FlowDocument : FrameworkContentElement, IAddChild, IDocumentPaginatorSource, IServiceProvider { ++ public void SetDpi(DpiScale dpiInfo); + } + } + namespace System.Windows.Interop { + public abstract class HwndHost : FrameworkElement, IDisposable, IKeyboardInputSink, IWin32Window { ++ public static readonly RoutedEvent DpiChangedEvent; ++ protected override void OnDpiChanged(DpiScale oldDpi, DpiScale newDpi); ++ public event DpiChangedEventHandler DpiChanged; + } + public class HwndSource : PresentationSource, IDisposable, IKeyboardInputSink, IWin32Window { ++ protected virtual void OnDpiChanged(HwndDpiChangedEventArgs e); ++ public event HwndDpiChangedEventHandler DpiChanged; + } + } + namespace System.Windows.Media { + public class FormattedText { ++ public FormattedText(string textToFormat, CultureInfo culture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground, double pixelsPerDip); ++ public FormattedText(string textToFormat, CultureInfo culture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground, NumberSubstitution numberSubstitution, double pixelsPerDip); ++ public FormattedText(string textToFormat, CultureInfo culture, FlowDirection flowDirection, Typeface typeface, double emSize, Brush foreground, NumberSubstitution numberSubstitution, TextFormattingMode textFormattingMode, double pixelsPerDip); ++ public double PixelsPerDip { get; set; } + } + public class GlyphRun : DUCE.IResource, ISupportInitialize { ++ public GlyphRun(GlyphTypeface glyphTypeface, int bidiLevel, bool isSideways, double renderingEmSize, float pixelsPerDip, IList glyphIndices, Point baselineOrigin, IList advanceWidths, IList glyphOffsets, IList characters, string deviceFontName, IList clusterMap, IList caretStops, XmlLanguage language); ++ public GlyphRun(float pixelsPerDip); ++ public float PixelsPerDip { get; set; } + } + public abstract class Visual : DependencyObject, DUCE.IResource { ++ protected virtual void OnDpiChanged(DpiScale oldDpi, DpiScale newDpi); + } + public static class VisualTreeHelper { ++ public static DpiScale GetDpi(Visual visual); ++ public static void SetRootDpi(Visual visual, DpiScale dpiInfo); + } + } + namespace System.Windows.Media.TextFormatting { + public abstract class TextLine : IDisposable, ITextMetrics { ++ protected TextLine(double pixelsPerDip); ++ public double PixelsPerDip { get; set; } + } + public abstract class TextRunProperties { ++ public double PixelsPerDip { get; set; } + } + public abstract class TextSource { ++ public double PixelsPerDip { get; set; } + } + } + namespace System.Windows.Data { + public class PropertyGroupDescription : GroupDescription { ++ public static IComparer CompareNameAscending { get; } ++ public static IComparer CompareNameDescending { get; } + } + } +``` diff --git a/releases/net462/dotnet462-changes.md b/releases/net462/dotnet462-changes.md new file mode 100644 index 000000000..d06b26d34 --- /dev/null +++ b/releases/net462/dotnet462-changes.md @@ -0,0 +1,309 @@ +.NET Framework 4.6.2 Release Notes +================================== + +.NET Framework release notes describe product improvements grouped by product area. Each change includes a Microsoft-internal VSTS bug number, which acts as a useful unique ID for each change (can be used to report issues or when calling Microsoft Support). + +Post-release servicing updates are also included, appended to the end of each product area. The following servicing updates have been included: + +- [May 2017](https://blogs.msdn.microsoft.com/dotnet/2017/05/17/net-framework-may-2017-preview-of-quality-rollup/) + +## Active Directory Services + +* On calls made to System.DirectoryServices.AccountManagement UserPrincipal.GetAuthorizationGroups method against an Active Directory forest which contains SID History values for migrated users, an empty GroupPrincipal will be added to the list returned by GetAuthorizationGroups for every group with a migrated user SID. [191563] + +## ASP.NET + +* Fixed deadlock in AspNetSynchronizationContext [152944] +* Add support for sorting Model binding items by nested property names [173528] +* Fix Unhandled non-serializable exceptions in ASP.NET [160528] +* Fixed Non-interlocked update/read of 64-bit variable leads to wrong behavior. [92099] +* Since .NET 4.5 ASP.NET cache reports invalid size of the cache. This has been fixed. [154451] +* Fixed client side project compilation failure [156379] +* Fixed an issue with missing ".NET Memory Cache 4.0" performance counter [145677] +* Improve error message localization for DataAnnotationValidiation in ASP.NET model binding and Dynamic data. [176731] +* Enable customers using the Session State Store Providers with task returning methods. [179604] +* Enabling task returning methods to be used with the OutputCache Providers, to allow ASP.Net customers to get the scalability benefits of async. [187841] +* After installing 4.6.2, the max-age value in the following requests coming from Cache is incorrectly set. The issue is not preventing OutputCache on the server side to functional but will cause confusions and problems if customer applications looked at the max-age in the cache control headers. [288340] [Added: May 2017] +* In the following scenarios, ASP.NET may duplicate the cookie in response headers: + - Before a request cookie is loaded, the response cookie is added. + - A response cookie is added, and then a native module sets the response cookie. + + With the fix, ASP.NET makes sure that response cookies are not duplicated. [364615] [Added: May 2017] +* Issue #1: Users might obtain a NULL result when calling OperationContext.Current + + This issue occurs when one creates an OperationContextScope and proceeds to call OperationContext.Current within the using clause. A common pattern that is prone to this failure is the following: + + ```csharp + using (new OperationContextScope(OperationContext.Current)) + { + OperationContext context = OperationContext.Current; //OperationContext.Current returns null + // ... + } + ``` + + To work around this issue, one needs to change the code to something similar to the following: + + ``` csharp + OperationContext ocx = OperationContext.Current; + using (new OperationContextScope(OperationContext.Current)) + { + OperationContext.Current = new OperationContext(ocx.Channel); + // ... + } + ``` + Issue #2: Users might run into a deadlock when using Reentrant services. + + This issue occurs when one creates a Reentrant service ? which restricts instances of the service to one thread of execution at a time. Users prone to running into this problem will have the following ServiceBehaviorAttribute in their code: + + ```csharp + [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] + ``` + To work around this issue, users should set the ConcurrencyMode of their service to ConcurrencyMode.Single or ConcurrencyMode.Multiple, and provide the appropriate synchronization primitives to ensure a single thread can execute a single method at a time. + + We have rolled out an update of System.ServiceModel.dll and we strongly encourage users to patch their existing .NET 4.6.2 framework. The patch fixes Issue #1, disables the flow of OperationContext.Current by default, and provides an Opt-In option to enables feature. + + To enable the flow of OperationContext.Current across multiple threads in async operations, use the following AppSettings key: + + ```xml + + + + ``` + Setting the value of Switch.System.ServiceModel.DisableOperationContextAsyncFlow to true will disable the flow of the ExecutionContext in OperationContext.Current and will effectively revert the behavior to pre-4.6.2, which is the default behavior after this patch. Setting the value to false will enable the feature and should not be used in Reentrant services. [253477] [Added: May 2017] + +## BCL + +* Fix RunContinuationsAscynchronously flag for all continuation types. [146618] +* Fixed NullReference exception if "sha1RSA" is passed to RSACryptoServiceProvider.SignHash(). [147247] +* Fixed "Unhandled Exception: System.Security.SecurityException: Unable to retrieve security descriptor for this frame." in System.Security.Principal.WindowsIdentity.RunImpersonated() [149685] +* Removed the System.Numerics.Vectors façade from the targeting pack. If this façade is needed, add a reference to the System.Numerics.Vectors NuGet package. [120400] +* SignedXml now supports SHA256/384/512 signing. [125387] +* Added a new type called DSACng. [180229] +* Fixed Warnings generated during build that before required a global disable. [185846] +* Fixed potential threading issues with inconsistent values returned from the calls to AppContext. [181890] +* Framework support Unicode 8.0 for character categories. [176613] +* Improved interoperability with PFX files created with OpenSSL in GetECDsaPrivateKey. [171017] +* The ECDiffieHellman base class has been updated to provide better exposure for the hash, HMAC, and TLS-PRF key derivation methods, and the parameters they accept. [171018] +* Fixed System.Security.Cryptography.RSAPKCS1SignatureFormatter.ComputeSignature() and VerifySignature() failures with a NotSupportedException when an RSACng key is specified. [162556] +* Fixed message decryption issues in System.Security.Cryptography.Pkcs.EnvelopedCMS if the recipient certificate's private key is stored in a CNG key container. [163800] +* The factory method now returns SHA256Cng in FIPS-only mode. [163804] +* Fixed behavioral inconsistencies between .NET Core and .NET Framework 4.6 implementations of RSACng [164390] +* Update .NET to support packaged desktop applications. [191801] +* Fixed app crashes related to CompatSortNLSVersion handler initializations [191561] +* System.Security.Cryptography RSAOAEPKeyExchangeDeformatter, RSAOAEPKeyExchangeFormatter, RSAPKCS1KeyExchangeDeformatters and RSAPKCS1KeyExchangeFormatter no longer fail when used with a CNG key. [190217] +* Added support for AesCng and TripleDESCng. [187062] +* The DSA base class has been updated in the same manner as RSA in 4.6, and ECDsa in 4.6.1. Accessing the public/private key of a DSA certificate can be done in a type-safe manner via cert.GetDSAPublicKey()/cert.GetDSAPrivateKey(), and signing and verification operations can be done without further casting. [167883] +* Improved usability of error message for System.BitConverter.ToString(Byte[] value, Int32 startIndex, Int32 length). [100012] +* Fix in bulletin MS16-019. [145386] +* Fix in bulletin MS16-035. [171029] +* AesCng() and TripleDEScng() updated to honor optional provider value. [176670] +* Fixes in System.Security.Cryptography [190217] + RSAOAEPKeyExchangeDeformatter + RSAOAEPKeyExchangeFormatter + RSAPKCS1KeyExchangeDeformatters + RSAPKCS1KeyExchangeFormatter +* Localized RegionInfo object "BW". [194531] +* Fixed SignedXml.CheckSignature(X509Certificate2) will fail for DSA certs with large keys. [194760] +* Added support for long path names on Windows. [195340] +* Fixed EncryptedXml not supporting CNG certificates. [196759] +* Fixed AppContext switch default. [198124] +* Fixed string comparison hitting before the AppDomain is fully initialized. [198570] +* Fixed potential errors with String comparison hitting before the AppDomain is fully initialized. [199217] +* Added validation that AppContext defaults are correctly enabled. [200028] +* Fixed potential errors with String comparison hitting before the AppDomain is fully initialized. [200330] and [201338] +* Fixed file path syntax to correctly handle device path syntaxes (\\.\, \\?\) [202926] +* Fix for StringBuilder overflow and the length becoming negative when > 2GB of data is added/inserted. [216203] +* Users of SignedXml may get an exception like the following when running in some modes on older versions of Windows (for example, executing without loading the user profile on Windows Server 2008r2). + + ```console + System.Security.Cryptography.CryptographicException: Object was not found. + at System.Security.Cryptography.NCryptNative.CreatePersistedKey(SafeNCryptProviderHandle provider, String algorithm, String name, CngKeyCreationOptions options) + ``` + [372920] [Added: May 2017] + +## ClickOnce + +* Added support for TLS1.1/1.2 in ClickOnce runtime. [193676] +* Fixed string truncations issue on ClickOnce security dialog. [176656] +* Added ClickOnce support for installation from web-sites that require Client Certificate to be supplied. [197343] + +## CLR + +* Added Custom attribute to opt out of NGen with method granularity [186172] +* Support .NET in packaged desktop apps. [191774] +* Fixed incorrect result generation while comparing 16-bit signed values. [187325] +* Fixed a JIT optimization bug [174983] +* Fixed crashes due to JIT32 inlining handling of struct [171773] +* Fixed issue with incomplete PDB information when invoking ildasm. [150267] +* Fixed a performance regression in debug start [164437] +* Fixed an issue in CLR type loader that causes type load failures in rare conditions. [185570] +* Fixed usability issues with error message received when System.BitConverter.ToString(Byte[] value, Int32 startIndex, Int32 length) is called [100012] +* Performance fixes in GC [162854] +* Fixed stress issues in GC [161104] +* Fixed crashes in EventListener.DisposeOnShutdown [156238] +* Implement EventCounter support [150674] +* Fixed System.Diagnostics.Tracing.EventSource does not serialize byte[] correctly [153224] +* Fixed RelatedActivityID is not set properly when using EventSource's ActivityTracker [154432] +* Fixed [EventSource] .WriteEvent handles null strings inconsistently depending on the overload getting called [95999] +* Added the event name to ThrowEventSourceException message [112066] +* Fixed typo in EventSource resource string [118799] +* Fixed unexpected exceptions thrown during OnEventSourceCreated [121699] +* In .NET 4.6 if two event names in EventSource differ by a suffix of Start or Stop, then the EventSource will fail to construct and never emit any logging. This is now fixed. [121820] +* Improve Diagnostic when using RelatedActivityID in EventSource [128437] +* User-defined subclasses named "EventSource" can be allowed by checking that the EventSource's type is not equal to typeof(EventSource) which is the type of the built in EventSource. [125529] +* When a byte array is written to an Event a spurious warning is generated by EventSource, claiming that the event has a mismatch in parameter count when it does not. [166228] +* Fixed erroneous removal of IF condition in a finally or catch handler if the condition check exists in the exit from the try-body and entry to the try-body. [149697] +* Fixed a codegen bug when encountering an unbox instruction while the evaluation stack has pending evaluations that side-effect arguments of the unbox. [150586] +* Fix for optimization bug in the JIT component of .NET 4.6.1 may incorrectly combine branches that test bit patterns into a single branch incorrectly leading to program failure. [168744] +* Fix for hang in GC when ETW happens to request to walk the heap at the end of a background server GC [179589] +* Fixed NullReferenceException in EventSource if activity tracking is enabled. [182896] +* Fixed an EventSource exception indicating the maximum number of arguments has been exceeded. [191686] +* Added support for memory limit specified by job objects to GC. [194795] +* Fixed JIT Optimizer bug causing structs to be treated as reference objects instead of values objects in .Net 4.6 when targeting amd64. [194809] +* Fixed potential crash when the JIT generates an incorrect initialization value for an initblk and initializes memory incorrectly. [199169] +* Added VariableHome API for NullReferenceException improvements. [199851] +* Fixed [EventSource] Tags field is ignored for complex types. [205969] +* Allowed the debugger to determine the layout of types without an instance of the type. [211562] +* Reduced events are being sent for telemetry to the CLR for Windows Server OSes. [211794] +* Support resolving Windows Runtime references through simple name in .NET SDK. [219126] +* Reliability improvements in RYUJIT complier code generation due to a missed AVX encoding case. [259784] [Added: May 2017] +* On a machine with many processors, there might a desire to have some processes use only some processes with Server GC. For example if you have a 40-proc machine, you might want to have process 0 use only 10 procs and process 1 use only 6. So process 0 gets 10 GC heaps/threads and process 1 gets 6. Below is an example of using these Server GC configs: + + ```xml + + + + + + + + + ``` + + `` specifies to not affinitize the Server GC threads with CPUs. + `` 6 specifies you want 6 heaps. The actual # of heaps is the min of what you specify and what your process is allowed to use. + `` the # is in decimal so this is 0x90, meaning you want to use those 2 bits as your process mask. The actual # of heaps is the min of what you specify, what your process is allowed to use and the # of set bits in this mask you specify. [274126] [Added: May 2017] +* If you are marshaling array of struct A and also array of struct B as SAFEARRAY, and struct A/B has identical GUIDs, you may run into a memory leak. [365349] [Added: May 2017] +* If you are marshaling array of struct A and also array of struct B as SAFEARRAY, and struct A/B has identical GUIDs, you may run into a memory leak. [424243] [Added: May 2017] +* If you are marshaling array of struct A and also array of struct B as SAFEARRAY, and struct A/B has identical GUIDs, you may run into a memory leak. [431586] [Added: May 2017] +* Rare crashes or deadlocks can happen if a GC occurs while another thread is running NGen'ed code which is making the initial call into a static method within the same module where one or more parameter types involve type-forwarded valuetypes. [378601] [Added: May 2017] +* Applications that frequently queue bursts of work items to the .NET ThreadPool, with idle or light activity between bursts, may be shown using PerfView to spend a significant amount of CPU time in clr!ThreadpoolMgr::UnfairSemaphore::Wait in a spin-wait. A new configuration variable is exposed to configure the spinning limit. The environment variable COMPlus_ThreadPool_UnfairSemaphoreSpinLimit may be set to a lower value (default is 0x32) to reduce the amount of spinning done, or zero (0) to disable spinning, before launching the application. Note that changes to this configuration variable may negatively affect the performance of applications, and such changes are not supported. [381905] [Added: May 2017] + +## Entity Framework + +* When there are more than 1000 queries in the EF 4.x application, the application may experience slowness due to exceeding the size limit of the query cache. With this fix, you can change the query cache size through the following AppSetting. + ```xml + + + + ``` + [379134] [Added: May 2017] + +## Networking + +* Fixed a crash with Null Reference in PinnableBufferCache.Free. [144864] +* Fix in bulletin MS16-065. [186985] +* Added CNG certificate support to NCL code in System.dll. [195318] +* An AccessViolationException gets thrown in HttpListenerRequest.GetTlsTokenBindingRequestInfo() if the RequestBuffer of the HttpListenerRequest has been moved by the garbage collector. This AccessViolation is caused by the fact that HttpListenerRequest is dereferencing a pointer inside RequestBuffer, without adjusting the pointer address the way other HttpListenerRequest methods do. This is now fixed. [204580] +* When attempting to access token bindings from the GetTlsTokenBindings API, an Access Violation exception can be thrown if managed memory has moved during the request. Pointers are now updated to reflect any memory movement. [267430] [Added: May 2017] + +## SQL + +* Added Parameter Caching and CEK TTL improvements. [200050] +* Removed connection pool blocking period for Azure SQL DBs. [200140] +* Fixed incorrect error message in SqlClient when a Command Execution fails on Azure. [201189] +* Disallowed WAM option in native ADAL for AAD authorization. [201411] +* Fix in bulletin MS16-091. [222831] +* Fix for a crash that may occur when the connection pool is being replenished and during replenishment of the pool, the connection to SQL server fails. [229717] +* An OverflowException or IndexOutOfRangeException may be thrown during the prelogin phase of opening a SQL Connection due to receiving a TDS packet that is smaller than expected. [395584, 395586, 395589, 395592] [Added: May 2017] + +## WCF + +* Added a new option for client to find best matching WCF service endpoint using NetNamePipeBinding.[157498] +* CryptoConfig.CreateName(string algorithm) is now updated to understand SHA256 algorithms. [195341] +* Fixed a reliability issue in DataContractCriticalHelper which throws as a SerializationException when reading objects concurrently. [146940] +* Fixed System.ServiceModel.Activation.HostedAspNetEnvironment.get_WebSocketVersion failing during WP startup. [169409] +* Added support for OperationContext.Current with async. [171085] +* Added telemetry for WCF. [172127] +* Fixed a race in UnescapeDefaultValue in UriTemplate::Match when using Default Values [176590] +* Added Support for usage of X509 certificates which are stored using the CNG key storage provider. [182182] +* Fix for XmlSerializer not correctly serializing with XmlText's DataType set to "time". [184091] +* Removed Ssl3 from the WCF TransportDefaults. [186891] +* Fixed DataContractJsonSerializer producing wrong date/time data after having installed KB3093503 when the time zone is (UTC+2) Istanbul. [187509] +* Fixed Performance in AppServices Throughput. [201205] +* Fixed issue that could occur with tracing enabled on WCF async service; failed call generated double OperationFaulted traces. [208167] +* Fix for ArgumentException when opening service host when user's certificate has invalid key usage data. [223670] +* Fixed WCF SslStreamSecurity DNS Identity Check failure while targeting .NET Framework 4.6 when Alt subject is not present [182336] + +## Windows Forms + +* Fixed a crash in Windows Forms designer related to switching windows themes [172691] +* "Smart Tag" dialog processes "enter" key press properly and is same as in Visual Studio 2013 [174771] +* Enabled shortcut keys in the preferences dialog in mageui.exe tool [184655] +* A Windows Forms application that is using print preview dialog when printing to a network printer with certain non-default preferences set, can now opt in into a performance optimization that would considerably speed up the preview generation. [159091] +* Fixed a hang in Windows Forms app when Control.Invoke is called but the caller thread terminates before the invoke finishes [149183] +* Added an Application compatibility switch that fixes implementation of MemberDescriptor.Equals function so that it compares the corresponding fields, instead of comparing description field to category field. [149471] +* Fixed potential race condition in System.Windows.Forms.Application.ThreadContext [146065] +* Fixed a control in MageUI tool that is not accessible by a keyboard shortcut because the same shortcut letter is used for two controls [146678] +* Fixed a memory leak in Control.DrawToBitmap method. [188396] +* Fixed control text truncations issue in "Items Collection Editor" dialog in Visual Studio. [187716] +* Fixed a crash in Windows Forms Designer in Visual Studio related to adjusting TableLayoutPanel control. [190415] +* Fixed a crash in Windows Forms Designer in Visual Studio [190416] +* Fix in bulletin MS16-019. [174623] +* Added Long path support for Windows 10 Anniversary Update in Windows Forms. [191855] +* Improved reliability of Windows Forms applications [193532] +* Added support for CNG key providers to Mage and Mageui SDK tools [194373] +* Fixed printing delay in previewing the document with a network printer. [197824] +* Added Long path support for Windows 10 Anniversary Update in ClientConfigPath. [202970] +* Fixed X1 Professional Client "ok" button is gray and disabled after select Desktop in browse for folder. [207279] +* A windows Forms Application with MDI parent form under certain conditions will remove active child forms from the MDI child windows list. This happens when the closing of the child form is canceled by the user and the child windows list menu item is opened. [388401] [Added: May 2017] + +## Workflow + +* Workflow designer now supports "prepared for update" dynamic update XAML [98185] +* Fixed a FIPS compliance issue when using workflow tracking in WF3. [181434] +* Added Workflow/System.Messaging/System.Transactions Telemetry. [198681] +* Fixed transaction failure for SQLCLR usage of System.Transactions to promote a local SQL transaction to a distributed transaction. [206276] + +## WPF + +* Nested Markup Expressions scenarios, where the parent markup extension is locally defined, have been fixed now. Developers can use markup extension within their custom defined markup extensions without causing a compiler error. [117193] +* Fixed potential periodic hangs or poor performance of a WPF application running on a device that has touch support. This is mostly seen when running over a touch-enabled remote desktop or other touch enabled remote access solutions. [146399] +* Enable automatic invocation and dismissal of the touch keyboard in WPF applications without disabling WPF stylus/touch support on Windows 10 [178044] +* Fixed missing glyph symbol display issues for those WPF applications that render text in the following ranges using a font that does not contain these ranges. [165725] + Ranges: + - Unicode = "0000-052F, 0590-06FF, 0750-077F, 08A0-08FF, 1D00-1FFF, 2C60-2C7F, A720-A7FF, FB00-FB0F, FB1D-FBFF" + - Unicode = "FC00-FDCF, FDF0-FDFF, FE20-FE2F, FE70-FEFE" +* Developers of WPF applications on .NET 4.6.1 may notice that the number of promotions from a touch move event to a mouse move event do not correspond 1:1. This change ensures that there is a corresponding mouse move promotion for every applicable touch move. [169470] +* Enable WPF Applications to look and feel great in multi DPI environments. This means crisper text, sharper images and general polish. [191569] +* WPF applications that allocate large numbers of bitmaps over time can possibly see performance issues such as frequent pauses and large numbers of garbage collections. This fix changes the bitmap garbage collection strategy to help alleviate these issues. [121913] +* Enables enumeration of generic and themed ResourceDictionary instances, and provides a notification infrastructure for listening to loading and unloading of ResourceDictionary instances. [159740] +* Starting .NET 4.6, CurrentCulture or CurrentUICulture changes made by event handlers (or any other method that WPF orchestrates the dispatch for) are lost when the method completes. This can result in various unintended side-effects ranging from the selection of incorrect UI language by application code, to potential loss of state information. This fix addresses the bug described above. [157919] +* Fixed compilation error in situations when a locally defined custom type in a XAML resource dictionary is immediately followed by something like x:Array. [131561] +* Long runs of dashes are now displayed correctly, without spurious spaces. [92892] +* On environments where the secondary monitor is larger than the primary monitor, a WPF application won't maximize to the correct size. This is now fixed. [104034] +* Fixed Crash after refreshing a collection underlying a ComboBox. [125219] +* Fixed crash in DataGrid view. [150804] +* Fixed Groups not being sorted correctly after property changes. [165198] +* Fixed RibbonGallery being disabled. [173053] +* Fixed memory usage issues with printing in Windows 8 and above. [174139] +* Fix in bulletin MS16-035. [176941] +* Developers can opt-in to receiving an exception when TextBoxBase controls fail to complete a Copy or Cut operation. [177621] +* WPF applications being used via multi-touch enabled devices could sometimes lose mouse promotion after a multi-touch drag/drop. This occurred when users removed touch points other than the primary (or dragging) touch point first. Doing so would cause an incorrect count of active touch devices causing mouse promotion handling to be incorrect for future touch interaction. This is now fixed. [185548] +* WPF would previously throw an ArgumentException when a UI Automation Client queried for an unknown TextAttribute. This was causing performance issues in WPF applications on Windows 8 and above. WPF will now simply return NotSupported in response to querying an unknown TextAttribute preserving the external behavior and helping alleviate performance issues. [187764] +* Fix for crash that occurs when: App is running more than one dispatcher thread, First thread uses any ItemsControl, Second thread uses a Selector. While something is selected, the underlying collection raises a Reset event, or the ItemsSource changes. [190507] +* Per Monitor DPI Aware apps now can have their title bars scaled to the correct DPI when an app is moved from one DPI to a different one. [206796] +* Images created with BitmapCreateOptions=DelayCreation can now update their ImageSource by listening to the RoutedEvent DpiChanged on the Image. This event is fired before the Image is decoded, and thus the cost of decoding the image twice can be avoided. [206986] +* WPF apps which are Per monitor DPI aware, running on Windows 10 Anniversary Update, will not have their popup windows like Menus clipped the first time they are open on a monitor with a different DPI. [212426] +* Fixed for Wisptis doesn't support some scenarios in Windows 7, trying to load wisptis in certain scenarios can result in delays upon start or crashes. [215016] +* Fixed issues with the touch keyboard showing on controls when it should not. [222625] +* Fixed ArgumentException when scrolling a virtualized ItemsControl after adding new items [194726]. +* Avoid unnecessary iteration through all items displayed in a virtualized ItemsControl with ScrollUnit=Item [202599]. +* Fixed XPS printing crash when InvariantCulture is used. [143947] +* Fixed truncation of contents during copy & paste in HTML format when the WPF DataGrid control contains full width characters, for e.g. Japanese. [104825] +* In some situations, it is possible that WPF attempts to process a touch/stylus input with a null StylusDevice. This can cause a NullReferenceException. This fix checks for this issue and guards against it. [381810] [Added: May 2017] +* In some situations, it is possible that WPF attempts to process a touch/stylus input with a null StylusDevice. This can cause a NullReferenceException. This fix checks for this issue and guards against it. [378292] [Added: May 2017] +* There is a memory leak when a WPF application includes a D3DImage control, changes both the size and the content of the image, and runs with software rendering (e.g. running over Remote Desktop). [261136] [Added: May 2017] +* A WPF application with a virtualizing list control (ListBox, DataGrid, TreeView, etc.) can encounter an ArgumentNullException when scrolling to an item whose size has substantially decreased since the last time it was re-virtualized. [273803, 282662, 282664, 367282, 367285] [Added: May 2017] +* A WPF application that repeatedly changes the Template of a TextBox can encounter a memory leak of TextBoxView objects. The Template change can happen implicitly, for example by moving the TextBox in and out of the main visual tree, or by moving it between scopes of different implicitly-defined Styles. [245230] [Added: May 2017] +* A WPF application can encounter an ArgumentOutOfRangeException if it uses a DataGrid with column virtualization enabled, calls DataGrid.ScrollIntoView(row, column) before the column widths are known, then immediately changes the DataGrid.Columns collection before the DataGrid has rendered. [271673] [Added: May 2017] diff --git a/releases/net47/README.md b/releases/net47/README.md new file mode 100644 index 000000000..9a301662d --- /dev/null +++ b/releases/net47/README.md @@ -0,0 +1,25 @@ +# .NET Framework 4.7 Release Notes + +You can learn about the changes made in the .NET Framework 4.7. + +- [Download](http://go.microsoft.com/fwlink/?LinkId=825299) +- [.NET Framework 4.7 announcement blog post](https://blogs.msdn.microsoft.com/dotnet/2017/05/02/announcing-the-net-framework-4-7-general-availability/) +- [What's new in the .NET Framework 4.7](https://docs.microsoft.com/dotnet/articles/framework/whats-new/index#v47) +- [Release notes](dotnet47-changes.md) +- [Application compatibility](../../Documentation/compatibility/README.md#net-framework-47) +- [API changes](dotnet47-api-changes.md) +- [Reference Source](https://github.com/Microsoft/referencesource/commit/4251daa76e0aae7330139978648fc04f5c7b8ccb) +- [Known issues](https://support.microsoft.com/en-us/help/4015088/known-issues-for-the-net-framework-4-7) + +# Release Notes by Product Area + +- [ASP.NET](dotnet47-changes.md#aspnet) +- [BCL](dotnet47-changes.md#bcl) +- [ClickOnce](dotnet47-changes.md#clickonce) +- [CLR](dotnet47-changes.md#clr) +- [Networking](dotnet47-changes.md#networking) +- [SQL](dotnet47-changes.md#sql) +- [WCF](dotnet47-changes.md#wcf) +- [Windows Forms](dotnet47-changes.md#windows-forms) +- [Workflow](dotnet47-changes.md#workflow) +- [WPF](dotnet47-changes.md#wpf) diff --git a/releases/net47/dotnet47-api-changes.md b/releases/net47/dotnet47-api-changes.md new file mode 100644 index 000000000..399cbaa7d --- /dev/null +++ b/releases/net47/dotnet47-api-changes.md @@ -0,0 +1,579 @@ +```diff + namespace System { + public static class AppContext { ++ public static string TargetFrameworkName { get; } ++ public static object GetData(string name); + } ++ public static class TupleExtensions { ++ public static void Deconstruct(this Tuple value, out T1 item1); ++ public static void Deconstruct(this Tuple value, out T1 item1, out T2 item2); ++ public static void Deconstruct(this Tuple value, out T1 item1, out T2 item2, out T3 item3); ++ public static void Deconstruct(this Tuple value, out T1 item1, out T2 item2, out T3 item3, out T4 item4); ++ public static void Deconstruct(this Tuple value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5); ++ public static void Deconstruct(this Tuple value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6); ++ public static void Deconstruct(this Tuple value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7); ++ public static void Deconstruct(this Tuple> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8); ++ public static void Deconstruct(this Tuple> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9); ++ public static void Deconstruct(this Tuple> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10); ++ public static void Deconstruct(this Tuple> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11); ++ public static void Deconstruct(this Tuple> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12); ++ public static void Deconstruct(this Tuple> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13); ++ public static void Deconstruct(this Tuple> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14); ++ public static void Deconstruct(this Tuple>> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14, out T15 item15); ++ public static void Deconstruct(this Tuple>> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14, out T15 item15, out T16 item16); ++ public static void Deconstruct(this Tuple>> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14, out T15 item15, out T16 item16, out T17 item17); ++ public static void Deconstruct(this Tuple>> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14, out T15 item15, out T16 item16, out T17 item17, out T18 item18); ++ public static void Deconstruct(this Tuple>> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14, out T15 item15, out T16 item16, out T17 item17, out T18 item18, out T19 item19); ++ public static void Deconstruct(this Tuple>> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14, out T15 item15, out T16 item16, out T17 item17, out T18 item18, out T19 item19, out T20 item20); ++ public static void Deconstruct(this Tuple>> value, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14, out T15 item15, out T16 item16, out T17 item17, out T18 item18, out T19 item19, out T20 item20, out T21 item21); ++ public static Tuple ToTuple(this ValueTuple value); ++ public static Tuple ToTuple(this ValueTuple value); ++ public static Tuple ToTuple(this ValueTuple value); ++ public static Tuple ToTuple(this ValueTuple value); ++ public static Tuple ToTuple(this ValueTuple value); ++ public static Tuple ToTuple(this ValueTuple value); ++ public static Tuple ToTuple(this ValueTuple value); ++ public static Tuple> ToTuple(this ValueTuple> value); ++ public static Tuple> ToTuple(this ValueTuple> value); ++ public static Tuple> ToTuple(this ValueTuple> value); ++ public static Tuple> ToTuple(this ValueTuple> value); ++ public static Tuple> ToTuple(this ValueTuple> value); ++ public static Tuple> ToTuple(this ValueTuple> value); ++ public static Tuple> ToTuple(this ValueTuple> value); ++ public static Tuple>> ToTuple(this ValueTuple>> value); ++ public static Tuple>> ToTuple(this ValueTuple>> value); ++ public static Tuple>> ToTuple(this ValueTuple>> value); ++ public static Tuple>> ToTuple(this ValueTuple>> value); ++ public static Tuple>> ToTuple(this ValueTuple>> value); ++ public static Tuple>> ToTuple(this ValueTuple>> value); ++ public static Tuple>> ToTuple(this ValueTuple>> value); ++ public static ValueTuple ToValueTuple(this Tuple value); ++ public static ValueTuple ToValueTuple(this Tuple value); ++ public static ValueTuple ToValueTuple(this Tuple value); ++ public static ValueTuple ToValueTuple(this Tuple value); ++ public static ValueTuple ToValueTuple(this Tuple value); ++ public static ValueTuple ToValueTuple(this Tuple value); ++ public static ValueTuple ToValueTuple(this Tuple value); ++ public static ValueTuple> ToValueTuple(this Tuple> value); ++ public static ValueTuple> ToValueTuple(this Tuple> value); ++ public static ValueTuple> ToValueTuple(this Tuple> value); ++ public static ValueTuple> ToValueTuple(this Tuple> value); ++ public static ValueTuple> ToValueTuple(this Tuple> value); ++ public static ValueTuple> ToValueTuple(this Tuple> value); ++ public static ValueTuple> ToValueTuple(this Tuple> value); ++ public static ValueTuple>> ToValueTuple(this Tuple>> value); ++ public static ValueTuple>> ToValueTuple(this Tuple>> value); ++ public static ValueTuple>> ToValueTuple(this Tuple>> value); ++ public static ValueTuple>> ToValueTuple(this Tuple>> value); ++ public static ValueTuple>> ToValueTuple(this Tuple>> value); ++ public static ValueTuple>> ToValueTuple(this Tuple>> value); ++ public static ValueTuple>> ToValueTuple(this Tuple>> value); ++ } ++ public struct ValueTuple : IComparable, IComparable, IEquatable, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public int CompareTo(ValueTuple other); ++ public static ValueTuple Create(T1 item1); ++ public static ValueTuple Create(T1 item1, T2 item2); ++ public static ValueTuple Create(T1 item1, T2 item2, T3 item3); ++ public static ValueTuple Create(T1 item1, T2 item2, T3 item3, T4 item4); ++ public static ValueTuple Create(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5); ++ public static ValueTuple Create(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6); ++ public static ValueTuple Create(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7); ++ public static ValueTuple> Create(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, T8 item8); ++ public static ValueTuple Create(); ++ public override bool Equals(object obj); ++ public bool Equals(ValueTuple other); ++ public override int GetHashCode(); ++ int System.Collections.IStructuralComparable.CompareTo(object other, IComparer comparer); ++ bool System.Collections.IStructuralEquatable.Equals(object other, IEqualityComparer comparer); ++ int System.Collections.IStructuralEquatable.GetHashCode(IEqualityComparer comparer); ++ int System.IComparable.CompareTo(object other); ++ public override string ToString(); ++ } ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public T1 Item1; ++ public ValueTuple(T1 item1); ++ public int CompareTo(ValueTuple other); ++ public override bool Equals(object obj); ++ public bool Equals(ValueTuple other); ++ public override int GetHashCode(); ++ int System.Collections.IStructuralComparable.CompareTo(object other, IComparer comparer); ++ bool System.Collections.IStructuralEquatable.Equals(object other, IEqualityComparer comparer); ++ int System.Collections.IStructuralEquatable.GetHashCode(IEqualityComparer comparer); ++ int System.IComparable.CompareTo(object other); ++ public override string ToString(); ++ } ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public T1 Item1; ++ public T2 Item2; ++ public ValueTuple(T1 item1, T2 item2); ++ public int CompareTo(ValueTuple other); ++ public override bool Equals(object obj); ++ public bool Equals(ValueTuple other); ++ public override int GetHashCode(); ++ int System.Collections.IStructuralComparable.CompareTo(object other, IComparer comparer); ++ bool System.Collections.IStructuralEquatable.Equals(object other, IEqualityComparer comparer); ++ int System.Collections.IStructuralEquatable.GetHashCode(IEqualityComparer comparer); ++ int System.IComparable.CompareTo(object other); ++ public override string ToString(); ++ } ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public T1 Item1; ++ public T2 Item2; ++ public T3 Item3; ++ public ValueTuple(T1 item1, T2 item2, T3 item3); ++ public int CompareTo(ValueTuple other); ++ public override bool Equals(object obj); ++ public bool Equals(ValueTuple other); ++ public override int GetHashCode(); ++ int System.Collections.IStructuralComparable.CompareTo(object other, IComparer comparer); ++ bool System.Collections.IStructuralEquatable.Equals(object other, IEqualityComparer comparer); ++ int System.Collections.IStructuralEquatable.GetHashCode(IEqualityComparer comparer); ++ int System.IComparable.CompareTo(object other); ++ public override string ToString(); ++ } ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public T1 Item1; ++ public T2 Item2; ++ public T3 Item3; ++ public T4 Item4; ++ public ValueTuple(T1 item1, T2 item2, T3 item3, T4 item4); ++ public int CompareTo(ValueTuple other); ++ public override bool Equals(object obj); ++ public bool Equals(ValueTuple other); ++ public override int GetHashCode(); ++ int System.Collections.IStructuralComparable.CompareTo(object other, IComparer comparer); ++ bool System.Collections.IStructuralEquatable.Equals(object other, IEqualityComparer comparer); ++ int System.Collections.IStructuralEquatable.GetHashCode(IEqualityComparer comparer); ++ int System.IComparable.CompareTo(object other); ++ public override string ToString(); ++ } ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public T1 Item1; ++ public T2 Item2; ++ public T3 Item3; ++ public T4 Item4; ++ public T5 Item5; ++ public ValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5); ++ public int CompareTo(ValueTuple other); ++ public override bool Equals(object obj); ++ public bool Equals(ValueTuple other); ++ public override int GetHashCode(); ++ int System.Collections.IStructuralComparable.CompareTo(object other, IComparer comparer); ++ bool System.Collections.IStructuralEquatable.Equals(object other, IEqualityComparer comparer); ++ int System.Collections.IStructuralEquatable.GetHashCode(IEqualityComparer comparer); ++ int System.IComparable.CompareTo(object other); ++ public override string ToString(); ++ } ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public T1 Item1; ++ public T2 Item2; ++ public T3 Item3; ++ public T4 Item4; ++ public T5 Item5; ++ public T6 Item6; ++ public ValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6); ++ public int CompareTo(ValueTuple other); ++ public override bool Equals(object obj); ++ public bool Equals(ValueTuple other); ++ public override int GetHashCode(); ++ int System.Collections.IStructuralComparable.CompareTo(object other, IComparer comparer); ++ bool System.Collections.IStructuralEquatable.Equals(object other, IEqualityComparer comparer); ++ int System.Collections.IStructuralEquatable.GetHashCode(IEqualityComparer comparer); ++ int System.IComparable.CompareTo(object other); ++ public override string ToString(); ++ } ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public T1 Item1; ++ public T2 Item2; ++ public T3 Item3; ++ public T4 Item4; ++ public T5 Item5; ++ public T6 Item6; ++ public T7 Item7; ++ public ValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7); ++ public int CompareTo(ValueTuple other); ++ public override bool Equals(object obj); ++ public bool Equals(ValueTuple other); ++ public override int GetHashCode(); ++ int System.Collections.IStructuralComparable.CompareTo(object other, IComparer comparer); ++ bool System.Collections.IStructuralEquatable.Equals(object other, IEqualityComparer comparer); ++ int System.Collections.IStructuralEquatable.GetHashCode(IEqualityComparer comparer); ++ int System.IComparable.CompareTo(object other); ++ public override string ToString(); ++ } ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal where TRest : struct { ++ public T1 Item1; ++ public T2 Item2; ++ public T3 Item3; ++ public T4 Item4; ++ public T5 Item5; ++ public T6 Item6; ++ public T7 Item7; ++ public TRest Rest; ++ public ValueTuple(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5, T6 item6, T7 item7, TRest rest); ++ public int CompareTo(ValueTuple other); ++ public override bool Equals(object obj); ++ public bool Equals(ValueTuple other); ++ public override int GetHashCode(); ++ int System.Collections.IStructuralComparable.CompareTo(object other, IComparer comparer); ++ bool System.Collections.IStructuralEquatable.Equals(object other, IEqualityComparer comparer); ++ int System.Collections.IStructuralEquatable.GetHashCode(IEqualityComparer comparer); ++ int System.IComparable.CompareTo(object other); ++ public override string ToString(); ++ } + } + namespace System.Diagnostics.Tracing { + public class EventListener : IDisposable { +- protected static int EventSourceIndex(EventSource eventSource); ++ public static int EventSourceIndex(EventSource eventSource); + } + } + namespace System.IO { + public sealed class DirectoryInfo : FileSystemInfo { ++ public override string FullName { get; } + } + } + namespace System.Net { + public enum SecurityProtocolType { ++ SystemDefault = 0, + } + } + namespace System.Net.Security { + public class SslStream : AuthenticatedStream { ++ public virtual void AuthenticateAsClient(string targetHost, X509CertificateCollection clientCertificates, bool checkCertificateRevocation); ++ public virtual Task AuthenticateAsClientAsync(string targetHost, X509CertificateCollection clientCertificates, bool checkCertificateRevocation); ++ public virtual void AuthenticateAsServer(X509Certificate serverCertificate, bool clientCertificateRequired, bool checkCertificateRevocation); ++ public virtual Task AuthenticateAsServerAsync(X509Certificate serverCertificate, bool clientCertificateRequired, bool checkCertificateRevocation); ++ public virtual IAsyncResult BeginAuthenticateAsClient(string targetHost, X509CertificateCollection clientCertificates, bool checkCertificateRevocation, AsyncCallback asyncCallback, object asyncState); ++ public virtual IAsyncResult BeginAuthenticateAsServer(X509Certificate serverCertificate, bool clientCertificateRequired, bool checkCertificateRevocation, AsyncCallback asyncCallback, object asyncState); ++ public virtual Task ShutdownAsync(); + } + } + namespace System.Runtime.Caching { + public class MemoryCache : ObjectCache, IDisposable, IEnumerable { ++ public MemoryCache(string name, NameValueCollection config, bool ignoreConfigSection); ++ public long GetLastSize(string regionName=null); ++ public object Remove(string key, CacheEntryRemovedReason reason, string regionName=null); + } + } + namespace System.Runtime.CompilerServices { ++ public sealed class TupleElementNamesAttribute : Attribute { ++ public TupleElementNamesAttribute(string[] transformNames); ++ public IList TransformNames { get; } ++ } + } + namespace System.Runtime.InteropServices { + public enum UnmanagedType { ++ LPUTF8Str = 48, + } + } + namespace System.Security.Authentication { + public enum HashAlgorithmType { ++ Sha256 = 32780, ++ Sha384 = 32781, ++ Sha512 = 32782, + } + } + namespace System.Security.Cryptography { + public sealed class CngAlgorithm : IEquatable { ++ public static CngAlgorithm ECDiffieHellman { get; } ++ public static CngAlgorithm ECDsa { get; } + } + public sealed class CngKey : IDisposable { +- public CngExportPolicies ExportPolicy { get; } ++ public CngExportPolicies ExportPolicy { get; internal set; } + } + public sealed class CngKeyBlobFormat : IEquatable { ++ public static CngKeyBlobFormat EccFullPrivateBlob { get; } ++ public static CngKeyBlobFormat EccFullPublicBlob { get; } + } ++ public struct ECCurve { ++ public enum ECCurveType { ++ Characteristic2 = 4, ++ Implicit = 0, ++ Named = 5, ++ PrimeMontgomery = 3, ++ PrimeShortWeierstrass = 1, ++ PrimeTwistedEdwards = 2, ++ } ++ public static class NamedCurves { ++ public static ECCurve brainpoolP160r1 { get; } ++ public static ECCurve brainpoolP160t1 { get; } ++ public static ECCurve brainpoolP192r1 { get; } ++ public static ECCurve brainpoolP192t1 { get; } ++ public static ECCurve brainpoolP224r1 { get; } ++ public static ECCurve brainpoolP224t1 { get; } ++ public static ECCurve brainpoolP256r1 { get; } ++ public static ECCurve brainpoolP256t1 { get; } ++ public static ECCurve brainpoolP320r1 { get; } ++ public static ECCurve brainpoolP320t1 { get; } ++ public static ECCurve brainpoolP384r1 { get; } ++ public static ECCurve brainpoolP384t1 { get; } ++ public static ECCurve brainpoolP512r1 { get; } ++ public static ECCurve brainpoolP512t1 { get; } ++ public static ECCurve nistP256 { get; } ++ public static ECCurve nistP384 { get; } ++ public static ECCurve nistP521 { get; } ++ } ++ public byte[] A; ++ public byte[] B; ++ public byte[] Cofactor; ++ public ECCurve.ECCurveType CurveType; ++ public ECPoint G; ++ public Nullable Hash; ++ public byte[] Order; ++ public byte[] Polynomial; ++ public byte[] Prime; ++ public byte[] Seed; ++ public bool IsCharacteristic2 { get; } ++ public bool IsExplicit { get; } ++ public bool IsNamed { get; } ++ public bool IsPrime { get; } ++ public Oid Oid { get; private set; } ++ public static ECCurve CreateFromFriendlyName(string oidFriendlyName); ++ public static ECCurve CreateFromOid(Oid curveOid); ++ public static ECCurve CreateFromValue(string oidValue); ++ public void Validate(); ++ } + public abstract class ECDiffieHellman : AsymmetricAlgorithm { ++ public static ECDiffieHellman Create(ECCurve curve); ++ public static ECDiffieHellman Create(ECParameters parameters); ++ public virtual ECParameters ExportExplicitParameters(bool includePrivateParameters); ++ public virtual ECParameters ExportParameters(bool includePrivateParameters); ++ public virtual void GenerateKey(ECCurve curve); ++ public virtual void ImportParameters(ECParameters parameters); + } + public sealed class ECDiffieHellmanCng : ECDiffieHellman { ++ public ECDiffieHellmanCng(ECCurve curve); ++ public override ECParameters ExportExplicitParameters(bool includePrivateParameters); ++ public override ECParameters ExportParameters(bool includePrivateParameters); ++ public override void GenerateKey(ECCurve curve); ++ public override void ImportParameters(ECParameters parameters); + } + public sealed class ECDiffieHellmanCngPublicKey : ECDiffieHellmanPublicKey { ++ public override ECParameters ExportExplicitParameters(); ++ public override ECParameters ExportParameters(); + } + public abstract class ECDiffieHellmanPublicKey : IDisposable { ++ protected ECDiffieHellmanPublicKey(); ++ public virtual ECParameters ExportExplicitParameters(); ++ public virtual ECParameters ExportParameters(); + } + public abstract class ECDsa : AsymmetricAlgorithm { ++ public static ECDsa Create(ECCurve curve); ++ public static ECDsa Create(ECParameters parameters); ++ public virtual ECParameters ExportExplicitParameters(bool includePrivateParameters); ++ public virtual ECParameters ExportParameters(bool includePrivateParameters); ++ public virtual void GenerateKey(ECCurve curve); ++ public virtual void ImportParameters(ECParameters parameters); + } + public sealed class ECDsaCng : ECDsa { ++ public ECDsaCng(ECCurve curve); ++ public override ECParameters ExportExplicitParameters(bool includePrivateParameters); ++ public override ECParameters ExportParameters(bool includePrivateParameters); ++ public override void GenerateKey(ECCurve curve); ++ public override void ImportParameters(ECParameters parameters); + } ++ public struct ECParameters { ++ public ECCurve Curve; ++ public byte[] D; ++ public ECPoint Q; ++ public void Validate(); ++ } ++ public struct ECPoint { ++ public byte[] X; ++ public byte[] Y; ++ } + } + namespace System.Text.RegularExpressions { + public class Group : Capture { ++ public string Name { get; } + } + } + namespace System.Web.Caching { +- public sealed class AggregateCacheDependency : CacheDependency, ICacheDependencyChanged { ++ public sealed class AggregateCacheDependency : CacheDependency { + } + public class CacheDependency : IDisposable { ++ public void ItemRemoved(); ++ public void KeepDependenciesAlive(); ++ public void SetCacheDependencyChanged(Action dependencyChangedAction); ++ public bool TakeOwnership(); + } ++ public class CacheInsertOptions { ++ public CacheInsertOptions(); ++ public DateTime AbsoluteExpiration { get; set; } ++ public CacheDependency Dependencies { get; set; } ++ public CacheItemRemovedCallback OnRemovedCallback { get; set; } ++ public CacheItemPriority Priority { get; set; } ++ public TimeSpan SlidingExpiration { get; set; } ++ } ++ public abstract class CacheStoreProvider : ProviderBase, IDisposable { ++ protected CacheStoreProvider(); ++ public abstract long ItemCount { get; } ++ public abstract long SizeInBytes { get; } ++ public abstract object Add(string key, object item, CacheInsertOptions options); ++ public abstract bool AddDependent(string key, CacheDependency dependency, out DateTime utcLastUpdated); ++ public abstract void Dispose(); ++ public abstract object Get(string key); ++ public abstract IDictionaryEnumerator GetEnumerator(); ++ public abstract void Initialize(string name, NameValueCollection config); ++ public abstract void Insert(string key, object item, CacheInsertOptions options); ++ public abstract object Remove(string key); ++ public abstract object Remove(string key, CacheItemRemovedReason reason); ++ public abstract void RemoveDependent(string key, CacheDependency dependency); ++ public abstract long Trim(int percent); ++ } + public static class OutputCacheUtility { ++ public static void FlushKernelCache(string cacheKey); + } + } + namespace System.Web.Configuration { + public sealed class CacheSection : ConfigurationSection { ++ public string DefaultProvider { get; set; } ++ public ProviderSettingsCollection Providers { get; } + } + } + namespace System.Web.Hosting { ++ public sealed class ApplicationMonitors { ++ public IApplicationMonitor MemoryMonitor { get; set; } ++ } ++ public sealed class AspNetMemoryMonitor : IApplicationMonitor, IDisposable, IObservable, IObservable { ++ public IObserver DefaultLowPhysicalMemoryObserver { get; set; } ++ public IObserver DefaultRecycleLimitObserver { get; set; } ++ public void Dispose(); ++ public void Start(); ++ public void Stop(); ++ public IDisposable Subscribe(IObserver observer); ++ public IDisposable Subscribe(IObserver observer); ++ } + public sealed class HostingEnvironment : MarshalByRefObject { ++ public static ApplicationMonitors ApplicationMonitors { get; } + } ++ public interface IApplicationMonitor : IDisposable { ++ void Start(); ++ void Stop(); ++ } ++ public sealed class LowPhysicalMemoryInfo { ++ public LowPhysicalMemoryInfo(int currentPercentUsed, int percentLimit); ++ public int CurrentPercentUsed { get; } ++ public int PercentLimit { get; } ++ public bool RequestGC { get; set; } ++ } ++ public class LowPhysicalMemoryObserver : IObserver { ++ public LowPhysicalMemoryObserver(); ++ public void OnCompleted(); ++ public void OnError(Exception error); ++ public void OnNext(LowPhysicalMemoryInfo lowMemoryInfo); ++ } ++ public sealed class RecycleLimitInfo { ++ public RecycleLimitInfo(long currentPrivateBytes, long recycleLimit, RecycleLimitNotificationFrequency recycleLimitNearFrequency); ++ public long CurrentPrivateBytes { get; } ++ public long RecycleLimit { get; } ++ public bool RequestGC { get; set; } ++ public RecycleLimitNotificationFrequency TrimFrequency { get; } ++ } ++ public class RecycleLimitMonitor : MarshalByRefObject { ++ public class RecycleLimitMonitorSingleton : MarshalByRefObject { ++ public void Dispose(); ++ public static void EnsureCreated(); ++ public override object InitializeLifetimeService(); ++ public void RegisterProxyAndStart(RecycleLimitMonitor proxy, string applicationID); ++ public void UnregisterProxyAndStop(RecycleLimitMonitor proxy); ++ } ++ public void Dispose(); ++ public override object InitializeLifetimeService(); ++ } ++ public enum RecycleLimitNotificationFrequency { ++ High = 0, ++ Low = 2, ++ Medium = 1, ++ } ++ public class RecycleLimitObserver : IObserver { ++ public RecycleLimitObserver(); ++ public void OnCompleted(); ++ public void OnError(Exception error); ++ public void OnNext(RecycleLimitInfo recycleLimitInfo); ++ } + } + namespace System.Windows.Forms { + public class Control : Component, IArrangedElement, IBindableComponent, IComponent, IDisposable, IDropTarget, ISynchronizeInvoke, IWin32Window { ++ public int DeviceDpi { get; } ++ public int LogicalToDeviceUnits(int value); ++ protected virtual void OnDpiChangedAfterParent(EventArgs e); ++ protected virtual void OnDpiChangedBeforeParent(EventArgs e); ++ protected virtual void RescaleConstantsForDpi(int deviceDpiOld, int deviceDpiNew); ++ public void ScaleBitmapLogicalToDevice(ref Bitmap logicalBitmap); ++ public event EventHandler DpiChangedAfterParent; ++ public event EventHandler DpiChangedBeforeParent; + } ++ public sealed class DpiChangedEventArgs : CancelEventArgs { ++ public int DeviceDpiNew { get; private set; } ++ public int DeviceDpiOld { get; private set; } ++ public Rectangle SuggestedRectangle { get; private set; } ++ public override string ToString(); ++ } ++ public delegate void DpiChangedEventHandler(object sender, DpiChangedEventArgs e); { ++ public DpiChangedEventHandler(object @object, IntPtr method); ++ public virtual IAsyncResult BeginInvoke(object sender, DpiChangedEventArgs e, AsyncCallback callback, object @object); ++ public virtual void EndInvoke(IAsyncResult result); ++ public virtual void Invoke(object sender, DpiChangedEventArgs e); ++ } + public class Form : ContainerControl { ++ protected virtual void OnDpiChanged(DpiChangedEventArgs e); ++ protected virtual bool OnGetDpiScaledSize(int deviceDpiOld, int deviceDpiNew, ref Size desiredSize); ++ public event DpiChangedEventHandler DpiChanged; + } + public class ListBox : ListControl { ++ protected override void RescaleConstantsForDpi(int deviceDpiOld, int deviceDpiNew); + } + public class SystemInformation { ++ public static Size GetBorderSizeForDpi(int dpi); ++ public static int GetHorizontalScrollBarHeightForDpi(int dpi); ++ public static Font GetMenuFontForDpi(int dpi); ++ public static int GetVerticalScrollBarWidthForDpi(int dpi); + } + public abstract class UpDownBase : ContainerControl { ++ protected override void RescaleConstantsForDpi(int deviceDpiOld, int deviceDpiNew); + } + } + namespace System.Windows.Input { + public class StylusPointPropertyInfo : StylusPointProperty { +- public float Resolution { get; } ++ public float Resolution { get; internal set; } + } + public class TabletDeviceCollection : ICollection, IEnumerable { ++ public TabletDeviceCollection(); + } + } ++namespace System.Windows.Input.StylusWisp { ++ public class WispTabletDeviceCollection : TabletDeviceCollection ++} + namespace System.Windows.Markup { ++ public sealed class MarkupExtensionBracketCharactersAttribute : Attribute { ++ public MarkupExtensionBracketCharactersAttribute(char openingBracket, char closingBracket); ++ public char ClosingBracket { get; } ++ public char OpeningBracket { get; } ++ } + } + namespace System.Windows.Xps { + public class XpsDocumentWriter : SerializerWriter { +- public override event WritingProgressChangedEventHandler WritingProgressChanged; ++ public virtual event WritingProgressChangedEventHandler WritingProgressChanged; + } + } + namespace System.Windows.Xps.Serialization { +- public class XpsSerializationManager : PackageSerializationManager { ++ public class XpsSerializationManager : PackageSerializationManager, IXpsSerializationManager { + } +- public sealed class XpsSerializationManagerAsync : XpsSerializationManager { ++ public sealed class XpsSerializationManagerAsync : XpsSerializationManager, IXpsSerializationManager, IXpsSerializationManagerAsync { + } + } + namespace System.Xaml { + public class XamlMember : IEquatable { ++ public IReadOnlyDictionary MarkupExtensionBracketCharacters { get; } ++ protected virtual IReadOnlyDictionary LookupMarkupExtensionBracketCharacters(); + } + } +``` diff --git a/releases/net47/dotnet47-changes.md b/releases/net47/dotnet47-changes.md new file mode 100644 index 000000000..7776b9aec --- /dev/null +++ b/releases/net47/dotnet47-changes.md @@ -0,0 +1,134 @@ +.NET Framework 4.7 Release Notes +================================ + +.NET Framework release notes describe product improvements grouped by product area. Each change includes a Microsoft-internal VSTS bug number, which acts as a useful unique ID for each change (can be used to report issues or when calling Microsoft Support). + +## ASP.NET + +* Allows for extensibility of the cache providers that could allow them to operate on new services with less overhead from memory usage. [180994] +* Introduced a new config parameter 'timeoutUnit' for [ActiveDirectoryMembershipProvider](https://docs.microsoft.com/dotnet/api/System.Web.Security.ActiveDirectoryMembershipProvider?view=netframework-4.7) that can be used to indicate the 'clientSearchTimeout' and 'serverSearchTimeout' values. These should be interpreted as Days/Hours/Minutes/Seconds/Milliseconds. If not specified, the default is Minutes, as was the previous behavior. [212045] +* Customer will see a warning in the windows event log if they have specified to use unsecured password formats in their web application. [265267] +* Fixed assignment issue with max-age value for OutputCache. [288337] +* Fixed an issue with exception handling for custom membership provider scenario. [294931] + +## BCL + +* Opening a cryptographic key with CspParameters.ParentWindowHandle set to this.Handle will now correctly make any PIN or password prompt be modal to the current window [208813] +* Added [ValueTuple](https://docs.microsoft.com/dotnet/api/System.ValueTuple?view=netframework-4.7) types to support C# 7.0 and VB 15 tuples [257122] +* Added [Name](https://docs.microsoft.com/dotnet/api/system.text.regularexpressions.group.name?view=netframework-4.7) property to Regex.Group. [234526] +* Fixed InvalidPath exception when using FileIOPermissions with device syntax (\\?\), [245244] +* [ECDsa](https://docs.microsoft.com/dotnet/api/System.Security.Cryptography.ECDsa?view=netframework-4.7) and [ECDiffieHellman](https://docs.microsoft.com/dotnet/api/System.Security.Cryptography.ECDiffieHellman?view=netframework-4.7) can now import and export key parameters (all OSes) as well as represent points over an expanded set of curves (Win10). [266138] +* Fixed an issue in SerialPort where unplugging the device during execution could cause a memory leak in the SerialStream class. [288363] +* Improved support of RSA decryption with hardware keys [298923] + +## ClickOnce + +* Fixed store corruption in ClickOnce application. [260868] +* Added the ability to sign a manifest file via a Hardware-Security Module (HSM) to Mage.exe and MageUI.exe [166355] + +## CLR + +* Fixed buffer overflows with large manifests in EventSource. [199198] +* If a COM interface contain setter only indexed property, Tlbimp will generate incorrect setter property metadata. [220918] +* Implemented IEnumerator in EventPayload (EventSource). [220990] +* JIT performance improvements [223169] +* Improved performance of creating large numbers of TaskSchedulers when a debugger isn't attached. [227010] +* EventSourceIndex method is now public. [227686] +* Support for ToEventKeywords() method instead of working with keywords directly. [232335] +* Fixed NGen Task to respect battery saver setting. [250762] +* Fixed a bug where null paths would not throw ArgumentNullException. [252467] +* Added the case of Wrong machine code generated by RyuJIT on AVX2-capable CPU to the list of instructions that have this characteristic. [258520] +* Implemented flexibility in specifying Server GC resource consumption. [271883] [[dotnet/coreclr #6104](https://github.com/dotnet/coreclr/pull/6104)] + +## Networking + +* [ServicePointManager.SecurityProtocol](https://docs.microsoft.com/dotnet/api/system.net.servicepointmanager.securityprotocol?view=netframework-4.7) will default to a new value: SystemDefault which allows applications to use the underlying operating system TLS version selection defaults. +New [SslStream*AuthenticateAs*](https://docs.microsoft.com/dotnet/api/System.Net.Security.SslStream?view=netframework-4.7) APIs allow applications to omit the SslProtocols parameter and use the system default. +New [HashAlgorithmType](https://docs.microsoft.com/dotnet/api/System.Security.Authentication.HashAlgorithmType?view=netframework-4.7) enum members. [197039] +* Added support for the TLS Alert Protocol [273411] +* Updated HttpListener to handle improvements to the token binding protocol. [365993], [377357] +* Fixed pointer offset calculation in HttpListener for token binding struct. [262268] + +## SQL + +* Fixed TransparentNetworkIPResolution (TNIR) Connectivity issues. [222375] +* SQL Client now uses TCP as the default protocol for connections to Azure SQL Database. Previously, SQL Client tried every protocol including viz, Shared Memory, TCP, and Named Pipes to establish a connection to Azure SQL Database, which only supports TCP connections. [276556] + +## WCF + +* Fixed a bug in SocketConnection.Read which caused the operation to hang when mixing synchronous and asynchronous calls. [171322] +* Support for CNG certificates. For details refer to [Application compatibility changes](https://msdn.microsoft.com/en-us/library/mt800102(v=vs.110).aspx). [194808] +* Support for DataContractJsonSerializer to follow ECMAScript 6 when serializing control character. [200613] +* Fixed process crash in concurrent Dictionary scenario [209749] +* Fixed a race condition on the cleanup path of WCF Tracing that caused an ObjectDisposedException. [219051] +* Enabled WCF message security configuration to use TLS1.1 or TLS1.2. For details refer to [Application compatibility changes](https://msdn.microsoft.com/en-us/library/mt800102(v=vs.110).aspx). [226570] +* Fixed a bug in OperationContext.Current which caused it to return null when called inside an OperationContextScope [249750] +* Ensure no deadlock occurs when two threads try to abort the channel. [257126] + +## Windows Forms + +* Fixed dialog layout for High DPI scenarios [123539] +* Enabled ClickOnce signing scenarios where certificate is identified by a cryptographic provider and private key container names. [146775] +* Docked ListBox controls will now revert to their correct size in the designer when the Dock property is changed to DockStyle.None in the property browser. [159543] +* Fixed properly scaling across dialog control elements, including control padding and sizes in High DPI scenarios. [164251] +* Fixed text clipping in localized versions of .NET SDK tool MageUI.exe. [197100] +* Fixed IndexOutOfRangeException. [199325] +* Fixed clipped buttons in WinRes.exe .Net SDK tool [203672] +* Fixed crashes in Windows Forms Designer that happened when the Windows theme was changed. [204800] +* Fixed an issue in the Windows Forms designer where under some circumstances selecting a ContextMenuStrip causes Visual Studio to crash. [214130] +* Improved reliability of ToolTip control. [219724] +* Fixed reliability issue with ShowPropertyBrowser and Controls [223512] +* Changed the background color of property grid lines to provide an 8:1 contrast ratio for high contrast themes. [225121] +* Improved reliability of the Windows Forms DataGrid control. [236488] +* Fixed control height scaling issues in DPI mode [236540] +* Fixed toolstrip scaling issues in DPI mode [236541] +* Fixed case-insensitivity issues with command line arguments in mage.exe .NET SDK tool. [245680] +* [High DPI support](https://msdn.microsoft.com/en-us/library/ms171868(v=vs.110).aspx#wf47) for winforms applications via app.config file. [272446], [284519], [297641], [297725], [297811], [365350] +* Fixed for the proper placement of anchored controls. [275828] +* Fixed control text truncations issue in a Visual Studio dialog. [280675] +* Enable [per-monitor scaling](https://msdn.microsoft.com/en-us/library/ms171868(v=vs.110).aspx#wf47) in DPI mode [292303] + +## Workflow + +* Support for propagating an activity exception as-is instead of throwing a Null Reference Exception. For details refer to [Application compatibility changes](https://msdn.microsoft.com/en-us/library/mt800102(v=vs.110).aspx). [155469] +* Previously when trying to use Visual Studio to debug XAML-based workflows on a machine with FIPS enabled, one would encounter a NullReferenceException. This has been resolved. However, in order to take advantage of this change, you will need to add the following to the App.Config file for the workflow application: +``` + + + +``` +For details refer to [Application compatibility changes](https://msdn.microsoft.com/en-us/library/mt800102(v=vs.110).aspx). [193017] +* SqlWorkflowInstanceStore database now defines Primary Key columns, allowing transactional replication. [206271] + +## WPF + +* WPF now uses [PrintDocumentPackageTarget](https://msdn.microsoft.com/en-us/library/mt800103(v=vs.110).aspx) instead of the deprecated XpsPrint API. [113979] +* Fixed crash in WPF when typing in text with specific language input [121579] +* The escape sequences have been unescaped in the URLs while converting from XAML to RTF. [132397] +* Fixed crash in DocumentView when receiving input from IMEs. [133072] +* Fixed ribbon crash when Alt + accelerator key is pressed to display the submenu. [170982] +* Previously, large amounts of connects and disconnects of tablet/stylus devices could result in WPF losing all touch support except for promoted mouse messages. This was due to a reference counting issue within WPF and its Windows side touch component (WISP). This change, along with the associated WISP change available in RS2, fixes this situation allowing large numbers of connects and disconnects. [174153] +* Conversion of BaselineOffset property has been added while converting from XAML to RTF and vice versa. [181850] +* Modernize touch stack [197685] +* Fixed crashes in Combobox [208379] +* Added support for alternative delimiter characters in markup. [210368] +* Fixed textbox focus issues [215639] +* Fixed out of memory issues with custom textbox. [216018] +* In some scenarios, shutting down input for a stylus/touch device (program shutdown or device disconnection) could result in a deadlock. This change alleviates that issue by fixing a timing problem with the WPF stylus/tablet initialization and shutdown code. [220285] +* In order to disable the WPF stylus/touch stack developers were previously using a private reflection mechanism. This provides a new mechanism in the form of an AppContext switch. Switch.System.Windows.Input.Stylus.DisableStylusAndTouchSupport set to true will fully disable the stylus/touch stack without requiring any private reflection or other workarounds. [221075] +* Inheritable properties propagate through a new link in the visual tree, including properties declared in a Style newly enabled by the link because a DynamicResource reference now resolves. [221837] +* [ImageSourceConverter.ConvertFromString](https://msdn.microsoft.com/en-us/library/mt800102(v=vs.110).aspx) now throws the correct DirectoryNotFoundException instead of NullReferenceException if called with an invalid path (only on apps targeting .NET Framework 4.7 and above) [223209] +* Fixed IOException crashes arising from Cursor.LoadFromStream, that could happen on application start. [227517] +* Fixed a deadlock arising from re-entrant COM requests while waiting for the lock protecting WPF's weak-event component. [234423] +* Scroll tracing now supports scenarios involving multiple instances of an ItemsControl with the same name, that enter and leave the visual tree dynamically. [234612] +* Some ItemsControls allow null to appear in the ItemsSource. If so, the automation for the control should allow null as well. An app that works in a normal environment should not crash in when automation is present. [239479] +* Fixed an ArgumentException arising from bindings on a non-Visual element declared in a DataGrid cell template. [240237] +* Improved Grid algorithm usages to allocate space to columns declared with *-width. For details refer to [Application compatibility changes](https://msdn.microsoft.com/en-us/library/mt800102(v=vs.110).aspx). [245278] +* Fixed crash arising from displaying certain sequences of Unicode characters deemed (by the font and by DWrite) to have negative advance width. [252835] +* Fixed a crash arising when running two instances of a process that creates multiple large packages when using System.IO.Packaging. [259773] +* When an exception interrupts a PropertyChanged or CollectionChanged notification raised on a worker thread, other such notifications continue to be processed normally. [260469] +* Fixed D3DImage memory leak. [261139] +* Fixed crashes in DataGrid with column virtualization enabled scenario. [274127] +* Improved reliability of anchored scroll scenarios. [282666] +* Support for Async and AddJob scenarios in printing. [292567] +* The content of the selected item in a TabControl is visible to UI Automation, even after changing IsEnabled (or other properties) on the TabItems. [365337] diff --git a/releases/net471/KnownIssues/470006-GC Crashes with high rate of large object allocation.md b/releases/net471/KnownIssues/470006-GC Crashes with high rate of large object allocation.md new file mode 100644 index 000000000..10ed0dd52 --- /dev/null +++ b/releases/net471/KnownIssues/470006-GC Crashes with high rate of large object allocation.md @@ -0,0 +1,45 @@ +# Rare crashes can occur when background GC is enabled in applications that allocate and free large objects at a high rate + +## Symptoms + +When background GC (BGC) is enabled, an application running on .NET Framework 4.7.1 experiences +intermittent crashes that did not occur when running on other .NET Framework versions. + +## Cause + +.NET Framework 4.7.1 includes changes that improve background GC performance. It allows large object allocations during part of the BGC sweep phase, and the large objects allocated during this time must be marked correctly in the allocator or they will be erroneously reclaimed. A GC can be triggered during the large object allocator code path, and if the following happens, this bug will be triggered: + +- This is a BGC. + +- The range for BGC changed from the previous range (ie, a new segment is allocated outside of the previous range). + +- The new large object is in the region that didn't exist in the previous range. + +- The new large object did its marking during the BGC sweep phase. + +This set of conditions make this bug very rare. + +Since GC doesn't shrink the range, it means this bug usually is only seen very early on during a process or when you suddenly allocate more large objects than before, which requires acquiring a new segment that's outside the heap range. + + +## Impact + +This problem impacts applications that run with the background GC enabled and that also allocate +and free large objects at a high rate. As described in the article [Fundamentals of Garbage Collection](https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals#the-managed-heap), +a large object is any object that is 85,000 bytes or larger in size. + +This problem is rare and is more likely to occur when running on the x86 version of the +.NET Framework 4.7.1 than when running on the x64 version of the .NET Framework 4.7.1. + +## Workarounds + +The most practical workaround is to disable background GC by setting the `enabled` attribute of the [ element](https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcconcurrent-element) in the + section of your application configuration file to `false`. + +The only other workaround is to change the application to allocate and free large objects +at a much lower rate. However, note that this workaround doesn't provide a guarantee; it just makes the chance of this bug happening smaller. + +## Resolution + +This problem is fixed in [.NET Framework 4.7.2](http://go.microsoft.com/fwlink/?LinkId=863281). + diff --git a/releases/net471/KnownIssues/479874-WPF Touch Stops Working After Prolonged Use of Popups.md b/releases/net471/KnownIssues/479874-WPF Touch Stops Working After Prolonged Use of Popups.md new file mode 100644 index 000000000..1948d4ca5 --- /dev/null +++ b/releases/net471/KnownIssues/479874-WPF Touch Stops Working After Prolonged Use of Popups.md @@ -0,0 +1,10 @@ +# WPF Touch Stops Working After Rapid/Prolonged Use Of Popups + +## Symptoms +On a touch or stylus-enabled machine, WPF applications may see a loss of touch or stylus after rapid or prolonged use of popups (e.g. ComboBoxes, DropDown Menus). + +## Cause +A change to disposal of HwndSource in .NET 4.7 caused Popups to not correctly cleanup touch resources. This eventually can lead to loss of touch/stylus interaction. + +## Resolution +This issue is fixed for all supported OS platforms prior to Windows 10 Fall Creators Update. The fix for Windows 10 Fall Creators Update is expected in a future servicing update. diff --git a/releases/net471/KnownIssues/481090-WPF Touch generates NullReferenceException in ProcessInputReport.md b/releases/net471/KnownIssues/481090-WPF Touch generates NullReferenceException in ProcessInputReport.md new file mode 100644 index 000000000..4712603e5 --- /dev/null +++ b/releases/net471/KnownIssues/481090-WPF Touch generates NullReferenceException in ProcessInputReport.md @@ -0,0 +1,10 @@ +# WPF Touch generates a NullReferenceException in WispLogic.ProcessInputReport + +## Symptoms +WPF throws a NullReferenceException in WispLogic.ProcessInputReport and the application may crash. + +## Cause +In WPF applications running on touch or stylus enabled machines, specific hardware and timing issues can cause touch messages to arrive without associated StylusDevices. When this occurs WPF tries to access this null StylusDevice, causing the error. + +## Resolution +This issue is fixed for all supported OS platforms prior to Windows 10 Fall Creators Update. The fix for Windows 10 Fall Creators Update is expected in a future servicing update. diff --git a/releases/net471/KnownIssues/489937-WPF Touch and Stylus AccessViolation in GetPenEventMultiple.md b/releases/net471/KnownIssues/489937-WPF Touch and Stylus AccessViolation in GetPenEventMultiple.md new file mode 100644 index 000000000..11863196d --- /dev/null +++ b/releases/net471/KnownIssues/489937-WPF Touch and Stylus AccessViolation in GetPenEventMultiple.md @@ -0,0 +1,10 @@ +# WPF Touch/Stylus Generates AccessViolations and Heap Corruption in GetPenEventMultiple + +## Symptoms +On a touch or stylus-enabled machine, WPF applications may sometimes corrupt memory and crash in the internal function GetPenEventMultiple in the PenIMC2_v0400 DLL. + +## Cause +This is due to the release of a COM object that is later used in the WPF touch stack. + +## Resolution +This issue is fixed for all supported OS platforms prior to Windows 10 Fall Creators Update. The fix for Windows 10 Fall Creators Update is expected in a future servicing update. diff --git a/releases/net471/KnownIssues/493108-WPF InvalidCastException when displaying a checked MenuItem.md b/releases/net471/KnownIssues/493108-WPF InvalidCastException when displaying a checked MenuItem.md new file mode 100644 index 000000000..50ee11b0a --- /dev/null +++ b/releases/net471/KnownIssues/493108-WPF InvalidCastException when displaying a checked MenuItem.md @@ -0,0 +1,33 @@ +# WPF InvalidCastException when displaying a checked MenuItem + +## Symptoms +WPF throws an InvalidCastException when an application displays a MenuItem, +provided the following conditions are all met: + + * The application is running on a server. + * The MenuItem is checked (MenuItem.IsChecked = true). + * The MenuItem is a sub-menu item (MenuItem.Role = SubmenuItem). + * The MenuItem is a descendant of a RibbonWindow. + * The RibbonWindow comes from the out-of-band ("toolkit") version of the WPF ribbon control library. + +The InvalidCastException's message is akin to + + Unable to cast object of type 'System.Windows.Style' to type 'System.Windows.Media.Geometry' + +and the callstack begins with + + at System.Windows.Shapes.Path.get_Data() + at System.Windows.Shapes.Path.get_DefiningGeometry() + at System.Windows.Shapes.Shape.GetNaturalSize() + at System.Windows.Shapes.Shape.MeasureOverride() + +## Cause +The exception is due to a resource key conflict between the ribbon library and the theme +file for server machines (PresentationFramework.AeroLite.dll). Both declare resources +using the same key. The theme file includes a DynamicResource reference intended to find +the Geometry describing the MenuItem's checkmark, but in the circumstances described above +the reference resolves to the ribbon library's resource. This effectively sets the value +of Path.Data to an object of type Style. The next measure pass then encounters the exception. + +## Resolution +This issue is fixed for all supported OS platforms prior to Windows 10 Fall Creators Update. The fix for Windows 10 Fall Creators Update is expected in a future servicing update. diff --git a/releases/net471/KnownIssues/510901-BCL Apps targeting .NET-4.6.1 that use .NET Standard libraries might be broken when running on .NET 4.7.1.md b/releases/net471/KnownIssues/510901-BCL Apps targeting .NET-4.6.1 that use .NET Standard libraries might be broken when running on .NET 4.7.1.md new file mode 100644 index 000000000..60b04d66b --- /dev/null +++ b/releases/net471/KnownIssues/510901-BCL Apps targeting .NET-4.6.1 that use .NET Standard libraries might be broken when running on .NET 4.7.1.md @@ -0,0 +1,63 @@ +# Applications targeting .NET 4.6.1 that use .NET Standard libraries might be broken when running on .NET 4.7.1 + +## Symptoms + +Applications that target the .NET Framework 4.6.1 and use .NET Standard libraries may experience System.TypeLoadException exceptions when running on the .NET Framework 4.7.1 + +## Cause + +The .NET Framework 4.7.1 adds support for .NET Standard in-box. As part of this change, a few assemblies that used to ship independently from the .NET Framework have now been added to the .NET Framework. As these .NET Standard assemblies were not part of the .NET Framework prior to .NET 4.7.1, they were deployed with the application, and a binding redirect was added to the application's app.config file. + +When running on the .NET Framework 4.7.1, where the assemblies are now part of the Framework, the application now has two types with different identities, and that leads to a TypeLoadException. One type comes from the app-local assembly, and the other one comes from the .NET Framework assembly. + +Also reported here: https://github.com/Microsoft/dotnet-framework-early-access/issues/9 + +## Impact + +The following types are potentially impacted by this issue. + +- System.Data.Common.DbColumn +- System.Data.Common.DbDataReaderExtensions +- System.Data.Common.IDbColumnSchemaGenerator +- System.Diagnostics.StackFrameExtensions +- System.Globalization.GlobalizationExtensions +- System.Net.Sockets.SocketReceiveFromResult +- System.Net.Sockets.SocketReceiveMessageFromResult +- System.Net.Sockets.SocketTaskExtensions +- System.Runtime.CompilerServices.TupleElementNamesAttribute +- System.Runtime.InteropServices.Architecture +- System.Runtime.InteropServices.OSPlatform +- System.Runtime.InteropServices.RuntimeInformation +- System.Runtime.Serialization.DataContractSerializerExtensions +- System.Runtime.Serialization.ISerializationSurrogateProvider +- System.Security.Cryptography.ECCurve +- System.Security.Cryptography.ECParameters +- System.Security.Cryptography.ECPoint +- System.Security.Cryptography.IncrementalHash +- System.Security.SecureStringMarshal +- System.StringNormalizationExtensions +- System.Threading.PreAllocatedOverlapped +- System.Threading.ThreadPoolBoundHandle +- System.TupleExtensions +- System.ValueTuple +- System.ValueTuple`1 +- System.ValueTuple`2 +- System.ValueTuple`3 +- System.ValueTuple`4 +- System.ValueTuple`5 +- System.ValueTuple`6 +- System.ValueTuple`7 +- System.ValueTuple`8 +- System.Xml.XPath.XDocumentExtensions + +## Workarounds + +There are two ways to work around this issue: + - When running on .NET Framework 4.7.1, remove the binding redirects from the app.config file for the assemblies that are now part of the .NET Framework. + - Re-target your application to target the .NET Framwork 4.7 or .NET Framework 4.7.1. + +## Resolution + +[09-Jan-2018] The fix for this issue is included in the [Update for .NET Framework 4.7.1 - KB4054856](http://go.microsoft.com/fwlink/?LinkId=866028) for all platforms except Windows 10 Fall Creators Update. + +For Windows 10 Fall Creators Update the fix is included in [KB4058258](https://support.microsoft.com/help/4058258/windows-10-update-kb4058258). diff --git a/releases/net471/KnownIssues/514195-Targeting .NET Framework 4.7.1 copies extra files to your bin directory.md b/releases/net471/KnownIssues/514195-Targeting .NET Framework 4.7.1 copies extra files to your bin directory.md new file mode 100644 index 000000000..0f7da2b81 --- /dev/null +++ b/releases/net471/KnownIssues/514195-Targeting .NET Framework 4.7.1 copies extra files to your bin directory.md @@ -0,0 +1,24 @@ +# Targeting .NET Framework 4.7.1 copies extra files to your bin directory + +## Symptoms + +When building an application that targets .NET Framework 4.7.1, Visual Studio 15.6.3 tools copy 12 assemblies into your bin directory if it consumes one or more .NET Standard-based components. +This results in the bin output of your application being larger and including more files. + +## Cause + +.NET types live in different assemblies depending on the .NET implementation you are running in. A simple example is the String class, which lives in mscorlib.dll on .NET Framework, in netstandard.dll when you target .NET Standard 2.0, and in System.Runtime.dll when you target .NET Standard 1.x. For a library targeting one .NET implementation to load successfully when running on a compatible one, runtime facades (with type-forwards) are ordinarily used to reroute the references to the all of the types that live in different places. + +.NET Framework 4.7.1 intended to have full support for running .NET Standard 2.0 assets, but we found some bugs on 12 assemblies that would cause some types to not get forwarded correctly. Patching those 12 assemblies is not viable since then the applications would require the patch to be installed on end-user machines in order to function correctly. + +## Impact + +This problem occurs when building an application that targets .NET Framework 4.7.1 and consumes .NET Standard-based assets. + +## Workaround + +There is no way to remove the extra assemblies in your bin directory when targeting .NET Framework 4.7.1. The only workaround is to recompile your app to target the .NET Framework 4.7.2 or later, where this issue has been addressed. + +## Resolution + +This problem is fixed in [.NET Framework 4.7.2](http://go.microsoft.com/fwlink/?LinkId=863281). diff --git a/releases/net471/KnownIssues/517815-BCL Applications making heavy use of System.Diagnostics.StackTrace might run more slowly on .NET 4.7.1.md b/releases/net471/KnownIssues/517815-BCL Applications making heavy use of System.Diagnostics.StackTrace might run more slowly on .NET 4.7.1.md new file mode 100644 index 000000000..e089f5bcf --- /dev/null +++ b/releases/net471/KnownIssues/517815-BCL Applications making heavy use of System.Diagnostics.StackTrace might run more slowly on .NET 4.7.1.md @@ -0,0 +1,29 @@ +# Applications making heavy use of System.Diagnostics.StackTrace or Exception.StackTrace might run more slowly on the .NET Framework 4.7.1 + +## Symptoms + +An application that had acceptable performance running on the .NET Framework 4.7 or earlier versions executes more slowly when running on the .NET Framework 4.7.1 + +## Cause + +The .NET Framework 4.7.1 added support for detecting and parsing the Portable PDB file format to show file and line number information in stack traces. As part of this change, each function in a +stack trace has its defining module checked to determine if that module uses the Portable PDB format. Due to some differences in the internal caching policy, the +runtime spends far more time searching for Portable PDBs than previous .NET Framework versions spent searching for classic Windows PDBs. This causes formatted stack traces to be +produced more slowly than before. + +The issue was originally reported here: https://github.com/Microsoft/dotnet/issues/529 + +## Workarounds + +Call the [System.Diagnostics.StackTrace.#ctor(Boolean)](https://docs.microsoft.com/dotnet/api/system.diagnostics.stacktrace.-ctor?view=netframework-4.7.1#System_Diagnostics_StackTrace__ctor_System_Boolean_) constructor with `false` argument to avoid capturing source information. This avoids the portion of the code where performance +regressed. + +## Resolution + +[09-Jan-2018] The fix for this issue is available as follows: +- For Windows 10 Fall Creators Update, see the update https://support.microsoft.com/en-us/help/4058258/windows-10-update-kb4058258. +- For all other platforms, the fix for this issue is included in the [Update for .NET Framework 4.7.1 - KB4054856](http://go.microsoft.com/fwlink/?LinkId=866028). + +This fix removes the Portable PDB functionality from 4.7.1. In [.NET Framework 4.7.2](http://go.microsoft.com/fwlink/?LinkId=863281), we anticipate having an improved fix available which both performs well and re-enables the portable PDB functionality. + + diff --git a/releases/net471/KnownIssues/517815-BCL Stack traces are missing source information for frames with debug information in the Portable PDB format.md b/releases/net471/KnownIssues/517815-BCL Stack traces are missing source information for frames with debug information in the Portable PDB format.md new file mode 100644 index 000000000..8be3b104d --- /dev/null +++ b/releases/net471/KnownIssues/517815-BCL Stack traces are missing source information for frames with debug information in the Portable PDB format.md @@ -0,0 +1,20 @@ + +# Stack traces are missing source information for frames with debug information in the Portable PDB format when running on .NET Framework 4.7.1 + +## Symptoms + +An application that formats stack traces is missing source information for some or all frames. This includes stack traces formatted via [System.Exception.ToString()](https://docs.microsoft.com/en-us/dotnet/api/system.exception.tostring?view=netframework-4.7.1), [System.Exception.StackTrace](https://docs.microsoft.com/en-us/dotnet/api/system.exception.stacktrace?view=netframework-4.7.1) and [System.Diagnostics.StackTrace.ToString()](https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stacktrace.tostring?view=netframework-4.7.1). +The frames missing source information reside in assemblies that have pdbs in the [Portable PDB format](https://github.com/dotnet/core/blob/master/Documentation/diagnostics/portable_pdb.md) present on disk. + +## Cause + +The .NET Framework 4.7.1 added support for detecting and parsing the Portable PDB file format to show file and line number information in stack traces. However, due to an [implementation issue](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/517815-BCL%20Applications%20making%20heavy%20use%20of%20System.Diagnostics.StackTrace%20might%20run%20more%20slowly%20on%20.NET%204.7.1.md), the feature had an unacceptable performance impact and Microsoft intentionally disabled it. + +## Workarounds + +- If you control the build process for the problematic assemblies you may be able to configure it to generate the classic Windows PDB format instead. +- You can use the [PDB conversion tool](https://github.com/dotnet/symreader-converter) to convert the Portable PDBs into the classic Windows PDB format and deploy those with the application instead. + +## Resolution + +A fix is anticipated in .NET Framework 4.7.2 in the near future that restores Portable PDB functionality with greatly improved performance. diff --git a/releases/net471/KnownIssues/521954 - BCL CultureAwareComparer with ignore casing on serialized on previous versions of .NET do not correctly deserialize on .NET 4.7.1.md b/releases/net471/KnownIssues/521954 - BCL CultureAwareComparer with ignore casing on serialized on previous versions of .NET do not correctly deserialize on .NET 4.7.1.md new file mode 100644 index 000000000..03b31f030 --- /dev/null +++ b/releases/net471/KnownIssues/521954 - BCL CultureAwareComparer with ignore casing on serialized on previous versions of .NET do not correctly deserialize on .NET 4.7.1.md @@ -0,0 +1,32 @@ +# CultureAwareComparer with ignore casing serialized on previous versions of .NET Framework does not correctly deserialize on .NET Framework 4.7.1 + +## Symptoms + +When deserializing a CultureAwareComparer that was serialized using ignore case on a previous version of .NET Framework on a machine running .NET Framework 4.7.1, the comparer becomes case sensitive. + +## Cause + +In the .NET Framework 4.7.1 we added the ability to specify more comparer options when doing a culture-aware comparison. +As part of that change we introduced a new field on the comparer that holds the information about what kind of comparison is requested. + +When that type, coming from a version of .NET Framework prior to 4.7.1 is deserialized on a .NET Framework 4.7.1 machine, the private field introduced in the .NET Framework 4.7.1 is reset to zero, which makes the comparer case sensitive. + +## Impact + +The following 2 comparers are susceptible to this issue. These comparers are usually used with collection types like Dictionary and Hashtable. +P:System.StringComparer.InvariantCultureIgnoreCase +P:System.StringComparer.CurrentCultureIgnoreCase + +## Workarounds + +Ensure that both serialization and deserialization occurs on systems running a version of the .NET Framework starting with 4.7.1. + +## Resolution + +If you are running on Windows 10 Fall Creators Update, an update is available that addresses this issue. Select one of the following links based on your processor architecture: + + x86: https://go.microsoft.com/fwlink/?linkid=862758 + + x64: https://go.microsoft.com/fwlink/?linkid=862762 + +[09-Jan-2018] The fix for this issue is included in the [Update for .NET Framework 4.7.1 - KB4054856](http://go.microsoft.com/fwlink/?LinkId=866028) for all platforms except Windows 10 Fall Creators Update. \ No newline at end of file diff --git a/releases/net471/KnownIssues/523633 - Setup - OS upgrade to Windows 10 gets the product in bad state.md b/releases/net471/KnownIssues/523633 - Setup - OS upgrade to Windows 10 gets the product in bad state.md new file mode 100644 index 000000000..0d4c0081d --- /dev/null +++ b/releases/net471/KnownIssues/523633 - Setup - OS upgrade to Windows 10 gets the product in bad state.md @@ -0,0 +1,23 @@ +# Application crashes occur when running on the .NET Framework 4.7.1 after upgrading from Windows 10 Anniversary Update to Windows 10 Creators Update + +## Symptoms +When you install the .NET Framework 4.7.1 on Windows 10 Anniversary Update (version 1607) and your system is upgraded to Windows 10 Creators Update (version 1703), applications that depend on any version of the .NET Framework 4.x may experience unexpected crashes. + +Consider the following scenario: + 1. On a Windows 10 Anniversary Update (version 1607) machine, install the .NET Framework 4.7.1. + 2. Upgrade the machine to Windows 10 Creators Update (version 1703) from Windows Update. + 3. Run an application that uses any version of .NET 4.X. + 4. The application experiences an unexpected crash. + +Note: Windows 10 Anniversary Update (version 1607) comes pre-installed with .NET Framework 4.6.2, and you can install .NET 4.7.1 on it using an offline (or web) installer. Similarly, Windows 10 Creators Update (version 1703) comes pre-installed with .NET Framework 4.7. + +## Cause +This issue occurs because the .NET Framework 4.7.1 product installation gets into a corrupted state after the OS upgrade. The OS upgrade preserves all the .NET Framework 4.7.1 assemblies in the GAC as is, but the in-box assemblies are reverted to the in-box version (4.7). Due to this mixed state, the .NET applications exhibit unexpected behaviors. + +## Impact +Applications may experience unexpected crashes in certain scenarios. For example, Visual Studio will experience a crash soon after opening a C# or VB project when .NET Framework is in this corrupted state. + +Note: This issue does not occur when you do an upgrade from Windows 10 Anniversary Update (version 1607) to Windows 10 Fall Creators Update (version 1709). + +## Resolution +To get the .NET Framework 4.7.1 product into a working state, you need to reinstall [.NET Framework 4.7.1](http://go.microsoft.com/fwlink/?LinkId=852107). diff --git a/releases/net471/KnownIssues/534719-Networking ServicePoint.ConnectionLimit default behavior with loopback changed unexpectedly.md b/releases/net471/KnownIssues/534719-Networking ServicePoint.ConnectionLimit default behavior with loopback changed unexpectedly.md new file mode 100644 index 000000000..cbcae13ab --- /dev/null +++ b/releases/net471/KnownIssues/534719-Networking ServicePoint.ConnectionLimit default behavior with loopback changed unexpectedly.md @@ -0,0 +1,74 @@ +# ServicePoint.ConnectionLimit default behavior with loopback changed unexpectedly + +## Symptoms +The limit for HTTP connections per endpoint is controlled by the `ServicePointManager.DefaultConnectionLimit` property. +This value defaults to 2. In the .NET Framework 4.7 and earlier versions, the limit applied only to non-loopback +addresses such as http://www.microsoft.com. For loopback addresses such as http://localhost, the limit for connections +was always int.MaxValue (2,147,483,647) unless changed by calling the `ServicePoint.ConnectionLimit` API. + +In the .NET Framework 4.7.1 when using HttpClient APIs, the connection limit for loopback addresses now matches the limit +for non-loopback addresses. Thus, the default limit is 2. This can cause applications to run slower or hang when +doing multiple, parallel, requests to the http://localhost addresses. + +Here is code that shows the problem: + +```c# +using System; +using System.Net; +using System.Net.Http; + +namespace ConsoleApp +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine($"ServicePointManager.DefaultConnectionLimit: {ServicePointManager.DefaultConnectionLimit}"); + + var uriLoopback = new Uri("http://localhost/"); + var uriExternal = new Uri("http://www.microsoft.com/"); + + Console.WriteLine("Before using HttpClient APIs"); + ServicePoint spLoopback = ServicePointManager.FindServicePoint(uriLoopback); + Console.WriteLine($"{uriLoopback.AbsoluteUri}, ConnectionLimit (should be {int.MaxValue}): {spLoopback.ConnectionLimit}"); + + ServicePoint spExternal = ServicePointManager.FindServicePoint(uriExternal); + Console.WriteLine($"{uriExternal.AbsoluteUri}, ConnectionLimit (should be {ServicePointManager.DefaultConnectionLimit}): {spExternal.ConnectionLimit}"); + + Console.WriteLine("Use HttpClient APIs"); + var client = new HttpClient(); + try + { + HttpResponseMessage response = client.GetAsync(uriLoopback).Result; + } + catch (Exception) + { + // Ignore any network error since there is probably not a loopback server present. + } + + Console.WriteLine("After using HttpClient APIs"); + + // BUG - due to the bug in .NET Framework 4.7.1, the ConnectionLimit for this loopback ServicePoint is changed + // unexpectedly. + Console.WriteLine($"{uriLoopback.AbsoluteUri}, ConnectionLimit (should be {int.MaxValue}): {spLoopback.ConnectionLimit}"); + } + } +} +``` + +## Cause +Changes in .NET Framework 4.7.1 to the `System.Net.Http.HttpClientHandler` class caused this problem. + +## Resolution +To work around the problem using HttpClient APIs, you can use the following code to increase the connection limit. +This code should be added before calling any HttpClient APIs. + +```c# +ServicePointManager.DefaultConnectionLimit = 20; // Actual value should be based on your requirements. +``` + +Note: This will also change the limits for non-loopback addresses. + +## More information +This issue was fixed in the [August 2018 Security and Quality Rollup](https://blogs.msdn.microsoft.com/dotnet/2018/08/14/august-2018-security-and-quality-rollup/). +Installing this or later updates will correct the problem. diff --git a/releases/net471/KnownIssues/534719-Networking.ServicePoint.ConnectionLimit default behavior changed.md b/releases/net471/KnownIssues/534719-Networking.ServicePoint.ConnectionLimit default behavior changed.md new file mode 100644 index 000000000..85cc125f0 --- /dev/null +++ b/releases/net471/KnownIssues/534719-Networking.ServicePoint.ConnectionLimit default behavior changed.md @@ -0,0 +1,65 @@ +# Changes to ServicePoint.ConnectionLimit are overriden by usage of HttpClient + +## Symptoms +The limit for HTTP connections per endpoint is controlled by the `ServicePointManager.DefaultConnectionLimit` property. +This value defaults to 2. This can be overriden programatically or in configuration for either specific hosts or for all hosts. In the .NET Framework 4.7.1, any usage of HttpClient APIs reverts any host-specific overrides to the default value of 2. This can cause applications to run slower or hang when doing multiple parallel requests. + +Note: This bug also changes the http://localhost host default from Int32.MaxValue to 2. + +Here is code that shows the problem: + +```c# +using System; +using System.Net; +using System.Net.Http; + +namespace ConsoleApp +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine($"ServicePointManager.DefaultConnectionLimit: {ServicePointManager.DefaultConnectionLimit}"); + + var uri = new Uri("http://www.microsoft.com/"); ; + + Console.WriteLine("Before using HttpClient APIs, before changing ConnectionLimit"); + ServicePoint sp = ServicePointManager.FindServicePoint(uri); + Console.WriteLine($"{uri.AbsoluteUri}, ConnectionLimit (should be {ServicePointManager.DefaultConnectionLimit}): {sp.ConnectionLimit}"); + sp.ConnectionLimit = 10; + Console.WriteLine("Before using HttpClient APIs, after changing ConnectionLimit"); + Console.WriteLine($"{uri.AbsoluteUri}, ConnectionLimit (should be 10): {sp.ConnectionLimit}"); + + Console.WriteLine("Use HttpClient APIs"); + var client = new HttpClient(); + try + { + HttpResponseMessage response = client.GetAsync(uri).Result; + } + catch (Exception) + { + // Ignore any network error + } + + Console.WriteLine("After using HttpClient APIs"); + + // BUG - due to the bug in .NET Framework 4.7.1, the ConnectionLimit for this ServicePoint is changed + Console.WriteLine($"{uri.AbsoluteUri}, ConnectionLimit (should be 10): {sp.ConnectionLimit}"); + } +} +``` + +## Cause +Changes in .NET Framework 4.7.1 to the `System.Net.Http.HttpClientHandler` class caused this problem. + +## Resolution +To work around the problem using HttpClient APIs, you can use the following code to increase the default connection limit for all endpoints. This will affect all connections in the process. +This code should be added before calling any HttpClient APIs. + +```c# +ServicePointManager.DefaultConnectionLimit = 20; // Actual value should be based on your requirements. +``` + +## More information +This issue was fixed in the [August 2018 Security and Quality Rollup](https://blogs.msdn.microsoft.com/dotnet/2018/08/14/august-2018-security-and-quality-rollup/). +Installing this or later updates will correct the problem. diff --git a/releases/net471/KnownIssues/553390 - BCL - SGEN crashes because it references System.IO.Compression.ZipFile.dll.md b/releases/net471/KnownIssues/553390 - BCL - SGEN crashes because it references System.IO.Compression.ZipFile.dll.md new file mode 100644 index 000000000..ff72e19c1 --- /dev/null +++ b/releases/net471/KnownIssues/553390 - BCL - SGEN crashes because it references System.IO.Compression.ZipFile.dll.md @@ -0,0 +1,48 @@ +# SGEN crashes trying to load the System.IO.Compression.FileSystem reference assembly + +## Symptoms + +When building an application that uses the [XML Serializer Generator Tool (SGen.exe)](https://docs.microsoft.com/en-us/dotnet/standard/serialization/xml-serializer-generator-tool-sgen-exe), you get an error similar to this one: + +``` +An attempt was made to load an assembly with an incorrect format: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1\Facades\System.IO.Compression.ZipFile.dll. +``` + +## Cause + +.NET Framework 4.7.1 includes a few new assemblies in order to support .NET Standard 2.0. +For those assemblies, we added entries in a .NET Framework unification table to ensure that assemblies with different versions will correctly unify to a single one. +For the `System.IO.Compression.FileSystem` the information captured in the unification table is incorrect. + +This causes the assembly to not be correctly unified by the .NET Framework and in turn causes SGEN to give out that error. + +## Impact + +This problem occurs when building the applications that use the SGEN tool. + +## Workaround + +Add the following targets to the project that is experiencing this issue. +The targets remove the reference assemblies from the ReferencePath set that SGEN uses before the serialization assemblies are produced and adds them back after they are produced. + +```xml + + + + <_FilterOutFromReferencePath Include="@(_DesignTimeFacadeAssemblies_Names->'%(OriginalIdentity)')" + Condition="'@(DesignFacadesToFilter)' == '@(_DesignTimeFacadeAssemblies_Names)' and '%(Identity)' != ''" /> + + + + + + + + + + +``` + +## Resolution + +This problem is fixed in [.NET Framework 4.7.2](http://go.microsoft.com/fwlink/?LinkId=863281). diff --git a/releases/net471/KnownIssues/623552-BCL Higher assembly versions that 4.0.0.0 for System.IO.Compression.ZipFile cannot be loaded without a binding redirect.md b/releases/net471/KnownIssues/623552-BCL Higher assembly versions that 4.0.0.0 for System.IO.Compression.ZipFile cannot be loaded without a binding redirect.md new file mode 100644 index 000000000..bfd9944d7 --- /dev/null +++ b/releases/net471/KnownIssues/623552-BCL Higher assembly versions that 4.0.0.0 for System.IO.Compression.ZipFile cannot be loaded without a binding redirect.md @@ -0,0 +1,36 @@ +# Assembly versions higher than 4.0.0.0 for System.IO.Compression.ZipFile cannot be loaded without a binding redirect + +## Symptoms + +When building an application that targets .NET Framework 4.7.1, if you reference a .NET Standard 1.x library that uses types from the ZipFile assembly, a runtime error like the following results: + +``` +Error: Exception: System.IO.FileNotFoundException, Could not load file or assembly 'System.IO.Compression.ZipFile, Version=4.0.3.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' or one of its dependencies. The system cannot find the file specified. +``` + +## Cause + +The issue is caused by a bug in the runtime unification table for .NET Framework 4.7.1 for this assembly. The bug prevents the unification of the 4.0.3.0 version of the assembly to the 4.0.0.0 version that is present on the machine. + +## Impact + +This problem occurs when building an application that targets .NET Framework 4.7.1 and consumes .NET Standard-based assets. + +## Workaround + +To address this problem, you can manually add the following binding redirect in your application's config file: + +```xml + + + + + + + + +``` + +## Resolution + +This problem is fixed in [.NET Framework 4.7.2](http://go.microsoft.com/fwlink/?LinkId=863281). diff --git a/releases/net471/README.md b/releases/net471/README.md new file mode 100644 index 000000000..8ed6f45ae --- /dev/null +++ b/releases/net471/README.md @@ -0,0 +1,25 @@ +# .NET Framework 4.7.1 Release Notes + +You can learn about the changes made in the .NET Framework 4.7.1. + +- [Download](http://go.microsoft.com/fwlink/?LinkId=852095) +- [.NET Framework 4.7.1 Announcement blog post](http://go.microsoft.com/fwlink/?LinkId=852091) +- [Release notes](dotnet471-changes.md) +- [Application compatibility](http://go.microsoft.com/fwlink/?LinkId=852106) +- [API changes](dotnet471-api-changes.md) +- [Reference Source](http://go.microsoft.com/fwlink/?LinkId=852103) +- [Known issues](dotnet471-known-issues.md) + +## Release Notes by Product Area + +- [ASP.NET](dotnet471-changes.md#aspnet) +- [BCL](dotnet471-changes.md#bcl) +- [CLR](dotnet471-changes.md#clr) +- [Compiler and Managed Languages](dotnet471-changes.md#Compiler-and-Managed-Languages) +- [Configuration](dotnet471-changes.md#Configuration) +- [Networking](dotnet471-changes.md#networking) +- [SQL](dotnet471-changes.md#sql) +- [WCF](dotnet471-changes.md#wcf) +- [Windows Forms](dotnet471-changes.md#windows-forms) +- [Workflow](dotnet471-changes.md#workflow) +- [WPF](dotnet471-changes.md#wpf) diff --git a/releases/net471/dotnet471-api-changes.md b/releases/net471/dotnet471-api-changes.md new file mode 100644 index 000000000..e86640074 --- /dev/null +++ b/releases/net471/dotnet471-api-changes.md @@ -0,0 +1,461 @@ +```diff + namespace System { ++ public static class StringNormalizationExtensions { ++ public static bool IsNormalized(this string value); ++ public static bool IsNormalized(this string value, NormalizationForm normalizationForm); ++ public static string Normalize(this string value); ++ public static string Normalize(this string value, NormalizationForm normalizationForm); ++ } +- public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple { ++ public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple, ITupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple { ++ public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple, ITupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple { ++ public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple, ITupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple { ++ public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple, ITupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple { ++ public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple, ITupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple { ++ public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple, ITupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple { ++ public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple, ITupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple { ++ public class Tuple : IComparable, IStructuralComparable, IStructuralEquatable, ITuple, ITupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, Size=1)] +- public struct ValueTuple : IComparable, IComparable, IEquatable, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential, Size=1)] ++ public struct ValueTuple : IComparable, IComparable, IEquatable, IStructuralComparable, IStructuralEquatable, ITuple, IValueTupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] +- public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITuple, IValueTupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITuple, IValueTupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITuple, IValueTupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITuple, IValueTupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITuple, IValueTupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITuple, IValueTupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal { ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITuple, IValueTupleInternal { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } +- public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITupleInternal where TRest : struct { ++ public struct ValueTuple : IComparable, IComparable>, IEquatable>, IStructuralComparable, IStructuralEquatable, ITuple, IValueTupleInternal where TRest : struct { ++ object System.Runtime.CompilerServices.ITuple.this[int index] { get; } ++ int System.Runtime.CompilerServices.ITuple.Length { get; } + } + } + namespace System.Configuration { ++ public abstract class ConfigurationBuilder : ProviderBase { ++ protected ConfigurationBuilder(); ++ public virtual ConfigurationSection ProcessConfigurationSection(ConfigurationSection configSection); ++ public virtual XmlNode ProcessRawXml(XmlNode rawXml); ++ } ++ public class ConfigurationBuilderCollection : ProviderCollection { ++ public ConfigurationBuilderCollection(); ++ public new ConfigurationBuilder this[string name] { get; } ++ public override void Add(ProviderBase builder); ++ } ++ public class ConfigurationBuilderSettings : ConfigurationElement { ++ public ConfigurationBuilderSettings(); ++ public ProviderSettingsCollection Builders { get; } ++ protected internal override ConfigurationPropertyCollection Properties { get; } ++ } ++ public sealed class ConfigurationBuildersSection : ConfigurationSection { ++ public ConfigurationBuildersSection(); ++ public ProviderSettingsCollection Builders { get; } ++ public ConfigurationBuilder GetBuilderFromName(string builderName); ++ } + public sealed class SectionInformation { ++ public ConfigurationBuilder ConfigurationBuilder { get; } + } + } + namespace System.Configuration.Internal { +- public class DelegatingConfigHost : IInternalConfigHost { ++ public class DelegatingConfigHost : IInternalConfigHost, IInternalConfigurationBuilderHost { ++ protected IInternalConfigurationBuilderHost ConfigBuilderHost { get; } ++ public virtual ConfigurationSection ProcessConfigurationSection(ConfigurationSection configSection, ConfigurationBuilder builder); ++ public virtual XmlNode ProcessRawXml(XmlNode rawXml, ConfigurationBuilder builder); + } ++ public interface IInternalConfigurationBuilderHost { ++ ConfigurationSection ProcessConfigurationSection(ConfigurationSection configSection, ConfigurationBuilder builder); ++ XmlNode ProcessRawXml(XmlNode rawXml, ConfigurationBuilder builder); ++ } + } + namespace System.Data.Common { ++ public abstract class DbColumn { ++ protected DbColumn(); ++ public Nullable AllowDBNull { get; protected set; } ++ public string BaseCatalogName { get; protected set; } ++ public string BaseColumnName { get; protected set; } ++ public string BaseSchemaName { get; protected set; } ++ public string BaseServerName { get; protected set; } ++ public string BaseTableName { get; protected set; } ++ public string ColumnName { get; protected set; } ++ public Nullable ColumnOrdinal { get; protected set; } ++ public Nullable ColumnSize { get; protected set; } ++ public Type DataType { get; protected set; } ++ public string DataTypeName { get; protected set; } ++ public Nullable IsAliased { get; protected set; } ++ public Nullable IsAutoIncrement { get; protected set; } ++ public Nullable IsExpression { get; protected set; } ++ public Nullable IsHidden { get; protected set; } ++ public Nullable IsIdentity { get; protected set; } ++ public Nullable IsKey { get; protected set; } ++ public Nullable IsLong { get; protected set; } ++ public Nullable IsReadOnly { get; protected set; } ++ public Nullable IsUnique { get; protected set; } ++ public virtual object this[string property] { get; } ++ public Nullable NumericPrecision { get; protected set; } ++ public Nullable NumericScale { get; protected set; } ++ public string UdtAssemblyQualifiedName { get; protected set; } ++ } ++ public static class DbDataReaderExtensions { ++ public static bool CanGetColumnSchema(this DbDataReader reader); ++ public static ReadOnlyCollection GetColumnSchema(this DbDataReader reader); ++ } ++ public interface IDbColumnSchemaGenerator { ++ ReadOnlyCollection GetColumnSchema(); ++ } + } + namespace System.Diagnostics { ++ public static class StackFrameExtensions { ++ public static IntPtr GetNativeImageBase(this StackFrame stackFrame); ++ public static IntPtr GetNativeIP(this StackFrame stackFrame); ++ public static bool HasILOffset(this StackFrame stackFrame); ++ public static bool HasMethod(this StackFrame stackFrame); ++ public static bool HasNativeImage(this StackFrame stackFrame); ++ public static bool HasSource(this StackFrame stackFrame); ++ } + } + namespace System.Diagnostics.Tracing { ++ public class EventCounter { ++ public EventCounter(string name, EventSource eventSource); ++ public void WriteMetric(float value); ++ } + } + namespace System.Globalization { ++ public static class GlobalizationExtensions { ++ public static StringComparer GetStringComparer(this CompareInfo compareInfo, CompareOptions options); ++ } + } + namespace System.Linq { + public static class Enumerable { ++ public static IEnumerable Append(this IEnumerable source, TSource element); ++ public static IEnumerable Prepend(this IEnumerable source, TSource element); + } + } + namespace System.Linq.Expressions { + public sealed class Expression : LambdaExpression { ++ public new TDelegate Compile(bool preferInterpretation); + } + public abstract class LambdaExpression : Expression { ++ public Delegate Compile(bool preferInterpretation); + } + } + namespace System.Messaging { + public enum HashAlgorithm { ++ Sha256 = 32780, ++ Sha384 = 32781, ++ Sha512 = 32782, + } + } + namespace System.Net.Http { + public class HttpClientHandler : HttpMessageHandler { ++ public bool CheckCertificateRevocationList { get; set; } ++ public X509CertificateCollection ClientCertificates { get; } ++ public ICredentials DefaultProxyCredentials { get; set; } ++ public int MaxConnectionsPerServer { get; set; } ++ public int MaxResponseHeadersLength { get; set; } ++ public IDictionary Properties { get; } ++ public Func ServerCertificateCustomValidationCallback { get; set; } ++ public SslProtocols SslProtocols { get; set; } + } + } + namespace System.Net.Sockets { ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct SocketReceiveFromResult { ++ public int ReceivedBytes; ++ public EndPoint RemoteEndPoint; ++ } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct SocketReceiveMessageFromResult { ++ public IPPacketInformation PacketInformation; ++ public int ReceivedBytes; ++ public EndPoint RemoteEndPoint; ++ public SocketFlags SocketFlags; ++ } ++ public static class SocketTaskExtensions { ++ public static Task AcceptAsync(this Socket socket); ++ public static Task AcceptAsync(this Socket socket, Socket acceptSocket); ++ public static Task ConnectAsync(this Socket socket, EndPoint remoteEP); ++ public static Task ConnectAsync(this Socket socket, IPAddress address, int port); ++ public static Task ConnectAsync(this Socket socket, IPAddress[] addresses, int port); ++ public static Task ConnectAsync(this Socket socket, string host, int port); ++ public static Task ReceiveAsync(this Socket socket, ArraySegment buffer, SocketFlags socketFlags); ++ public static Task ReceiveAsync(this Socket socket, IList> buffers, SocketFlags socketFlags); ++ public static Task ReceiveFromAsync(this Socket socket, ArraySegment buffer, SocketFlags socketFlags, EndPoint remoteEndPoint); ++ public static Task ReceiveMessageFromAsync(this Socket socket, ArraySegment buffer, SocketFlags socketFlags, EndPoint remoteEndPoint); ++ public static Task SendAsync(this Socket socket, ArraySegment buffer, SocketFlags socketFlags); ++ public static Task SendAsync(this Socket socket, IList> buffers, SocketFlags socketFlags); ++ public static Task SendToAsync(this Socket socket, ArraySegment buffer, SocketFlags socketFlags, EndPoint remoteEP); ++ } + } + namespace System.Runtime.CompilerServices { ++ public sealed class IsByRefLikeAttribute : Attribute { ++ public IsByRefLikeAttribute(); ++ } ++ public sealed class IsReadOnlyAttribute : Attribute { ++ public IsReadOnlyAttribute(); ++ } ++ public interface ITuple { ++ object this[int index] { get; } ++ int Length { get; } ++ } ++ public static class RuntimeFeature { ++ public const string PortablePdb = "PortablePdb"; ++ public static bool IsSupported(string feature); ++ } + } + namespace System.Runtime.InteropServices { ++ public enum Architecture { ++ Arm = 2, ++ Arm64 = 3, ++ X64 = 1, ++ X86 = 0, ++ } ++ [System.Runtime.InteropServices.StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] ++ public struct OSPlatform : IEquatable { ++ public static OSPlatform Linux { get; } ++ public static OSPlatform OSX { get; } ++ public static OSPlatform Windows { get; } ++ public static OSPlatform Create(string osPlatform); ++ public override bool Equals(object obj); ++ public bool Equals(OSPlatform other); ++ public override int GetHashCode(); ++ public static bool operator ==(OSPlatform left, OSPlatform right); ++ public static bool operator !=(OSPlatform left, OSPlatform right); ++ public override string ToString(); ++ } ++ public static class RuntimeInformation { ++ public static string FrameworkDescription { get; } ++ public static Architecture OSArchitecture { get; } ++ public static string OSDescription { get; } ++ public static Architecture ProcessArchitecture { get; } ++ public static bool IsOSPlatform(OSPlatform osPlatform); ++ } + } + namespace System.Runtime.Serialization { ++ public static class DataContractSerializerExtensions { ++ public static ISerializationSurrogateProvider GetSerializationSurrogateProvider(this DataContractSerializer serializer); ++ public static void SetSerializationSurrogateProvider(this DataContractSerializer serializer, ISerializationSurrogateProvider provider); ++ } ++ public interface ISerializationSurrogateProvider { ++ object GetDeserializedObject(object obj, Type targetType); ++ object GetObjectToSerialize(object obj, Type targetType); ++ Type GetSurrogateType(Type type); ++ } + } + namespace System.Security { ++ public static class SecureStringMarshal { ++ public static IntPtr SecureStringToCoTaskMemAnsi(SecureString s); ++ public static IntPtr SecureStringToCoTaskMemUnicode(SecureString s); ++ public static IntPtr SecureStringToGlobalAllocAnsi(SecureString s); ++ public static IntPtr SecureStringToGlobalAllocUnicode(SecureString s); ++ } + } + namespace System.Security.Cryptography { ++ public sealed class IncrementalHash : IDisposable { ++ public HashAlgorithmName AlgorithmName { get; } ++ public void AppendData(byte[] data); ++ public void AppendData(byte[] data, int offset, int count); ++ public static IncrementalHash CreateHash(HashAlgorithmName hashAlgorithm); ++ public static IncrementalHash CreateHMAC(HashAlgorithmName hashAlgorithm, byte[] key); ++ public void Dispose(); ++ public byte[] GetHashAndReset(); ++ } + } + namespace System.ServiceModel.Channels { + public class NamedPipeTransportBindingElement : ConnectionOrientedTransportBindingElement { ++ public Collection AllowedSecurityIdentifiers { get; } + } + } + namespace System.Text.RegularExpressions { + public class Regex : ISerializable { ++ protected IDictionary CapNames { get; set; } ++ protected IDictionary Caps { get; set; } + } + } + namespace System.Threading { ++ public sealed class PreAllocatedOverlapped : IDeferredDisposable, IDisposable { ++ public PreAllocatedOverlapped(IOCompletionCallback callback, object state, object pinData); ++ public void Dispose(); ++ } ++ public sealed class ThreadPoolBoundHandle : IDisposable { ++ public SafeHandle Handle { get; } ++ public unsafe NativeOverlapped* AllocateNativeOverlapped(IOCompletionCallback callback, object state, object pinData); ++ public unsafe NativeOverlapped* AllocateNativeOverlapped(PreAllocatedOverlapped preAllocated); ++ public static ThreadPoolBoundHandle BindHandle(SafeHandle handle); ++ public void Dispose(); ++ public unsafe void FreeNativeOverlapped(NativeOverlapped* overlapped); ++ public unsafe static object GetNativeOverlappedState(NativeOverlapped* overlapped); ++ } + } + namespace System.Web { + public class HttpApplication : IComponent, IDisposable, IHttpAsyncHandler, IHttpHandler, IRequestCompletedNotifier, ISyncContext { ++ public void OnExecuteRequestStep(Action callback); + } + public sealed class HttpCookie { ++ public static bool TryParse(string input, out HttpCookie result); + } + } + namespace System.Web.Configuration { + public enum FormsAuthPasswordFormat { ++ SHA256 = 3, ++ SHA384 = 4, ++ SHA512 = 5, + } + } + namespace System.Windows { + public static class BaseCompatibilityPreferences { ++ public enum HandleDispatcherRequestProcessingFailureOptions { ++ Continue = 0, ++ Reset = 2, ++ Throw = 1, ++ } ++ public static BaseCompatibilityPreferences.HandleDispatcherRequestProcessingFailureOptions HandleDispatcherRequestProcessingFailure { get; set; } + } + public static class DependencyPropertyHelper { ++ public static bool IsTemplatedValueDynamic(DependencyObject elementInTemplate, DependencyProperty dependencyProperty); + } + public class ResourceDictionary : ICollection, IDictionary, IEnumerable, INameScope, ISupportInitialize, IUriContext { ++ public bool InvalidatesImplicitDataTemplateResources { get; set; } + } + } + namespace System.Windows.Automation { + public static class AutomationElementIdentifiers { ++ public static readonly AutomationEvent LiveRegionChangedEvent; ++ public static readonly AutomationProperty LiveSettingProperty; + } ++ public enum AutomationLiveSetting { ++ Assertive = 2, ++ Off = 0, ++ Polite = 1, ++ } + public static class AutomationProperties { ++ public static readonly DependencyProperty LiveSettingProperty; ++ public static AutomationLiveSetting GetLiveSetting(DependencyObject element); ++ public static void SetLiveSetting(DependencyObject element, AutomationLiveSetting value); + } + } + namespace System.Windows.Automation.Peers { + public enum AutomationEvents { ++ LiveRegionChanged = 18, + } + public abstract class AutomationPeer : DispatcherObject { ++ public AutomationLiveSetting GetLiveSetting(); ++ protected virtual AutomationLiveSetting GetLiveSettingCore(); + } + public class ContentElementAutomationPeer : AutomationPeer { ++ protected override AutomationLiveSetting GetLiveSettingCore(); + } + public class ExpanderAutomationPeer : FrameworkElementAutomationPeer, IExpandCollapseProvider { ++ protected override List GetChildrenCore(); ++ protected override bool HasKeyboardFocusCore(); + } + public abstract class ItemAutomationPeer : AutomationPeer, IVirtualizedItemProvider { ++ protected override AutomationLiveSetting GetLiveSettingCore(); + } + public class UIElement3DAutomationPeer : AutomationPeer { ++ protected override AutomationLiveSetting GetLiveSettingCore(); + } + public class UIElementAutomationPeer : AutomationPeer { ++ protected override AutomationLiveSetting GetLiveSettingCore(); + } + } + namespace System.Windows.Controls { + public class Expander : HeaderedContentControl { ++ public override void OnApplyTemplate(); + } + } + namespace System.Windows.Diagnostics { + public static class VisualDiagnostics { ++ public static void DisableVisualTreeChanged(); ++ public static void EnableVisualTreeChanged(); + } + } + namespace System.Windows.Forms { + public class DomainUpDown : UpDownBase { + public class DomainUpDownAccessibleObject : Control.ControlAccessibleObject { ++ public override string Name { get; set; } + } + } + public class MonthCalendar : Control { ++ protected override AccessibleObject CreateAccessibilityInstance(); + } + public class ToolStripDropDownButton : ToolStripDropDownItem { ++ protected override AccessibleObject CreateAccessibilityInstance(); + } + } + namespace System.Xml.XmlConfiguration { + public sealed class XmlReaderSection : ConfigurationSection { ++ public string CollapseWhiteSpaceIntoEmptyStringString { get; set; } + } + } + namespace System.Xml.XPath { ++ public static class XDocumentExtensions { ++ public static IXPathNavigable ToXPathNavigable(this XNode node); ++ } + } +``` diff --git a/releases/net471/dotnet471-changes.md b/releases/net471/dotnet471-changes.md new file mode 100644 index 000000000..f28058c59 --- /dev/null +++ b/releases/net471/dotnet471-changes.md @@ -0,0 +1,178 @@ +# .NET Framework 4.7.1 Release Notes + +.NET Framework release notes describe product improvements grouped by product area. Each change includes a Microsoft-internal VSTS bug ID, the primary binary that was updated and whether the change was a bug or a feature. + +## ASP.NET + +* Fixed the scenario where ASP.NET's custom errors feature does not work if the URL being requested contains a filesystem reserved keyword. [217022, System.Web.dll, Bug] +* Fixed the scenario where the content-type header is not set in the response if HttpResponse.Redirect is called before executing handler. [360276, system.web.dll, bug] +* Fixed leaking cache items in System.Runtime.MemoryCache when multiple threads race to add an item with the same ID. [388335, System.Runtime.Caching.dll, Bug] +* Fixed an accessibility problem to have consistent identification for table items. [449101, System.Web.Extensions.Design.dll, Bug] +* Fixed spurious xhtml5 warnings in Visual Studio for web forms application development. [450875, System.Web.Extensions.dll, Bug] +* Fixed bug with absolute expiration time when using System.Web.Caching.Cache.Insert(). [453771, System.Web.dll, Bug] +* Fixed accessibility problem where a visually impared user can have less difficulty in identifying property grid entries in high contrast mode for property headers. [459055, System.Web.Extensions.Design.dll, Bug] +* ASP.NET developers now can use this public API to parse a string from SetCookie header to a HttpCookie object: + ```csharp + static bool HttpCookie.TryParse(string s, out HttpCookie result) [402902, System.Web.dll, Feature] + ``` +* Added support for SHA-2 hash algorithms for ASP.NET Forms Authentication password format. [405231, System.Web.dll, Feature] +* HttpApplication.OnExecuteStep provides extensibility to ASP.NET pipeline to make it easy for developers to implement features in ambient context pattern and build libraries that cares about ASP.NET execution flow. [406437, System.Web.dll, Feature] + +## BCL + +* Fixed a race condition in resource manager which leads to multiple CultureInfo getting created and presented to the client code. This is also fixed in .NET Core - [dotnet/coreclr #8656](https://github.com/dotnet/coreclr/pull/8656) [99146, mscorlib.dll, Bug] +* Improved reliability of Parallel.For on x86 systems. [99779, mscorlib.dll, Bug] +* Fixed an issue where two threads attempting to load the same assembly may crash the process. [211676, mscorlib.dll, Bug] +* Fixed an issue in ReaderWriterLockSlim where an attempt to enter a write lock that times out does not release waiting attempts to acquire read or upgradeable read locks [216022, System.Core.dll, Bug] +* Improved performance of AesCng and TripleDESCng with in-memory keys. [271987, System.Core.dll, Bug] +* Improved performance in NamedPipeClientStream Connect area. [288338, System.Core.dll, Bug] +* Removed an unnecessary line break in the exception text in Russian locale. [299044, mscorlib.dll, Bug] +* Fixed a performance issue with Task.WhenAny. When a task was repeatedly used in Task.WhenAny, the performance of WhenAny may have degraded over time. [372594, mscorlib.dll, Bug] +* Fixed Access Violation problem in ComCallUnmarshal::UnmarshalInterface. [380021, mscorlib.dll, Bug] +* Updated SignedXML and SignedCMS to use SHA256 as a default over SHA1. SHA1 may still be used by selected as a default by enabling a context switch. [397307, System.Security.dll, Bug] +* Updated SignedXML and SignedCMS to use SHA256 as a default over SHA1. SHA1 may still be used by selected as a default by enabling a context switch. [397641, System.Security.dll, Bug] +* Fixed a bug introduced in .NET 4.6.2 that caused RSACng and DSACng to not be usable in Partial Trust scenarios [400499, System.Core.dll, Bug] +* Fixed a bug in ETW rundown that hung the process. [409381, mscorlib.dll, Bug] +* Added a switch to SignedXML to use the certificates PublicKey.Key property instead of GetAnyPublicKey. [432261, System.Security.dll, Bug] +* When tasks are awaited on background threads that have a DispatcherQueue associated with them, the continuations for the tasks will now be posted on the same thread via the DispatcherQueue. [437118, mscorlib.dll, Bug] +* Enable support for .NET Standard 2.0 in .NET 4.7.1. [404774, mscorlib.dll, Feature] +* Added IsReadOnlyAttribute to System.Runtime.CompilerServices [407211, mscorlib.dll, Feature] +* Added helper method to describe features supported by the runtime. [407212, mscorlib.dll, Feature] +* Added an attribute System.Runtime.CompilerServices.IsRefLikeAttribute [429642, mscorlib.dll, Feature] +* Enabled interop between StorageFile / StorageFolder and .NET types for filesystem access [433898, mscorlib.dll, Feature] +* System.Runtime.CompilerServices.RuntimeFeature.IsSupported allows to check whether the runtime supports displaying source line information for stack frames in assemblies built with portable symbols (PDBs). This is common for libraries that are built targeting .Net standard. [436315, mscorlib.dll, Feature] +* During the .NET Standard 2.0 work a type was missed because of a mismatch between the contracts we have in the full .NET Framework and the ones we shipped as part of .NET Standard 1.*. [468256, System.Net.NetworkInformation.dll, Bug] + +## CLR + +* Managed threads that exit don't get finalized until a GC of an appropriate generation is triggered. Applications that are mostly idle but occasionally create threads or have timers with long periods may accumulate a large number of handles as shown by Task Manager. This issue is fixed by triggering a GC of an appropriate generation based on the number of threads. [134926, clr.dll, Bug] +* Fixed reliability problem for using string hashing before initializing the appdomain which used to crash the apps. This is also fixed in .NET Core - [dotnet/coreclr #10843](https://github.com/dotnet/coreclr/issues/10843) [213531, clr.dll, Bug] +* Exceptions from services that fail to start will now be propagated from ServiceBase.Run. [226883, System.ServiceProcess.dll, Bug] +* Fixed a silent bad code generation issue in RyuJit. The conditions for the silent bad code generation are as follows: [282492, clrjit.dll, Bug] + * The method has a tail call that the JIT decides to dispatch as a fast tail call (without calling a helper). + * Both the caller and the callee have arguments passed on the stack. + * One of the arguments passed on the stack to the caller is a 1, 2, 4, or 8-byte struct. + * Some or all of the fields of that struct are used to compute a callee argument passed in a register. + * If the abovementioned conditions are met, the JIT may generate bad code for the callee register argument. The callee will see an incorrect value. +* Improved resiliency to shutdown finalization for portable PDB. [360526, System.dll, Bug] +* Fixed a rare issue that can cause hangs in programs that use background GC and exhibit specific patterns of GC handle usage. [369415, clr.dll, Bug] +* Fixed a deadlock in TraceSource initialization. [387336, System.dll, Bug] +* After many instances of ReaderWriterLock are created, an instance may hang while upgrading to a write lock. A new configuration variable is exposed, and may be specified as an environment variable (COMPlus\_ReaderWriterLock\_UseFixedIdGeneration=1) to fix this problem. [395943, clr.dll, Bug] +* Fixed intermittent deadlock during GC with complex generic types. [399387, clr.dll, Bug] +* Fixed a problem where rare crashes or deadlocks happens if a GC occurs while another thread is running NGen'ed code which is making the initial call into a static method within the same module where one or more parameter types involve type-forwarded valuetypes. [404234, clr.dll, Bug] +* Managed threads that exit don't get finalized until a GC of an appropriate generation is triggered. Applications that are mostly idle but occasionally create threads or have timers with long periods may accumulate a large number of handles as shown by Task Manager. This problem is now fixed by triggering a GC of an appropriate generation based on the number of threads that have exited but are not finalized. [407602, clr.dll, Bug] +* Exception.StackTrace now supports displaying source line information for stack frames in assemblies that use pdbs in the new portable pdb format. This is common for libraries that are built targeting .Net standard. [410959, clr.dll, mscorlib.dll, System.Core.dll, Bug] +* Fixed intermittent crash during GC with ETW memory tracing turned on. [425084, clr.dll, Bug] +* SerialPort streams no longer terminate the process when exceptions occur on the background thread. This can happen when removing a USB serial port while in use. This new behavior is controlled by the `Switch.System.IO.Ports.DoNotCatchSerialStreamThreadExceptions` AppContext switch. This switch is set to `truetf get` by default when targeting .NET 4.7 or below. [428461, System.dll, Bug] +* Updated headers to use HTTPS instead of HTTP in URLs. [447119, mscoree.h, cor.h, Bug] +* Fixed infinite loop in the jit which happens in certain cases where cgt.un is used to implement a null check. [453201, clrjit.dll, Bug] +* Fixed a silent bad codegen problem in JIT that results in incorrect results from XslCompiledTransform. [461649, clrjit.dll, Bug] +* Fixed potential crash during CLR shutdown [437163, clr.dll, Bug] +* Fixed a codegen bug in the code that deals with intrinsics implemented by user calls. [499714, clrjit.dll, Bug] + +## Compiler and Managed Languages + +* Removed unnecessary ITuple constraint from TRest on ValueTuple 8. [363866, mscorlib.dll, Bug] +* Support for dynamic pattern matching types. [295579, mscorlib.dll, Feature] +* Added serializable attribute on each ValueTuple type. [378419, mscorlib.dll, Feature] + +## Configuration + +* Introduced Configuration Builders that allow developers a way to build configuration for applications at runtime from dynamic or centralized sources. [405224, System.Configuration.dll, Feature] + +## Networking + +* Fixed security vulnerability tracked by Microsoft Common Vulnerabilities and Exposures [CVE-2017-0248](https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-0248) [364538, System.dll, Bug] +* Fixed a problem with HTTP POST requests that require authentication and resubmit. [369338, System.dll, Bug] +* Add 8 new properties to System.Net.Http.HttpClientHandler to align with NETStandard2.0. [386926, System.Net.Http.dll, Bug] + +## SQL + +* Fixed a bug in System.Data.SqlClient where exceptions can be thrown while trying to establish a connection to SQL Server due to receiving TDS packets that are smaller than expected. [396402, System.Data.dll, Bug] +* Enabled sqlclient to connect to the correct instance instead of only default instance when SQL Server 2016 or higher versions is installed in cluster and if it is not the default server. Initially for these scenarios sqlclient was able to connect to only default instance. [400928, System.Data.dll, Bug] + +## WCF + +* When serializing an object with TimeSpan property, it will write an empty element for TimeSpan property. The fix is to reliably support TimeSpan property in XmlSerializer. [252528, System.Xml.dll, Bug] +* Task methods now honor the Description attribute in help pages. [274351, System.ServiceModel.Web.dll, Bug] +* Fixed an incorrect null check issue in AddressHeaderCollection. Afer the fix the actual header (addressHeader) is checked for null and not addressHeaders. [275879, System.ServiceModel.dll, Bug] +* Fixed reliability problem in Addressing.ReadHeader operator comparison [276385, System.ServiceModel.dll, Bug] +* Fixed NullReferenceException in waiters null scenario. [284926, System.ServiceModel.dll, Bug] +* Fixed Narrator accessibility problem - Narrator now announces ‘Configuration’ and ‘Services’ in SvcConfigEditor. [393966, SvcConfigEditor.exe, Bug] +* Fixed accessibility problem - now hyperlinks can be opened via keyboard in 'Tasks' panel in SvcConfigEditor. [393974, SvcConfigEditor.exe, Bug] +* Fixed tab order issues in 'Client' panel for SvcConfigEditor. [393991, SvcConfigEditor.exe, Bug] +* Fixed reliability issues in determination of whether ETW should trace exceptions. [394519, System.ServiceModel.dll, Bug] +* Changed the hashing algorithm of HttpChannelFactory from SHA1 to SHA256. [395428, System.ServiceModel.dll, Bug] +* Changed the hashing algorithm of WindowsUserNameCachingSecurityTokenAuthenticator to not use SHA1. [395433, System.ServiceModel.dll, Bug] +* Changed the hashing algorithm of BuildSharedMemoryName to use SHA256. [395685, System.ServiceModel.dll, Bug] +* Changed the hashing algorithm of MsmqSecureHashAlgorithm from SHA1 to SHA256. [395687, System.ServiceModel.dll, Bug] +* Fixed accessibility problem - now Focus area is correct when pressing arrow key to move focus on a new EndPoint node inSvcConfigEditor. [396819, SvcConfigEditor.exe, Bug] +* Fixed accessibility problem - now focuses are correct when pressing Tab key to move focus on Task area in SvcConfigEditor. [396843, SvcConfigEditor.exe, Bug] +* Fixed accessibility problem - now Narrator reads the full infomation about the link in runtime window in SvcConfigEditor. [396880, SvcConfigEditor.exe, Bug] +* Support for the OS default TLS protocol. [405970, System.ServiceModel.dll, Bug] +* Updated WCF Trace Viewer's controls so all controls now expose the correct properties to screen readers. [424483, SvcTraceViewer.exe , Bug] +* Some text in the WCF Trace Viewer did not contrast enough to be visible for all users. Updated font colors so it should always be visible. [424484, 424485, 424488, SvcTraceViewer.exe, Bug] +* Some text in the WCF Trace Viewer did follow high contrast standards when using high contrast themes. Adjusted text to use the correct colors in these themes. [424924, SvcTraceViewer.exe, Bug] +* Some controls in the WCF Trace Viewer were not accessible using the keyboard because they were not marked as tab stops. Added these to the tab order and these are now accessible using the keyboard. [424942, 424944, SvcTraceViewer.exe, Bug] +* Fixed NullReferenceException when accessing AllowedSecurityIdentifiers if allowedUsers is null. [447641, System.ServiceModel.dll, Bug] + +## Windows Forms + +* MenuStrip.MdiWindowListItem drop down menu now displays accurate list of available child windows. [241047, System.Windows.Forms.dll, Bug] +* Recent changes in the Mage signing tool had enabled only Current User HSM keys, we have now enabled support for LM keys. [266936, Mage.exe, Bug] +* HDPI improvements in ThreadExceptionDialog [372899, System.Windows.Forms.dll, Bug] +* Fixed an incorrectly translated Print dialog issue for Chinese Simplified or Traditional. [398471, System.Windows.Forms.dll, Bug] +* Fixed the problem where a static constructor for ConfigurationOptions class throws an exception when TargetFrameworkName in appdomain is null. [401520, System.Windows.Forms.dll, System.Design.dll, Bug] +* MonthCalendar control is now accessible via narrator and other UI automation tools. [409745, System.Windows.Forms.dll, Bug] +* Fixed multi-mon DPI awareness problem in control anchoring distance scaling [454161, System.Windows.Forms.dll, Bug] +* WinForms is improving how it works with accessibility aids to better support WinForms customers. Specifically, there are changes to improve display during HighContrast mode, to improve the property browser experience and to implement missing accessibility patterns in controls. Property Browser improvements will include better keyboard navigation though the various drop down selection windows, reduced unnecessary tab stops, better reporting of control types, and improved Narrator behavior. [364507, 366444, 382153, 382195, 382373, 384922, 386113, 386118, 386123, 386173, 386221, 386386, 386420, 387172, 392706, 394788, 395785, 396128, 396905, 399055, 399067, 399988, 404882, 404885, 407249, 407451, 409745, 411616, 411645, 426764, 427010, 428277, 430685, 434763, 436154, 436313, 437010, 437011, 437700, 437912, 449452, 457326, 461557, System.Windows.Forms.dll, Bug] + +## Workflow + +* Fixed rendering error in Workflow designer in Sharepoint. [361982, System.Activities.Presentation.dll, Bug] +* Improved accessibility in Workflow designer. Specifically there are fixes in high contrast mode, focus of different controls and dialogs and name properties [407062, 407067, 407068, 407069, 407070, 407072, 407075, 407076, 407080, 407085, 407086, 407097, 407407, 407408, 407411, 407414, 407415, 407428, 407436, 407442, 407444, 407450, 407462, 407463, 407467, 408030, 408035, 408043, 408073, 408077, 408158, 408282, 408315, 408329, 409027, 409645, 409719, 409723, 409731, 434137, 445109, 447654, System.Activities.Presentation.dll, Bug] +* New enumerator values are added for System.Messaging.HashAlgorithm to allow developers to choose SHA256, SHA384, and SHA512. Also, the default hashing algorithm if one is not specified is SHA512. For backward compatibility where customers must continue to use MD5, the following must be added to the app.config file for the application: [394583, System.Messaging.dll, Feature] + ```xml + + + + ``` +* Fixed an issue where screen readers would consider the arrows in the workflow designer navigation breadcrumbs as part of the list. [408282, System.Activities.Presentation.dll, Bug] +* Fixed an issue where screen readers would read non-descriptive names of edit boxes in the workflow designer properties window. [459631, System.Activities.Presentation.dll, Bug] + +## WPF + +* Nested popups with StaysOpen="False" now work as expected. [94132, PresentationFramework.dll, Bug] +* Fixed a bug in which DataGrid displays the wrong value after committing edits to a normalizing property. [158520, PresentationFramework.dll, Bug] +* On Windows 10, WPF applications running in a locked or disconnected user session sometimes consume CPU cycles unexpectedly. This could also manifest as application crash that is observed as soon as the user logs back onto their session. This fix addresses this problem and improves the overall performance and reliablity of WPF applications running on Windows 10. [165554, WindowsBase.dll, PresentationCore .dll, wpfgfx\_v0400.dll, Bug] +* Fixed crashes and incorrect focus when pressing arrow keys in a TreeView or Ribbon that contains Hyperlinks. [170274, PresentationFramework.dll, Bug] +* In WPF applications running on Windows 10 Anniversary Update or greater, WPF will automatically invoke the touch keyboard in applicable scenarios. In .NET 4.7.1, WPF applications may opt out of this behavior by adding the following to their application configuration file, merging this switch with the AppContextSwitchOverrides list. [362756, PresentationCore.dll, Bug] + ```xml + + + + + + ``` +* Support for font changes from Windows 10 Creators Update that involves updates to WPF font fallbacks. [368999, PresentationCore.dll, Bug] +* Added LiveSetting/LiveRegion support to WPF’s Automation provider APIs. Developers can now set the LiveSetting dependency property and raise the LiveRegionChanged event via RaiseAutomationEvent. [386494, UIAutomationClient.dll, Bug] +* Fixed crash when an async binding refers to a dynamic object. [388736, PresentationFramework.dll, Bug] +* A WPF application running on touch or stylus enabled machines may crash under certain circumstances when a Dispatcher thread is being shutdown or when a tablet or stylus is removed. This fix alleviates that issue by ensuring that objects associated with tablets and styluses are only released when the device is no longer in use. [402947, PenIMC.dll , Bug] +* Fixed a NullReferenceException thrown during SpellCheck operations after SpellCheck.CustomDictionaries.Clear() is called programmatically. [407524, PresentationFramework.dll, Bug] +* Fixed a crash occurring when removing the SelectedItem from a collection with a custom implementation of INotifyCollectionChanged that does not report the position of the removed item. [424259, PresentationFramework.dll, Bug] +* Fixed a crash in PenIMC. [424827, PenIMC.dll , Bug] +* Applications written in WPF and running on touch/stylus enabled devices leak a handle on shutdown of a Dispatcher thread. This change appropriately cleans up the handle and fixes the leak. [434938, PenIMC.dll , Bug] +* PackageDigitalSignatureManager.DefaultHashAlgorithm is now SHA256 for applications running on .NET 4.7.1 and targeting .NET 4.6.2 and above. This impacts the default message digest algorithm and signature method for XPS document signing (XpsDocument.SignDigitally) and Package signing (PackageDigitalSignatureManager.Sign). Developers running on .NET 4.7.1 targeting .NET 4.6.2 and above who require SHA1 defaults may enable a compatibility AppContext flag by adding: `Switch.MS.Internal.UseSha1AsDefaultHashAlgorithmForDigitalSignatures=true` to their AppConfig's AppContextSwitchOverrides. This also allows developers running on .NET 4.7.1 and targeting .NET 4.6.1 and below to enable the new default setting by setting this to false. [436861, WindowsBase.dll, Bug] +* Fixed an infinite loop that can occur while resizing a Grid when (a) two row definitions declare a \*-height, a MinHeight, and a MaxHeight, (b) neither row's content exceeds the MaxHeight, and (c) the first MinHeight, plus any other fixed or Auto rows, exceeds the Grid's available height (even without considering the second MinHeight). There's a similar fix for columns and width. [442027, PresentationFramework.dll, Bug] +* WPF Accessibility:High Contrast improvements - WPF applications running in high contrast themes, as well as those interacting with screen readers will see various improvements. To enable these changes, set the target framework to 4.7.1 or add "Switch.UseLegacyAccessibilityFeatures=false" to your AppContextSwitchOverrides. [447592, PresentationFramework.dll, PresentationCore.dll, Bug] +* Fixed problem where WPF fails to load resources if two versions of the same assembly are loaded. [454391, PresentationFramework.dll, Bug] +* Fixed ComException in PenIMC\_v400 that results in WPF application crashes. [463347, PenIMC2\_v0400.dll, PenIMC\_v0400.dll, Bug] +* On a machine with touch or stylus device, loading a .NET 3.5 WPF application and a .NET 4.x WPF application side-by-side in the same process can result in heap corruption. This change fixes this problem allowing side-by-side execution in the same process on touch/stylus enabled devices. [377651, PenIMC.dll, PenIMC\_v0400.dll, PresentationCore.dll, WindowsBase.dll, Feature] +* Added support for updating visual tree after changing implicit data template. [406804, PresentationFramework.dll, Feature] +* Added ability to tell whether a property value inside a template is a dynamic resource reference. [406807, PresentationFramework.dll, Feature] +* Provided source info for elements in template created by XamlReader.Load [406808, PresentationFramework.dll, Feature] +* Enabled VisualTree notifications for debugging [406811, PresentationFramework.dll, Feature] +* A WPF app that implements an event handler for the Selector.SelectionChanged event should see the new values for the SelectedIndex, SelectedItem and SelectedValue properties. This worked correctly in all cases except for one: when the selection change was caused by changing SelectedValue and the handler queried the SelectedValue property, it saw the old value. This has been fixed. [96884, PresentationFramework,dll, Bug] +* A WPF app with an event handler for the TabControl.SelectionChanged sees the wrong (old) value for TabControl.SelectedContent. Also, if the selection change occurs while keyboard focus is in the content area, the focus should remain in the content area (provided the new selected content has a focusable element). This has been fixed. [208019, PresentationFramework,dll, Bug] +* Fixed an issue for touch or stylus-enabled machines, where repeated use of popups in WPF applications can cause loss of touch and stylus support. [479874, PresentationCore.dll, Bug] +* Fixed an issue for touch or stylus-enabled machines, where WPF applications may throw a NullReferenceException in WispLogic.ProcessInputReport. [481090, PresentationCore.dll, Bug] diff --git a/releases/net471/dotnet471-known-issues.md b/releases/net471/dotnet471-known-issues.md new file mode 100644 index 000000000..2b614d445 --- /dev/null +++ b/releases/net471/dotnet471-known-issues.md @@ -0,0 +1,21 @@ +.NET Framework 4.7.1 Known Issues +================================= + +This document lists the known issues that you may experience after you install the Microsoft .NET Framework 4.7.1. + +## Product issues for the .NET Framework 4.7.1 +- [470006 - GC - Rare crashes can occur when background GC is enabled in applications that allocate and free large objects at a high rate](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/470006-GC%20Crashes%20with%20high%20rate%20of%20large%20object%20allocation.md) +- [479874 - WPF - Touch Stops Working After Rapid/Prolonged Use Of Popups](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/479874-WPF%20Touch%20Stops%20Working%20After%20Prolonged%20Use%20of%20Popups.md) +- [481090 - WPF - Touch generates a NullReferenceException in WispLogic.ProcessInputReport](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/481090-WPF%20Touch%20generates%20NullReferenceException%20in%20ProcessInputReport.md) +- [489937 - WPF - Touch/Stylus Generates AccessViolations and Heap Corruption in GetPenEventMultiple](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/489937-WPF%20Touch%20and%20Stylus%20AccessViolation%20in%20GetPenEventMultiple.md) +- [493108 - WPF - InvalidCastException when displaying a checked MenuItem](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/493108-WPF%20InvalidCastException%20when%20displaying%20a%20checked%20MenuItem.md) +- [510901 - BCL - Applications targeting .NET 4.6.1 that use .NET Standard libraries might be broken when running on .NET 4.7.1](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/510901-BCL%20Apps%20targeting%20.NET-4.6.1%20that%20use%20.NET%20Standard%20libraries%20might%20be%20broken%20when%20running%20on%20.NET%204.7.1.md) +- [521954 - BCL - CultureAwareComparer with ignore casing serialized on previous versions of .NET Framework does not correctly deserialize on .NET Framework 4.7.1](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/521954%20-%20BCL%20CultureAwareComparer%20with%20ignore%20casing%20on%20serialized%20on%20previous%20versions%20of%20.NET%20do%20not%20correctly%20deserialize%20on%20.NET%204.7.1.md) +- [517815 - BCL - Applications making heavy use of System.Diagnostics.StackTrace or Exception.StackTrace might run more slowly on the .NET Framework 4.7.1](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/517815-BCL%20Applications%20making%20heavy%20use%20of%20System.Diagnostics.StackTrace%20might%20run%20more%20slowly%20on%20.NET%204.7.1.md) +- [517815 - BCL - Stack traces are missing source information for frames with debug information in the Portable PDB format when running on .NET Framework 4.7.1](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/517815-BCL%20Stack%20traces%20are%20missing%20source%20information%20for%20frames%20with%20debug%20information%20in%20the%20Portable%20PDB%20format.md) +- [553390 - BCL - SGEN crashes trying to load the System.IO.Compression.FileSystem reference assembly]( https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/553390%20-%20BCL%20-%20SGEN%20crashes%20because%20it%20references%20System.IO.Compression.ZipFile.dll.md) +- [534719 - BCL - Targeting .NET Framework 4.7.1 copies extra files to your bin directory](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/514195-Targeting%20.NET%20Framework%204.7.1%20copies%20extra%20files%20to%20your%20bin%20directory.md) +- [623552 - BCL - Assembly versions higher than 4.0.0.0 for System.IO.Compression.ZipFile cannot be loaded without a binding redirect](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/623552-BCL%20Higher%20assembly%20versions%20that%204.0.0.0%20for%20System.IO.Compression.ZipFile%20cannot%20be%20loaded%20without%20a%20binding%20redirect.md) +- [523633 - Setup - Application crashes occur when running on the .NET Framework 4.7.1 after upgrading from Windows 10 Anniversary Update to Windows 10 Creators Update](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/523633%20-%20Setup%20-%20OS%20upgrade%20to%20Windows%2010%20gets%20the%20product%20in%20bad%20state.md) +- [534719 - Networking - ServicePoint.ConnectionLimit default behavior with loopback changed unexpectedly](https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/534719-Networking.ServicePoint.ConnectionLimit%20default%20behavior%20changed.md) +- [663475 - Setup - Applications that rely on TLS 1.2 strong encryption experience connectivity failures after a Windows upgrade](https://support.microsoft.com/help/4458166) diff --git a/releases/net472/KnownIssues/405199 - WPF Non-Adorner TextSelection Occludes Text.md b/releases/net472/KnownIssues/405199 - WPF Non-Adorner TextSelection Occludes Text.md new file mode 100644 index 000000000..f34044a09 --- /dev/null +++ b/releases/net472/KnownIssues/405199 - WPF Non-Adorner TextSelection Occludes Text.md @@ -0,0 +1,18 @@ +# WPF Non-Adorner Text Selection Occludes Text in FlowDocumentScrollViewer, FlowDocumentReader, and FlowDocumentPageViewer. + +## Symptoms +When the WPF Non-Adorner text selection feature is enabled on .NET Framework 4.7.2, selected text in `System.Windows.Controls.FlowDocumentScrollViewer`, `System.Windows.Controls.FlowDocumentReader`, +and `System.Windows.Controls.FlowDocumentPageViewer` occludes the selected text. + +## Cause +The root cause of this issue is an incorrect default selection opacity value being applied for `System.Windows.Controls.FlowDocumentScrollViewer`, `System.Windows.Controls.FlowDocumentReader`, +and `System.Windows.Controls.FlowDocumentPageViewer`. + +## Resolution +This issue will be fixed in the next version of the .NET Framework. + +To work around this problem, developers can explicitly set the selection opacity to the correct value of .4. Once this is done, the selected text is again visible underneath the text selection. + +```xml + +``` \ No newline at end of file diff --git a/releases/net472/KnownIssues/504055 - WPF May Not Show Touch Keyboard In All Scenarios on Windows 10 April 2018 Update.md b/releases/net472/KnownIssues/504055 - WPF May Not Show Touch Keyboard In All Scenarios on Windows 10 April 2018 Update.md new file mode 100644 index 000000000..01f14877f --- /dev/null +++ b/releases/net472/KnownIssues/504055 - WPF May Not Show Touch Keyboard In All Scenarios on Windows 10 April 2018 Update.md @@ -0,0 +1,16 @@ +# WPF May Not Show Touch Keyboard In All Scenarios on Windows 10 April 2018 Update + +## Symptoms +In the .NET Framework 4.7.2 running on Windows 10 April 2018 Update, WPF applications may not immediately show the touch keyboard in some specific scenarios. Generally, these involve variations of the following. + +1. Tap a text box and note the touch keyboard shows. +2. Tap another text box. +3. Tap the 'X' on the touch keyboard to close it. +4. Tap the text box from step 1 and note the touch keyboard does not show. + +## Cause +A WPF change in .NET Framework 4.7.2 is preventing WPF from requesting the touch keyboard show. Due to this, the touch keyboard tracking algorithm in Windows 10 April 2018 Update does not show the +keyboard in all scenarios. + +## Resolution +A fix for this issue is available in [KB4103721](https://support.microsoft.com/en-us/help/4103721/windows-10-update-kb4103721). diff --git a/releases/net472/KnownIssues/560016-XBAP Applications targeting .NET 2.0,3.5 select wrong runtime version.md b/releases/net472/KnownIssues/560016-XBAP Applications targeting .NET 2.0,3.5 select wrong runtime version.md new file mode 100644 index 000000000..00f3dacc9 --- /dev/null +++ b/releases/net472/KnownIssues/560016-XBAP Applications targeting .NET 2.0,3.5 select wrong runtime version.md @@ -0,0 +1,55 @@ +# XBAP applications that target .NET Framework 3.5 select the wrong runtime (v4 CLR) instead of v2.0 CLR + +## Symptoms + +When a XAML Browser Application (XBAP) that targets .NET Framework 3.5 is launched, it is loaded in CLR v4 incorrectly instead of CLR v2.0, as expected. Along with the incorrect CLR, the .NET Framework libraries are also loaded from the latest version of .NET (.NET 4.x), and not .NET 3.5. Many XBAP applications launch and work normally under CLR v4, but some fail. The failure-mode is specific to the individual application and cannot be easily generalized. + +## Resolution + +A fix will be released shortly for .NET Framework 4.7.2 on Windows 10 Spring Creators Update. .NET Framework 4.7.2 on all other OS platforms already has this fix. + +The fix for this issue must be enabled by customers who have problems running XBAP applications that target .NET Framework 3.5 under CLR v4. The fix can be enabled by setting the following registry keys: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Platform ArchitectureRegistry KeyValue NameValue KindValueDescription
32-bitHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Windows Presentation Foundation\HostingDoNotLaunchVersion3HostedApplicationInVersion4RuntimeREG_DWORD0, or value does not existXBAP applications that target .NET Framework 3.5 or.NET Framework 4.x will be both launched under CLR v4
1, or any non-zero valueXBAP applications that target .NET Framework 3.5 will be launched under CLR v2, and XBAP applications that target .NET Framework 4.x will be launched under CLR v4
64-bit + Both of these keys should be set:

+

    +
  • HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\.NETFramework\Windows Presentation Foundation\Hosting
  • +
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\Windows Presentation Foundation\Hosting
  • +
+
DoNotLaunchVersion3HostedApplicationInVersion4RuntimeREG_DWORD0, or value does not existXBAP applications that target .NET Framework 3.5 or.NET Framework 4.x will be both launched under CLR v4
1, or any non-zero valueXBAP applications that target .NET Framework 3.5 will be launched under CLR v2, and XBAP applications that target .NET Framework 4.x will be launched under CLR v4
+ +## More information +.NET Framework 4.6.2, .NET Framework 4.7, and .NET Framework 4.7.1 are also affected by this issue. A fix for these versions of .NET Frameworks will be released shortly. diff --git a/releases/net472/KnownIssues/593963 - WPF Exceptions during AppDomain or process shutdown.md b/releases/net472/KnownIssues/593963 - WPF Exceptions during AppDomain or process shutdown.md new file mode 100644 index 000000000..c69985a80 --- /dev/null +++ b/releases/net472/KnownIssues/593963 - WPF Exceptions during AppDomain or process shutdown.md @@ -0,0 +1,26 @@ +# WPF Exceptions during AppDomain or process shutdown + +## Symptoms +In certain timing-sensitive WPF applications, exceptions may be seen during AppDomain or process shutdown. + +## Cause +In .NET Framework 4.7.1 and earlier versions, WPF potentially creates a [System.Windows.Threading.Dispatcher](https://docs.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatcher) on the .NET finalizer thread during AppDomain shutdown. This was fixed in .NET Framework 4.7.2 and later versions by making the cleanup of weak events thread-aware. Due to this, WPF may call [Dispatcher.Invoke](https://docs.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatcher.invoke) to complete the cleanup process. + +In certain applications, this change in finalizer timing can potentially cause exceptions during AppDomain or process shutdown. This is generally seen in applications that do not correctly +shut down dispatchers running on worker threads prior to process or AppDomain shutdown. + +## Resolution +WPF applications should take care to properly manage the lifetime of dispatchers to eliminate the possibility of this occurring. + +In .NET Framework 4.7.2 and later versions, developers can disable the call to [Dispatcher.Invoke](https://docs.microsoft.com/en-us/dotnet/api/system.windows.threading.dispatcher.invoke) +in order to help alleviate (but not eliminate) timing issues that may occur due to the cleanup change. + +To disable the change in cleanup, use the following AppContext flag. + +```xml + + + + + +``` diff --git a/releases/net472/KnownIssues/599936 - Narrator does not annouce the ReadOnly Status for DataGridView TextBox column with the TextBox column Readonly property set as true.md b/releases/net472/KnownIssues/599936 - Narrator does not annouce the ReadOnly Status for DataGridView TextBox column with the TextBox column Readonly property set as true.md new file mode 100644 index 000000000..1c101d426 --- /dev/null +++ b/releases/net472/KnownIssues/599936 - Narrator does not annouce the ReadOnly Status for DataGridView TextBox column with the TextBox column Readonly property set as true.md @@ -0,0 +1,14 @@ + # Narrator does not announce the ReadOnly Status for DataGridView TextBox column with the TextBox column Readonly property set as true + +## Symptoms +Narrator does not announce the value of the ReadOnly property of the System.Windows.Forms.DataGridViewTextBoxColumn. This is the case regardless of the value of the ReadOnly property. This could cause confusion for Narrator users when editing content in a DataGridViewTextBoxColumn. +## Cause +The issue is caused by changes in .NET Framework 4.7.2 that improved the accessibility support of the DataGridView. That change left Narrator unable to narrate the ReadOnly status of the TextBoxColumn regardless of the setting. + +## Workaround +There is no workaround for this issue. + +## Resolution +A proper fix of the DataGridView AccessibleObject will ship in coming versions of .NET Framework. This known issue will be updated with more details when that happens. + + diff --git a/releases/net472/KnownIssues/611802 - SQLConnection.ConnectionString throws NullReferenceException .md b/releases/net472/KnownIssues/611802 - SQLConnection.ConnectionString throws NullReferenceException .md new file mode 100644 index 000000000..450e2efb2 --- /dev/null +++ b/releases/net472/KnownIssues/611802 - SQLConnection.ConnectionString throws NullReferenceException .md @@ -0,0 +1,25 @@ +# NullReferenceException while setting `SqlConnection.ConnectionString` to an empty string or null. +## Symptoms + +When an application tries to set the `ConnectionString` property of the `SqlConnection` object to an empty string or null value, a `NullReferenceException` is thrown. This exception occurs when .NET Framework 4.7.2 is installed on the OS hosting the application. + + +## Cause + +.NET Framework 4.7.2 includes a change that increases the default connection retry count for connections to Azure SQL Database to two. +This change sets the internal value of the retry count without validating if the `ConnectionString` is a non-null or non-empty value, +which results in the `NullReferenceException`. + +## Impact + +The impact is limited to applications using the `SqlConnection.ConnectionString` API to set an empty connection string, which now throws an exception. + +## Workarounds + +No known workarounds with .NET Framework 4.7.2. + +## Resolution + +This issue has been fixed in the [latest update to .NET Framework 4.7.2](https://go.microsoft.com/fwlink/?LinkId=2005309) for all platforms except Windows 10 April 2018 Update. + +For Windows 10 April 2018 Update, the fix will be available in the upcoming Cumulative Update. diff --git a/releases/net472/KnownIssues/613745 - Single-name references are removed by the SDK when targeting 4.7.2.md b/releases/net472/KnownIssues/613745 - Single-name references are removed by the SDK when targeting 4.7.2.md new file mode 100644 index 000000000..3a618bf45 --- /dev/null +++ b/releases/net472/KnownIssues/613745 - Single-name references are removed by the SDK when targeting 4.7.2.md @@ -0,0 +1,26 @@ +# Single-name references are removed by the SDK when targeting .NET Framework 4.7.2 and referencing a package with the same assembly. + +## Symptoms +When a project targets .NET Framework 4.7.2 and references an assembly with both a single name reference and a package reference (either an explicit or a transitive package reference), the assembly is not passed as a reference to the compiler, causing build-time errors for types that are not found. An example of a build error caused by this issue is: +``` +error CS0246: The type or namespace name 'HttpClient' could not be found (are you missing a using directive or an assembly reference?) +``` + +Candidate assemblies that might run into this issue are `System.Diagnostics.Tracing.dll`, `System.IO.Compression.dll`, and `System.Net.Http.dll`. This issue only happens when the project uses the ` + + All + + +``` + +## Resolution +A proper fix in the MSBuild SDK will ship in the coming versions of Visual Studio. This known issue will be updated with more details when that happens. diff --git a/releases/net472/KnownIssues/669153 - Remoting calls made within a transaction can lead to Transaction.Current incorrectly returning null.md b/releases/net472/KnownIssues/669153 - Remoting calls made within a transaction can lead to Transaction.Current incorrectly returning null.md new file mode 100644 index 000000000..d5e8a4b9c --- /dev/null +++ b/releases/net472/KnownIssues/669153 - Remoting calls made within a transaction can lead to Transaction.Current incorrectly returning null.md @@ -0,0 +1,28 @@ +# Errors occur in applications that combine transaction flow and remote calls. + +## Symptoms +In .NET 4.7.2, you notice errors in .NET Framework applications that meet the following criteria: +- The application uses instances of the [System.Transaction.TransactionScope](https://docs.microsoft.com/dotnet/api/system.transactions.transactionscope) class where transaction flow is enabled by passing [TransactionScopeAsyncFlowOption.Enabled](https://docs.microsoft.com/dotnet/api/system.transactions.transactionscopeasyncflowoption) to the constructor. + +- The application makes one or more remote calls while one of these transaction scopes is active, where a remote call is any call that travels through a transparent proxy before reaching the server object. Examples of remote calls include calls to other application domains and calls made through remoting channels such as the client channels defined in the **System.Runtime.Remoting.Channels** namespaces. + +- After the remote call, [System.Transactions.Transaction.Current](https://docs.microsoft.com/dotnet/api/system.transactions.transaction.current) returns `null`, rather than the value that was returned before the remote call. + +## Workaround +To work around this issue, try any of the following methods: +- For each transaction scope that enables transaction flow, change the application to make sure that no remote calls occur anywhere in the code that runs while the transaction scope is active. When you consider whether a transaction scope contains any remote calls, note the following: + - A call to a static method is never a remote call. + - For a call to an instance method on a target object, the call is remote only if the target object is a transparent proxy. + - For a call to a constructor, the call is remote only if the constructed object is a transparent proxy. + + **Note** The [System.Runtime.Remoting.RemotingServices.IsTransparentProxy](https://docs.microsoft.com/dotnet/api/system.runtime.remoting.remotingservices.istransparentproxy) method can always be used to check whether an object is a transparent proxy. + +- Disable transaction flow by removing the [TransactionScopeAsyncFlowOption.Enabled](https://docs.microsoft.com/dotnet/api/system.transactions.transactionscopeasyncflowoption) constructor argument. + + **Warning** This workaround is likely to cause other errors if any "await" operations execute while the transaction scope is active. + +- The [System.Transactions.Transaction.Current](https://docs.microsoft.com/dotnet/api/system.transactions.transaction.current) property is not automatically serialized to the remote call. It must be passed as a parameter. If the remote call does not pass the transaction as a parameter and does not make a callback to the client during the remote call, then you can create the remote call inside a new [System.Transaction.TransactionScope](https://docs.microsoft.com/dotnet/api/system.transactions.transactionscope) object that uses the [TransactionScopeOption.Suppress](https://docs.microsoft.com/dotnet/api/system.transactions.transactionscopeoption) option. Inside this suppress transaction scope, the [System.Transactions.Transaction.Current](https://docs.microsoft.com/dotnet/api/system.transactions.transaction.current) property will have a `null` value. + + +## Status +We are aware of this issue and are currently working on a resolution. diff --git a/releases/net472/KnownIssues/695400 - Setup fails to install the product after migrating OS from Windows 7 or Windows Server 2008 R2.md b/releases/net472/KnownIssues/695400 - Setup fails to install the product after migrating OS from Windows 7 or Windows Server 2008 R2.md new file mode 100644 index 000000000..f95eada14 --- /dev/null +++ b/releases/net472/KnownIssues/695400 - Setup fails to install the product after migrating OS from Windows 7 or Windows Server 2008 R2.md @@ -0,0 +1,41 @@ +# Setup fails to install files on OS when upgraded from Windows 7 SP1 or Windows Server 2008 R2 with .NET Framework 4.7.2 + +## Symptoms +When you install the .NET Framework 4.7.2 on Windows 10 version 1803 or lower and your system was upgraded from Windows 7 SP1 with .NET Framework 4.7.2 , .NET 4.7.2 setup installation reports success but fails to install .NET 4.7.2 files on the machine. + +Consider the following scenario: + 1. On Windows 7 SP1 or Windows Server 2008 R2, install the .NET Framework 4.7.2 + 2. Upgrade the machine to Windows 10 Fall Creators (version 1709) or lower. The upgraded OS can be any version of Windows 8.1, Windows 10, or Windows Server 2008 R2. + 3. Run .NET 4.7.2 setup. + 4. .NET Framework 4.7.2 setup reports successful installation but fails to install .NET Framework files. + +Note: This issue does not occur when upgrading to Windows 10 April 2018 Update (version 1803) because it comes pre-installed with .NET Framework 4.7.2. + +## Cause +This issue occurs because the OS upgrade leaves behind .NET Framework 4.7.2 setup files in the Windows installer cache and its registration. Due to a bug in .NET Framework setup that checks for the setup files in Windows installer, setup determines that .NET Framework 4.7.2 is already installed and thus skips installing .NET framework files on the upgraded Windows 10 machine. + +## Impact +.NET 4.7.2 setup reports successful installation but skips installing its files and registry entries. + +Note: This issue occurs only when you upgrade from Windows 7 or Windows Server 2008 R2 with .NET Framework 4.7.2 already installed. + +## Resolution +Upgrade to Windows 10 April 2018 Update (Version 1803) or later version.They come pre-installed with .NET Framework 4.7.2 or a later version. + +Alternatively, you can install .NET Framework 4.7.2 on the failed machine by directly installing the respective MSU from Microsoft Update Catalog: +* [Windows Server 2012](https://www.catalog.update.microsoft.com/Search.aspx?q=4054542) +* [Windows 8.1 or Windows Server 2012 R2](https://www.catalog.update.microsoft.com/Search.aspx?q=4054566) +* [Windows 10 Anniversary Update or Windows 10 Creator Update](https://www.catalog.update.microsoft.com/Search.aspx?q=4054590) +* [Windows 10 Fall Creators ](https://www.catalog.update.microsoft.com/Search.aspx?q=4073120) + +If you choose not to follow the previous two resolutions, you can run the following commands from an administrator command prompt to remove the setup registration and re-run .NET Framework 4.7.2 setup. + +On a Windows x64 machine: +``` +reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Patches\0AE22574CBE1266379CC1B5852EA79B8 /f +``` + +On a Windows x86 machine: +``` +reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-1-5-18\Patches\4758749C64399713BA590E9520B4EEC8 /f +``` diff --git a/releases/net472/KnownIssues/706819 - Winforms applications may have problems rendering UI on latest Operating Systems.md b/releases/net472/KnownIssues/706819 - Winforms applications may have problems rendering UI on latest Operating Systems.md new file mode 100644 index 000000000..e4cd002fa --- /dev/null +++ b/releases/net472/KnownIssues/706819 - Winforms applications may have problems rendering UI on latest Operating Systems.md @@ -0,0 +1,10 @@ + # WinForms applications may have problems rendering the application UI and instead may render a white screen with a red ‘X’ symbol. The issue is caused by a change in Windows 10 October 2018 Update that exposed a bug in .NET Framework 4.7.2. + +## Symptoms +WinForms applications may have problems rendering the application UI and instead may render a white screen with a red ‘X’ symbol. The issue is caused by a change in Windows 10 October 2018 Update that exposed a bug in .NET Framework 4.7.2. + +## Cause +The issue is caused by a change in Windows 10 October 2018 Update that exposed a bug in .NET Framework 4.7.2. The Windows 10 October 2018 Update adds a new flag to VisualStyle state when the application UI launches a child dialog (i.e., a FileSaveDialog or PrintpreviewDialog) that causes .NET Framework to fail its VisualStyleState check and thus throw an exception while rendering the application UI. + +## Resolution +A .NET 4.7.2 servicing fix [KB4481031](https://support.microsoft.com/en-us/help/4481031/january-22-2019-kb4481031) for this issue has been released and is also included in the version (4.8) of .NET Framework. diff --git a/releases/net472/README.md b/releases/net472/README.md new file mode 100644 index 000000000..b89897ed8 --- /dev/null +++ b/releases/net472/README.md @@ -0,0 +1,24 @@ +# .NET Framework 4.7.2 Release Notes + +You can learn about the changes made in the .NET Framework 4.7.2. + +- [Download](http://go.microsoft.com/fwlink/?LinkId=863262) +- [.NET Framework 4.7.2 RTM Announcement blog post](https://go.microsoft.com/fwlink/?linkid=863281) +- [.NET Framework 4.7.2 Windows Update release blog post](https://go.microsoft.com/fwlink/?LinkId=2005309) +- [Release notes](dotnet472-changes.md) +- [Application compatibility](https://go.microsoft.com/fwlink/?linkid=863254) +- [API changes](dotnet472-api-changes.md) +- [Known issues](dotnet472-known-issues.md) + +## Release Notes by Product Area + +- [ASP.NET](dotnet472-changes.md#aspnet) +- [BCL](dotnet472-changes.md#bcl) +- [CLR](dotnet472-changes.md#clr) +- [ClickOnce](dotnet472-changes.md#clickonce) +- [Networking](dotnet472-changes.md#networking) +- [SQL](dotnet472-changes.md#sql) +- [WCF](dotnet472-changes.md#wcf) +- [Windows Forms](dotnet472-changes.md#windows-forms) +- [Workflow](dotnet472-changes.md#workflow) +- [WPF](dotnet472-changes.md#wpf) diff --git a/releases/net472/dotnet472-api-changes.md b/releases/net472/dotnet472-api-changes.md new file mode 100644 index 000000000..58127aaa1 --- /dev/null +++ b/releases/net472/dotnet472-api-changes.md @@ -0,0 +1,280 @@ +```diff + namespace System.Activities.Presentation { + public static class WorkflowDesignerColors { ++ public const string ActivityDesignerSelectedTitleForegroundColorKey = "ActivityDesignerSelectedTitleForegroundColorKey"; ++ public const string FlowchartConnectorColorKey = "FlowchartConnectorColorKey"; ++ public const string PropertyToolBarHightlightedButtonForegroundColorKey = "PropertyToolBarHightlightedButtonForegroundColor"; ++ public const string WorkflowViewElementSelectedCaptionColorKey = "WorkflowViewElementSelectedCaptionBrushColorKey"; ++ public static Color ActivityDesignerSelectedTitleForegroundColor { get; } ++ public static Color ContextMenuItemTextHoverQuirkedColor { get; } ++ public static Color FlowchartConnectorColor { get; } ++ public static Color PropertyToolBarHightlightedButtonForegroundColor { get; } ++ public static Color WorkflowViewElementSelectedCaptionColor { get; } + } + } + namespace System.Collections.Concurrent { + public class ConcurrentDictionary : ICollection, ICollection>, IDictionary, IDictionary, IEnumerable, IEnumerable>, IReadOnlyCollection>, IReadOnlyDictionary { ++ public TValue AddOrUpdate(TKey key, Func addValueFactory, Func updateValueFactory, TArg factoryArgument); ++ public TValue GetOrAdd(TKey key, Func valueFactory, TArg factoryArgument); + } + } + namespace System.Collections.Generic { + public class HashSet : ICollection, IDeserializationCallback, IEnumerable, IEnumerable, IReadOnlyCollection, ISerializable, ISet { ++ public HashSet(int capacity); ++ public HashSet(int capacity, IEqualityComparer comparer); ++ public bool TryGetValue(T equalValue, out T actualValue); + } + public class SortedSet : ICollection, ICollection, IDeserializationCallback, IEnumerable, IEnumerable, IReadOnlyCollection, ISerializable, ISet { ++ public bool TryGetValue(T equalValue, out T actualValue); + } + } + namespace System.Data.SqlClient { ++ public abstract class SqlAuthenticationInitializer { ++ protected SqlAuthenticationInitializer(); ++ public abstract void Initialize(); ++ } + public enum SqlAuthenticationMethod { ++ ActiveDirectoryInteractive = 4, + } ++ public class SqlAuthenticationParameters { ++ protected SqlAuthenticationParameters(SqlAuthenticationMethod authenticationMethod, string serverName, string databaseName, string resource, string authority, string userId, string password, Guid connectionId); ++ public SqlAuthenticationMethod AuthenticationMethod { get; } ++ public string Authority { get; } ++ public Guid ConnectionId { get; } ++ public string DatabaseName { get; } ++ public string Password { get; } ++ public string Resource { get; } ++ public string ServerName { get; } ++ public string UserId { get; } ++ } ++ public abstract class SqlAuthenticationProvider { ++ protected SqlAuthenticationProvider(); ++ public abstract Task AcquireTokenAsync(SqlAuthenticationParameters parameters); ++ public virtual void BeforeLoad(SqlAuthenticationMethod authenticationMethod); ++ public virtual void BeforeUnload(SqlAuthenticationMethod authenticationMethod); ++ public static SqlAuthenticationProvider GetProvider(SqlAuthenticationMethod authenticationMethod); ++ public abstract bool IsSupported(SqlAuthenticationMethod authenticationMethod); ++ public static bool SetProvider(SqlAuthenticationMethod authenticationMethod, SqlAuthenticationProvider provider); ++ } ++ public class SqlAuthenticationToken { ++ public SqlAuthenticationToken(string accessToken, DateTimeOffset expiresOn); ++ public string AccessToken { get; } ++ public DateTimeOffset ExpiresOn { get; } ++ } ++ public class SqlClientLogger { ++ public SqlClientLogger(); ++ public bool IsLoggingEnabled { get; } ++ public bool LogAssert(bool value, string type, string method, string message); ++ public void LogError(string type, string method, string message); ++ public void LogInfo(string type, string method, string message); ++ } + public class SqlColumnEncryptionCertificateStoreProvider : SqlColumnEncryptionKeyStoreProvider { ++ public override byte[] SignColumnMasterKeyMetadata(string masterKeyPath, bool allowEnclaveComputations); ++ public override bool VerifyColumnMasterKeyMetadata(string masterKeyPath, bool allowEnclaveComputations, byte[] signature); + } + public class SqlColumnEncryptionCngProvider : SqlColumnEncryptionKeyStoreProvider { ++ public override byte[] SignColumnMasterKeyMetadata(string masterKeyPath, bool allowEnclaveComputations); ++ public override bool VerifyColumnMasterKeyMetadata(string masterKeyPath, bool allowEnclaveComputations, byte[] signature); + } + public class SqlColumnEncryptionCspProvider : SqlColumnEncryptionKeyStoreProvider { ++ public override byte[] SignColumnMasterKeyMetadata(string masterKeyPath, bool allowEnclaveComputations); ++ public override bool VerifyColumnMasterKeyMetadata(string masterKeyPath, bool allowEnclaveComputations, byte[] signature); + } ++ public abstract class SqlColumnEncryptionEnclaveProvider { ++ protected SqlColumnEncryptionEnclaveProvider(); ++ public abstract void CreateEnclaveSession(byte[] enclaveAttestationInfo, ECDiffieHellmanCng clientDiffieHellmanKey, string attestationUrl, string servername, out SqlEnclaveSession sqlEnclaveSession, out long counter); ++ public abstract SqlEnclaveAttestationParameters GetAttestationParameters(); ++ public abstract void GetEnclaveSession(string serverName, string attestationUrl, out SqlEnclaveSession sqlEnclaveSession, out long counter); ++ public abstract void InvalidateEnclaveSession(string serverName, string enclaveAttestationUrl, SqlEnclaveSession enclaveSession); ++ } + public abstract class SqlColumnEncryptionKeyStoreProvider { ++ public virtual byte[] SignColumnMasterKeyMetadata(string masterKeyPath, bool allowEnclaveComputations); ++ public virtual bool VerifyColumnMasterKeyMetadata(string masterKeyPath, bool allowEnclaveComputations, byte[] signature); + } + public sealed class SqlConnectionStringBuilder : DbConnectionStringBuilder { ++ public string EnclaveAttestationUrl { get; set; } + } ++ public class SqlEnclaveAttestationParameters { ++ public SqlEnclaveAttestationParameters(int protocol, byte[] input, ECDiffieHellmanCng clientDiffieHellmanKey); ++ public ECDiffieHellmanCng ClientDiffieHellmanKey { get; } ++ public int Protocol { get; } ++ public byte[] GetInput(); ++ } ++ public class SqlEnclaveSession { ++ public SqlEnclaveSession(byte[] sessionKey, long sessionId); ++ public long SessionId { get; } ++ public byte[] GetSessionKey(); ++ } + } + namespace System.IO.Compression { + public class ZipArchiveEntry { ++ public int ExternalAttributes { get; set; } + } + } + namespace System.Linq { + public static class Enumerable { ++ public static HashSet ToHashSet(this IEnumerable source); ++ public static HashSet ToHashSet(this IEnumerable source, IEqualityComparer comparer); + } + } + namespace System.Net.Http { + public class HttpClientHandler : HttpMessageHandler { ++ public static Func DangerousAcceptAnyServerCertificateValidator { get; } + } + } + namespace System.Security.Cryptography { + public class CryptoStream : Stream, IDisposable { ++ public CryptoStream(Stream stream, ICryptoTransform transform, CryptoStreamMode mode, bool leaveOpen); + } + public abstract class DSA : AsymmetricAlgorithm { ++ public static DSA Create(DSAParameters parameters); ++ public static DSA Create(int keySizeInBits); + } + public class Rfc2898DeriveBytes : DeriveBytes { ++ public Rfc2898DeriveBytes(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm); ++ public Rfc2898DeriveBytes(string password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm); ++ public Rfc2898DeriveBytes(string password, int saltSize, int iterations, HashAlgorithmName hashAlgorithm); + } + public abstract class RSA : AsymmetricAlgorithm { ++ public static RSA Create(int keySizeInBits); ++ public static RSA Create(RSAParameters parameters); + } + } + namespace System.Security.Cryptography.Pkcs { + public sealed class SignerInfo { ++ public Oid SignatureAlgorithm { get; } ++ public byte[] GetSignature(); + } + } + namespace System.Security.Cryptography.X509Certificates { ++ public sealed class CertificateRequest { ++ public CertificateRequest(string subjectName, ECDsa key, HashAlgorithmName hashAlgorithm); ++ public CertificateRequest(string subjectName, RSA key, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ public CertificateRequest(X500DistinguishedName subjectName, ECDsa key, HashAlgorithmName hashAlgorithm); ++ public CertificateRequest(X500DistinguishedName subjectName, PublicKey publicKey, HashAlgorithmName hashAlgorithm); ++ public CertificateRequest(X500DistinguishedName subjectName, RSA key, HashAlgorithmName hashAlgorithm, RSASignaturePadding padding); ++ public Collection CertificateExtensions { get; } ++ public HashAlgorithmName HashAlgorithm { get; } ++ public PublicKey PublicKey { get; } ++ public X500DistinguishedName SubjectName { get; } ++ public X509Certificate2 Create(X500DistinguishedName issuerName, X509SignatureGenerator generator, DateTimeOffset notBefore, DateTimeOffset notAfter, byte[] serialNumber); ++ public X509Certificate2 Create(X509Certificate2 issuerCertificate, DateTimeOffset notBefore, DateTimeOffset notAfter, byte[] serialNumber); ++ public X509Certificate2 CreateSelfSigned(DateTimeOffset notBefore, DateTimeOffset notAfter); ++ public byte[] CreateSigningRequest(); ++ public byte[] CreateSigningRequest(X509SignatureGenerator signatureGenerator); ++ } + public static class DSACertificateExtensions { ++ public static X509Certificate2 CopyWithPrivateKey(this X509Certificate2 certificate, DSA privateKey); + } + public static class ECDsaCertificateExtensions { ++ public static X509Certificate2 CopyWithPrivateKey(this X509Certificate2 certificate, ECDsa privateKey); + } + public static class RSACertificateExtensions { ++ public static X509Certificate2 CopyWithPrivateKey(this X509Certificate2 certificate, RSA privateKey); + } ++ public sealed class SubjectAlternativeNameBuilder { ++ public SubjectAlternativeNameBuilder(); ++ public void AddDnsName(string dnsName); ++ public void AddEmailAddress(string emailAddress); ++ public void AddIpAddress(IPAddress ipAddress); ++ public void AddUri(Uri uri); ++ public void AddUserPrincipalName(string upn); ++ public X509Extension Build(bool critical=false); ++ } + public enum X509KeyStorageFlags { ++ EphemeralKeySet = 32, + } ++ public abstract class X509SignatureGenerator { ++ protected X509SignatureGenerator(); ++ public PublicKey PublicKey { get; } ++ protected abstract PublicKey BuildPublicKey(); ++ public static X509SignatureGenerator CreateForECDsa(ECDsa key); ++ public static X509SignatureGenerator CreateForRSA(RSA key, RSASignaturePadding signaturePadding); ++ public abstract byte[] GetSignatureAlgorithmIdentifier(HashAlgorithmName hashAlgorithm); ++ public abstract byte[] SignData(byte[] data, HashAlgorithmName hashAlgorithm); ++ } + } + namespace System.Web { + public sealed class HttpCookie { ++ public SameSiteMode SameSite { get; set; } + } + public sealed class HttpRuntime { ++ public static IServiceProvider WebObjectActivator { get; set; } + } ++ public enum SameSiteMode { ++ Lax = 1, ++ None = 0, ++ Strict = 2, ++ } + } + namespace System.Web.Configuration { + public sealed class FormsAuthenticationConfiguration : ConfigurationElement { ++ public SameSiteMode CookieSameSite { get; set; } + } + public sealed class HttpCookiesSection : ConfigurationSection { ++ public SameSiteMode SameSite { get; set; } + } + public sealed class SessionStateSection : ConfigurationSection { ++ public SameSiteMode CookieSameSite { get; set; } + } + } + namespace System.Web.Security { + public sealed class FormsAuthentication { ++ public static SameSiteMode CookieSameSite { get; } + } + } + namespace System.Windows.Diagnostics { + public static class ResourceDictionaryDiagnostics { ++ public static IEnumerable GetApplicationOwners(ResourceDictionary dictionary); ++ public static IEnumerable GetFrameworkContentElementOwners(ResourceDictionary dictionary); ++ public static IEnumerable GetFrameworkElementOwners(ResourceDictionary dictionary); ++ public static IEnumerable GetResourceDictionariesForSource(Uri uri); ++ public static event EventHandler StaticResourceResolved; + } ++ public class StaticResourceResolvedEventArgs : EventArgs { ++ public ResourceDictionary ResourceDictionary { get; private set; } ++ public object ResourceKey { get; private set; } ++ public object TargetObject { get; private set; } ++ public object TargetProperty { get; private set; } ++ } + } + namespace System.Windows.Forms { + public class DataGridView : Control, ISupportInitialize { ++ protected bool ProcessF3Key(Keys keyData); + } + public class DataGridViewComboBoxCell : DataGridViewCell { ++ protected class DataGridViewComboBoxCellAccessibleObject : DataGridViewCell.DataGridViewCellAccessibleObject { ++ public DataGridViewComboBoxCellAccessibleObject(DataGridViewCell owner); ++ } ++ protected override AccessibleObject CreateAccessibilityInstance(); + } + public class DataGridViewComboBoxEditingControl : ComboBox, IDataGridViewEditingControl { ++ protected override AccessibleObject CreateAccessibilityInstance(); + } + public class DataGridViewTextBoxCell : DataGridViewCell { ++ protected class DataGridViewTextBoxCellAccessibleObject : DataGridViewCell.DataGridViewCellAccessibleObject { ++ public DataGridViewTextBoxCellAccessibleObject(DataGridViewCell owner); ++ } ++ protected override AccessibleObject CreateAccessibilityInstance(); + } + public class DataGridViewTextBoxEditingControl : TextBox, IDataGridViewEditingControl { ++ protected override AccessibleObject CreateAccessibilityInstance(); + } + public class SystemInformation { ++ public static int GetHorizontalScrollBarArrowWidthForDpi(int dpi); + } + } + namespace Microsoft.Build.Tasks.Windows { + public sealed class GenerateTemporaryTargetAssembly : Task { ++ public bool GenerateTemporaryTargetAssemblyDebuggingInformation { get; set; } + } + } + namespace Microsoft.Win32.SafeHandles { + public abstract class SafeNCryptHandle : SafeHandleZeroOrMinusOneIsInvalid { ++ protected SafeNCryptHandle(IntPtr handle, SafeHandle parentHandle); + } + public sealed class SafeNCryptKeyHandle : SafeNCryptHandle { ++ public SafeNCryptKeyHandle(IntPtr handle, SafeHandle parentHandle); + } + } +``` diff --git a/releases/net472/dotnet472-changes.md b/releases/net472/dotnet472-changes.md new file mode 100644 index 000000000..74ac710e3 --- /dev/null +++ b/releases/net472/dotnet472-changes.md @@ -0,0 +1,226 @@ +# .NET Framework 4.7.2 Release Notes + +.NET Framework release notes describe product improvements grouped by product area. Each change includes a Microsoft-internal VSTS bug ID, the primary binary that was updated and whether the change was a bug or a feature. + +## ASPNET +* Support for Dependency Injection in Page, Custom Handler and User controls. [364308, system.web.dll, Feature] +* Enable ASP.NET developers to specify MaxLength attribute for Multiline asp:TextBox. [449020, System.Web.dll, Bug] +* Avoid InvalidCastException when running an ASP.NET application that works with mixed HttpWorkerRequests types and has FREB/ETW tracing enabled. [472566, system.web.dll, Bug] +* Fixed issue https://github.com/Microsoft/dotnet-framework-early-access/issues/2 [479409, 521834, system.web.dll, Bug] +* With this improvement, users who created apps on .NET Framework 4.7.2+ or upgraded apps to .NET Framework 4.7.2+, if they don't specify the appsetting value in their configurations, they won't be using regexes in data type attributes (such as EmailAddressAttribute, UrlAttribute, and PhoneAttribute). They will instead use a simpler implementation. [480141, system.web.dll, Bug] +* Support for SameSite property in HttpCookie. [497045, system.web.dll, Feature] +* Fixed bug in ASP.NET LowPhysicalMemoryMonitor where the monitor might fail to start if memory use falls within a certain range. [531575, system.web.dll, Bug] +* Fixed bug in ASP.NET LowPhysicalMemoryMonitor where the default polling interval is sometimes mistakenly disabled. [531576, system.web.dll, Bug] +* Fixed the behavior of ASP.NET's RecycleLimitMonitor in cases where no private bytes recycling limit is explicitly set in IIS configuration. [531579, system.web.dll, Bug] + +## BCL +* Increased throughput of decompression zip archives by ~3x. [199232, mscorlib.dll, Feature] +* Reduction in HashSet memory consumption via StructLayout. [212195, mscorlib.dll, Bug] +* Added ConcurrentDictionary GetOrAdd/AddOrUpdate overloads with generic argument. [212212, 212820, 515491, mscorlib.dll, Feature] +* Improvement in performance of ConcurrentDictionary. [212582, mscorlib.dll, Bug] +* Performance improvements for HashSet construction from another HashSet. [212624, mscorlib.dll, Bug] +* Added HashSet ctors with capacity. [212788, mscorlib.dll, Feature] +* Support for additional DSA factory methods to make key creation easier. [221261, mscorlib.dll, Feature] +* Support for additional RSA factory methods to make key creation easier. [223399, mscorlib.dll, Feature] +* Improved reliability when working with large expression trees. [256966, system.core.dll, Bug] +* Support for loading certificate PFX files without writing the private key to the hard drive. [258543, mscorlib.dll, Feature] +* Added a leaveOpen constructor on CryptoStream to mitigate problems with disposing the CryptoStream that ends up disposing the underlying stream which is not desirable in certain scenarios. [272215, mscorlib.dll, Bug] +* Support for SHA-2 hash algorithms in Rfc2898DeriveBytes. [272906, mscorlib.dll, Feature] +* Implement Enumerable.ToHashSet. [291752, system.core.dll, Feature] +* Added TryGetValue method to HashSet. [381763, system.core.dll, Feature] +* Fixed a problem where using OnDeserilalizingAttribute/OnDeserializedAttribute/OnSerializingAttribute/OnSerializedAttribute in a type in an assembly targeting NetStandard 2.0 would throw a TypeLoadException when accessing the type. [407239, mscorlib.dll, Bug] +* Support for programmatically creating X.509 certificates and certificate signing requests. [428598, mscorlib.dll, Feature] +* Fixed a problem where EventSource logging to ETW can fail in 32-bit large address aware processes. [443469, system.dll, Bug] +* Fixed security vulnerability tracked by Microsoft Common Vulnerabilities and Exposures CVE-2018-0764. [455812, 507252, system.xml.dll, Bug] +* Fixed a problem in returning Byte-Order-Mark with UTF8 objects when the default codepage on Windows is set to UTF8 codepage (65001) in Encoding.Default. Applications run into problems in this scenario and the Byte-Order-Mark is no longer sent with the UTF8 objects. [460626, mscorlib.dll, Bug] +* ReaderWriterLockSlim now scales better under contention. See https://github.com/dotnet/coreclr/pull/13495 and https://github.com/dotnet/coreclr/pull/13243 for more details. [468648, mscorlib.dll, Bug] +* File and directory enumeration performance is now improved. Enumerating will be faster and allocate significantly less than before. [470762, mscorlib.dll, Bug] +* Increment the assembly version of System.Net.Http and System.IO.Compression to be compatible with netstandard 2.0 and the compatibility package. [504519, mscorlib.dll, Feature] +* Fixed problem where in certain scenarios corrupted zip is produced. [504526, mscorlib.dll, Bug] +* Avoid allocations in DateTime.Now [504528, mscorlib.dll, Bug] +* Make Lazy initialization of TextInfo.IsAsciiCasingSameAsInvariant thread safe. [504530, mscorlib.dll, Bug] +* Use beforefieldinit field for Comparer/EqualityComparer.Default. [504531, mscorlib.dll, Bug] +* Peformance of Buffer.MemoryCopy was significantly improved for smaller buffers. [504573, mscorlib.dll, Bug] +* Improve string.Equals OrdinalIgnoreCase performance for matching chars. [504580, mscorlib.dll, Bug] +* Avoid duplicated computations with DateTime.GetDatePart. [504591, 504571, mscorlib.dll, Bug] +* Make GetProcessInfo() for a single PID cheaper on Windows. [505023, mscorlib.dll, Bug] +* Support for netstandard runtime facade type forward to contracts when possible, to enable usage of OOB types that were moved inbox on a .NET Framework 4.6.1 app that tries to run on .NET Framework 4.7.1+. [510901, mscorlib.dll, Bug] +* Support for compatibility with the support package, so that running netstandard apps on .NET Framework 4.7.1 is possible. [514195, mscorlib.dll, Bug] +* Support for ephemeral asymmetric keys to be consistently exportable. [516638, mscorlib.dll, Bug] +* Exposed the signature algorithm identifier and the signature value on CMS SignerInfo. [517223, mscorlib.dll, Feature] +* Performance improvement of ManualResetEventSlim under contention. [517311, mscorlib.dll, Bug] +* Fixed managed attributes for assemblies System.Diagnostics.Tracing.dll, System.IO.Compression.dll, and System.Net.Http.dll. [522034, System.dll, Bug] +* Enable CodeDOM to generate trusted code when Device Guard by maintaining integrity of inputs and outputs. [526489, mscorlib.dll, Feature] +* Fixed problem with RuntimeInformation static class to now return the right value for architecture. [534300, mscorlib.dll, Bug] +* Fixed a problem in deserialization of Collections which uses culture aware StringComparer. [568713, mscorlib.dll, Bug] + +## CLR +* Reliably handle scenarios where framework assemblies are present in DEVPATH. [207947, clr.dll, Bug] +* The GC will now compact the heap more aggressively when running out of virtual address space in 32-bit processes, even if there is a great deal of physical memory available on the machine. [377888, clr.dll, Bug] +* Fixed hang when loading NI images whose IL assemblies are not in the GAC, where the NI images have circular dependencies and COMPlus_NgenBind_OptimizeNonGac is enabled. [452001, clr.dll, Bug] +* Fixed a silent bad codegen bug. [467692, clrjit.dll, Bug] +* Improved reliability in a scenario with certain mixtures of LOH heap expansion and background GC operation. [470006, clr.dll, Bug] +* This fixes a bad error message with truncated type names when running TlbExp.exe with /verbose, or using ITypeLibExporterNotifySink.ReportEvent API. [480497, Tlbexp.exe, Bug] +* Improved error handling capabilities so that the .NET runtime process is more likely to exit in GC heap corruption situations, instead of causing application to be in a suspended state. [487133, clr.dll, Bug] +* Fixed a problem where the GC can crash when recovering from an out-of-memory exception when performing a GC. [487315, clr.dll, Bug] +* Fixed problem where certain multithreaded programs can experience extremely intermittent crashes, normally during program startup. [490377, clr.dll, Bug] +* Fixed unpredictable crashes that can occur when trying to read custom attributes from assemblies carrying an invalid metadata pattern emitted by certain pre-v2 compilers. [497461, clr.dll, Bug] +* Fixed hang when loading NI images whose IL assemblies are not in the GAC, where the NI images have circular dependencies and COMPlus_NgenBind_OptimizeNonGac is enabled. [509957, clr.dll, Bug] +* Fixed a potential deadlock in ReadyToRun scenarios in cases where exception handling and code heap modification occur simultaneously. [510081, clrjit.dll, Bug] +* Fixed a floating-point overflow in the thread pool’s hill climbing algorithm. [511559, clr.dll, Bug] +* Hardens .NET library loading security if an administrator opts into the new Device Guard Dynamic Code Security policy. [517453, clr.dll, Bug] +* Fixed a problem where a SetConsoleCtrlHandler function is not executed during debugging when Visual Studio is set to not handle Ctrl+C events. [518982, system.dll, Bug] +* This change adds a dynamic method unload event that is fired whenever a dynamic method is destroyed. This is needed because profilers can listen to dynamic method load events (via DynamicMethodJittingStarted/Finished) but previously would never be notified of destroyed dynamic methods. This can happen for example when the dynamic method is garbage collected. [523635, CorGuids.lib, Feature] +* Improved reliability of jump stub allocation. Corresponding .NET Core change: https://github.com/dotnet/coreclr/pull/15296 [537668, clr.dll, Bug] +* Fixed problems in Server GC when the user asks to not affinitize (can be done via an application configuration switch) by not setting ideal processor in these conditions. [581080, clr.dll, Bug] +* Fixed very high CPU usage problem in the write watch implementation when it incurs a page fault. [583247, clr.dll, Bug] +* Fixed a potential crash with concurrent calls to a new dynamic method. [584962, clr.dll, Bug] +* Fixed a problem in JIT compiler where it generates incorrect code for an IL pattern used by compilers for languages such as COBOL. [574984, 581050, clrjit.dll, Bug] + + +## ClickOnce +* Fixed validation of SHA2 certificates for ClickOnce applications to allow avoiding SmartScreen for trusted publishers. This also allows customers to block installation of unsigned ClickOnce applications. [395008, system.deployment.dll, Bug] +* With this improvement, WPF developers can set a non-default DPI Awareness mode in their application manifest to take advantage of recent OS improvements in HDPI while still able to deploy via ClickOnce. [480091, Dfshim.dll, Feature] +* Support for timestamping ClickOnce manifest using RFC3161 timestamp servers. [480646, mage.exe, Feature] +* The value of the progress bar in the ClickOnce installation progress window is now read correctly by the Narrator. The decorative dividers of the ClickOnce installation progress window are no longer read by the Narrator. [526717, dfsvc.exe, Bug] +* ClickOnce app install and app launch windows are now accessible for the Narrator users [523737, dfsvc.exe, Bug] + +## Networking +* Improved reliability by correctly processing Unicode characters in file URIs that point to UNC shares. [95292, System.dll, Bug] +* Fixed a reliability problem with how IPV6 Addresses are converted to strings after their scope ID has been modified. [95508, System.dll, Bug] +* Improved reliability in the scenario where HttpClientHandler.SendAsync functions as expected even when started in a task with a custom TaskScheduler. [110673, System.dll, Bug] +* Fixed HttpClient so that OperationCanceledException/TaskCanceledException's being returned from canceled requests will now have the proper settings on the Exception.CancellationToken property. [111275, System.dll, Bug] +* Fixed argument validation of System.Net.Mime.HeaderCollection Set/Add methods, and correct parameter name in exception message. [116743, System.dll, Bug] +* Fixed Socket ReceiveAsync to use the specified output buffers when receiving data extremely quickly over TCP and using several different sized buffers. [119549, System.dll, Bug] +* Fixed a problem in System.Uri where Unicode bidirectional control characters would be stripped from a Uri during parsing. This behavior change can be disabled by setting the new App Context Switch Switch.System.Uri.DontKeepUnicodeBidiFormattingCharacters. [130850, System.dll, Bug] +* Fixed parsing of ‘Set-Cookie’ headers received with Http APIs (HttpWebRequest, WebClient, HttpClient) for CookieContainer so that all valid cookies are correctly stored in the CookieContainer. [143892, System.dll, Bug] +* Fixed a problem with System.Uri to ensure that URI reserved character decoding behavior strictly conforms to the RFC 3986 specification. This means that the percent encoded versions of " : ", " ' ", " ( ", " ) ", " ! " and " * " will no longer be incorrectly decoded when generating the absolute URI. [150266, System.dll, Bug] +* Use a global lock to protect AddressChangeListener and AvailabilityChangeListener states from race conditions. [162830, System.dll, Bug] +* Socket.BeginConnect will now consistently throw InvalidOperationException when attempting multiple operations. [188428, System.dll, Bug] +* Improved reliability by ensuring that URIs with unknown schemes and no host are normalized correctly and the URI path is processed correctly. [233623, System.dll, Bug] +* Fixed the System.Net.Http.Headers.ContentDispositionHeaderValue class so that setting the Size property no longer throws a NullReferenceException. [251481, System.dll, Bug] +* Fixed a problem by preventing System.Uri.TryCreate from throwing a NullReferenceException when creating a relative URI that contains Unicode characters. [287019, System.dll, Bug] +* Fixed a reliability issue with HttpWebRequest so that closed connections can be correctly removed from the connection pool and additional requests sent correctly. [371763, System.dll, Bug] +* Added implementation to HttpClientHandler so that the newly added properties in .NET Framework 4.7.1 will no longer throw PlatformNotSupportedException. [386926, System.dll, Feature] +* Fixed ServicePoint.CloseConnectionGroup() so that it properly closes all connections associated with the connection group name passed in the method parameter. [404684, System.dll, Bug] +* Fixed the System.Net.WebHeaderCollection.GetValues() method to properly return cookies that have an 'Expires' attribute. [467951, System.dll, Bug] +* Fixed System.Net HTTP APIs (WebClient, HttpWebRequest, HttpClient) so that connections to the proxy to set up the CONNECT tunnel (for TLS/SSL requests) will now have the 'User-Agent' header passed to the request if that header was added by the developer to the original http request. [486995, System.dll, Bug] +* Fixed a reliability issue with HttpWebRequest and HttpClient where socket connection errors would prevent Http requests from being retried automatically. [493616, System.dll, Bug] +* Fixed SmtpClient so that it can properly send mail to SMTP servers that use the Kerberos protocol via GSSAPI for authentication. [495813, System.dll, Bug] +* Eliminate a deadlock situation when closing WebSocket connections. [497690, System.dll, Bug] +* Fixed a problem with AppContext switch Switch.System.Net.DontEnableSchSendAuxRecord where it failed to properly allow for the switch to be enabled. [511005, System.dll, Bug] +* Fixed a problem with connection limit when using HttpClient to send requests to loopback addresses. More info: https://github.com/Microsoft/dotnet/blob/master/releases/net471/KnownIssues/534719-Networking%20ServicePoint.ConnectionLimit%20default%20behavior%20with%20loopback%20changed%20unexpectedly.md. [534719, System.dll, Bug] + +## SQL +* While receiving XEvents using SqlClient, the last XEvent was not retrieved unless the server pushed more data down to the client. This bug is fixed. All XEvents will not be instantly available. [104572, System.Data.dll, Bug] +* Fixed the DataSet memory leak issue in System.data.dll. Datatable constraint’s Dataset field will be equal to Datatable’s Dataset field once Datatable’s DataSet is modified. [404667, System.Data.dll, Bug] +* SQL Azure can now support failover-partner when connecting to GeoDr database using readonly application intent, failover partner is one secondary DB replica specified by SQLAzure during the login time. [479724, System.Data.dll, Feature] +* Added support for Always Encrypted leveraging enclave technologies. [481138, 524384, System.Data.dll, Feature] +* With this fix, SqlBulkCopy can be performed without the issue caused when SqlDecimal 0 is inserted to a table column which type has the same precision size as its scales size. It prevents the SqlBulkCopy error caused when a SqlDecimal value having larger precision than its minimum precision is inserted to a table column, which the SqlDecimal value can be adjusted to fit the column type. [481988, System.Data.dll, Bug] +* Added a new value for the SQL connection string keyword. [484823, System.Data.dll, Feature] +* This prevents potential Connection Pool fragmentation and increases the performance of connection opening. [489852, System.Data.dll, Bug] +* This prevents connection hang that happens when users try to connect to mirrored SQL Server with timeout set to 0. [498136, System.Data.dll, Bug] +* This change adds a try-finally wrapper around AbortTransaction() calls in SqlBulkCopy. WriteRowSourceToServerAsync(). The finally block ensures a lock is properly released in case AbortTransaction throws an exception due to a closed underlying connection. Not releasing the lock can lead to hangs later on in SqlConnection.Dispose() and Close(). [499706, System.Data.dll, Bug] +* Fixed failure to get return value from stored procedure in SQL Server when the return value type is VARCHAR(8000) and output string has length longer than 3,999. [504075, System.Data.dll, Bug] +* Fixed error connecting to read only secondary via routing table when connecting using the AOAG listener and specifying Column Encryption Setting=Enabled and ApplicationIntent=Readonly. [510851, System.Data.dll, Bug] +* Integrating Azure AD Universal and Multi-factor authentication (MFA) support with SQL .NET driver. [521874, System.Data.dll, Feature] +* Signature verification results are now cached improving query execution times for enclave-based queries. [552762, System.Data.dll, Feature] +* Fixes an issue where while using SqlConnection.ConnectionString to set a null or empty connection string a NRE exception would be thrown by the usage of the API while using .Net Framework 4.7.2. [611802, System.Data.dll, Bug] +* While connecting to Azure SQL DB and using MultipleActiveResultSets=true in the connection string with System.Data.SqlClient.SqlConnection, the async query operations would result in a bad TDS protocol request stream being sent from the client, causing the async query APIs to fail. This is now fixed. [620109, System.Data.dll , Bug] + +## WCF +* Fixed service response problems owing to deadlock in SharedTcpTransportManager.OnClose and OnReceiveComplete. [455781, System.ServiceModel.dll, Bug] +* Improved performance in a scenario where an application is using BinaryFormater to serialize/deserialize large number of objects. This fix needs to be opted-into by configuration setting. [443438, 497686, System.Runtime.Serialization.dll, Bug] +* Improved accessibility for the WCF Service Trace Viewer by updating the focus order of UI components to be more logical [465130, SvcTraceViewer.exe, Bug] +* Improved accessibility for the WCF Service Trace Viewer and the WCF Service Configuration Editor to follow high contrast standards.[505605, SvcConfigEditor.exe, SvcTraceViewer.exe, Bug] +* A race-condition exists in the Abort code-path of SyncDuplexRequest. When the race-condition occurs, we try to set a ManualResetEvent that has already been closed, which results in an ObjectDisposedException. This happens in one of the threadPool threads and as a result an exception is thrown. When this happens, the exception crashes the service. [513726, System.Servicemodel.dll, Bug] +* Improved chain trust certificate validation when using certificate authentication with transport security with WCF. With this improvement client certificates that are used to authenticate to a server must be configured for Client Authentication. Similarly server certificates that are for the authenticating a server must be configured for Server Authentication. With this change if the root certificate is disabled, the certificate chain validation will fail. [516393, System.Servicemodel.dll, Bug] +* Fixed an issue with serializing deeply linked data when using DataContractSerializer. [527549, System.Runtime.Serialization.dll, Bug] + +## Windows Forms +* PrivateFontCollection class now releases lock on GDI Fonts that are added to the collection as files [126279, System.Drawing.dll, Bug] +* Fixed a NullReferenceException that would occur when DataGridView.Dispose is called on some systems. [295566, System.Windows.Forms.dll, Bug] +* Fixed problems with DomainUpDown "up" and "down" unsymmetrical operations. [362787, System.Windows.Forms.dll, Bug] +* The arrow of "Type name display style" dropdown button of Document outline window is now painted correctly when it is selected, and HC mode is enabled. This change is effective in applications that were recompiled to target .Net Framework 4.7.2 [386393, System.Windows.Forms.dll, Bug] +* MageUI.exe SDK tool now has localized update units combobox items. [397545, MageUI.exe, Bug] +* Validation warning dialog in MageUI.exe SDK tool is now localized. [397576, MageUI.exe, Bug] +* Made Culture combobox of Mage UI App/Deployment Manifest Name dialog wider to fit all the text it's items contain [397578, System.Windows.Forms.dll, Bug] +* Fixed a problem where the child control collection ordering of tab pages could get out of sync with the physical ordering of tabs in a tab control. [411856, System.Windows.Forms.dll, Bug] +* The following changes are effective in applications that are either recompiled to target .NET Framework 4.7.2, or the following switches are added to the app.config file: + ```xml + + ``` + * Improved accessibility for the PropertyGrid, DataGridView, CheckBox, RadioButton and ToolStrip controls. +[409783, 458754, 459106, 484522, 497774, 500509, 503194, 508364, 513314, System.Windows.Forms.dll, Bug] + * Narrator now reads out the ToolStripMenuItem accelerator key. [404279, System.Windows.Forms.dll, Bug] + * Fixed standard button focus dot line colors in High Contrast mode. [429823, System.Windows.Forms.dll, Bug] + * Improved accessibility of the DataGridView control by implementing both Grid and Table UIA patterns. [435320, System.Windows.Forms.dll, Bug] + * The DataGridView control now supports F3 command to update the sort order in the table. [435621, System.Windows.Forms.dll, Bug] + * Improved keyboard accessibility of ToolStrips hosted in ToolStripContainers. For a Windows Forms application to get all accessibility improvements that were introduced in .NET Framework 4.7.2, the application should be recompiled to target .NET framework 4.7.2 or the application should explicitly opt-in into all accessibility app compat switches in the app.config file. [441148, 518461, System.Windows.Forms.dll, Bug] + * Improved rendering of disabled, FlatStyle=Standard (the default) WinForms RadioButton, CheckBox and GroupBox controls in High Contrast themes. These changes will be effective only on the latest version of Windows 10 (Fall Creator's update), as the corresponding changes in the Windows code are required and in applications that target .Net Framework 4.7.2. [455890, System.Windows.Forms.dll, Bug] + * ContextMenuStrip.SourceControl property now correctly returns the expected control source in nested ToolStripMenuItem cases. [460662, System.Windows.Forms.dll, Bug] + * Fixed text color in pressed and selected modes for toolStripButton, toolStripSplitButton and toolStripDropDownButton in HC Modes. + * Improved high contrast experience for DataGridView link cells. This change is effective in applications that were recompiled to target .Net Framework 4.7.2 [475501, System.Windows.Forms.dll, Bug] + * ToolStrip.State will now return AccessibleStates.Unavailable | AccessibleStates.Focused for disabled menu items whereas before it would only return AccessibleStates.Focused. This change enables Narrator to correctly announce the disabled menu items as being disabled. [483700, System.Windows.Forms.dll, Bug] + * Fixed arrow color in focused mode for toolStripComboBox in HC Mode. [473866, System.Windows.Forms.dll, Bug] +* Fixed a problem introduced in .NET Framework 4.7 in a scenario when a developer uses Configure.Save() method and add an empty section that may not be read while loading project, causing failure in Project load. [461647, System.Windows.Forms.dll, Bug] +* Updated Open, Save, Undo and Redo icons for WinRes.exe in .NET Framework SDK. [464542, WinRes.exe, Bug] +* MageUI.exe SDK tool now has localized update units combobox items. [468602, MageUI.exe, Bug] +* Support for PerMovitorV2 DPI awareness in Flat and PopUp ComboBox controls. [473703, System.Windows.Forms.dll, Bug] +* MageUI manifest validation prompt header is now fully visible. [475210, MageUI.exe, Bug] +* It is possible to switch from designer to property browser of WinRes.exe with F4 key now. It is also possible to switch back using Esc key now. [477857, System.Windows.Forms.dll, Bug] +* Fixed incorrect "..." button text truncation for Mage UI Sign on Save dialog when CHS locale is enabled. [484526, System.Windows.Forms.dll, Bug] +* Resized "Select Culture" dialog of WinRes to make sure that all the text it contains fits the dialog correctly. [488099, WinRes.exe, Bug] +* Implemented Ctrl+Alt+O shortcut to access Output window of WinRes via the keyboard. [513054, System.Windows.Forms.dll, Bug] +* Fixed the narrator focus order for the ClickOnce download progress window. [530637, System.Windows.Forms.dll, Bug] + +## Workflow +* In a self-hosted environment when program initialization tasks are executed in parallel and there are common assembly loads happening in each thread, a deadlock could occur. [251926, system.activities.dll, Bug] +* Previously it was possible to encounter a stack overflow in the workflow service hosting process (W3WP.exe) when IWorkflowInstanceManagement.TransactedCancel or IWorkflowInstanceManagement.TransactedTermnate operations were performed. This can be avoided by adding an AppSetting to the Web.Config for the service: + ```xml + + + + ``` + The outcome of the transaction does not affect whether the cancel or terminate operation is performed. There is no ""undo"" of a cancel or terminate if the transaction is rolled back. [258978, System.Servicemodel.dll, Bug] +* Improved WorkflowDesignerColors class. [479504, system.activities.dll, Feature] +* Improved accessibility for buttons on workflow designer under HC theme. This change is effective in applications that were recompiled to target .Net Framework 4.7.2 [407093, system.activities.dll, Bug] +* Improved accessibility for workflow activities by removing irrelevant information associated with them. This change is effective in applications that were recompiled to target .NET Framework 4.7.2. [408329, system.activities.dll, Bug] +* Improved accessibility in Workflow designer. Specifically, there are fixes in high contrast mode, focus of different controls and dialogs and name properties. [447654, System.Activities.Presentation.dll, Bug] +* Previously, when using TransactionScopeAsyncFlowOption.Enabled and there you had a non-null Transaction.Current and you did a remote AppDomain call and the lease lifetime expired while that remote AppDomain call was outstanding, Transaction.Current could be null upon return from that call. This is now fixed so that Transaction.Current will be the same after the remote AppDomain call as before the call. [516454, system.transactions.dll, Bug] + +## WPF +* Fixed a crash arising when opening a popup within an item in an ItemsControls with VirtualizationMode=Recycling. [161345, PresentationFramework.dll, Bug] +* In Win8+ themes, a disabled Button sets foreground to gray on its ContentPresenter. This inherits to descendants of the ContentPresenter, but not to elements whose logical parent is the Button itself - like the TextBlock. So the Button and its logical child TextBlock kept the default black foreground. This fix removes the setting of foreground on ContentPresenter and sets the foreground on the button to gray, which then extends to its descendants. [204105, PresentationFramework.dll, Bug] +* When an element joins the visual tree, a property can receive an inherited value even when a higher-priority value becomes available at the same time, via a newly-resolvable DynamicResource reference. This can arise when scrolling a list where VirtualizationMode=Recycling. [208745, PresentationFramework.dll, Bug] +* Fixed a memory leak arising from certain bindings that involve DataSet or related classes (from System.Data.dll). [297912, PresentationFramework.dll, Bug] +* Fixed data corruption arising when a scrolling DataGrid with VirtualizationMode=Recycling. [405066, PresentationFramework.dll, Bug] +* In WPF applications running under certain themes, selected text in TextBox and PasswordBox may not be visible. This is due to the selection being rendered on top of the text in the Adorner layer. This feature adds an AppContext switch (Switch.System.Windows.Controls.Text.UseAdornerForTextboxSelectionRendering) that, when set to false, will cause WPF to render the selection underneath the text, allowing for good visibility in TextBox and PasswordBox. Note that this does not apply to RichTextBox. [405199, PresentationFramework.dll, Bug] +* The following changes are effective in applications that are either recompiled to target .NET Framework 4.7.2, or the following switches are added to the app.config file: + ```xml + + ``` + * Applications with multiple hosting layers between WPF and WinForms may experience incorrect focus navigation when pressing the Tab Key. This is now fixed. [445603, PresentationCore.dll, Bug] + * Fixed a problem where the keyboard focus visual of Checkbox and RadioButton may be difficult to see in WPF applications running under classic themes or in high contrast scenarios. [447590, PresentationFramework.dll, Bug] +* In a master/detail scenario using ADO data, changing the primary key of a master item cleared the display of the corresponding details, with no way to display them thereafter. This is fixed by default for apps targeting .NET Framework 4.7.2, and for all apps that set the app-context switch ```Switch.System.Windows.Data.DoNotUseFollowParentWhenBindingToADODataRelation``` to false. [457740, PresentationFramework.dll, Bug] +* Users may not be able to tab out of a WPF ElementHost contained in a Winforms app when hitting SHIFT + TAB, this issue is fixed now. [458074, WindowsFormsIntegration.dll, Bug] +* Fixed scrolling issues arising in a TreeView that uses VisualStateManager to animate visibility when expanding or collapsing nodes. [460617, PresentationFramework.dll, Bug] +* Improved Keytip behavior to bring parity with behavior on Word and Explorer. Now Keytips would not dismiss a menu launched by mouse. [476533, PresentationFramework.dll, Bug] +* Under certain conditions, a WPF application running on a touch or stylus-enabled machine could possibly see hangs or crashes associated with touch or stylus input. This would manifest as time spent searching a dictionary on one of the Stylus Input threads. This change fixes this issue. [485595, PresentationCore.dll, Bug] +* Added a new method to the System.Windows.Diagnostics.ResourceDictionaryDiagnostics class that returns the ResourceDictionaries created for a given source Uri. This method is for use by diagnostic assistants such as Visual Studio's "UI Debug Tools". [494203, PresentationFramework.dll, Feature] +* Added new methods to the System.Windows.Diagnostics.ResourceDictionaryDiagnostics class that return the owners of a given ResourceDictionary. These methods are for use by diagnostic assistants such as Visual Studio's "UI Debug Tools". [494205, PresentationFramework.dll, Feature] +* Added a new event to the System.Windows.Diagnostics.ResourceDictionaryDiagnostics class that reports when StaticResource references are resolved. This event is for use by diagnostic assistants such as Visual Studio's "UI Debug Tools". [494207, PresentationFramework.dll, Feature] +* Fixed rendering issues in Windows Presentation Foundation (WPF) applications that are run within a Windows service that may occur with the September 12, 2017, .NET Security and Quality Rollups that apply to the .NET Framework 4.6, 4.6.1, 4.6.2, and 4.7. [494626, PresentationCore.dll, Bug] +* Reliability improvements for WPF applications running on touch or stylus-enabled machines with long periods of touch inactivity. [514949, PenIMC.dll, Bug] +* In a specific case(s), the System.Windows.Controls.PrintDialog() throws an Arithmetic Overflow exception. This change fixes that issue. [514977, PresentationFramework.dll, Bug] +* A WPF TreeView with virtualization and pixel-scrolling enabled can experience a StackOverflowException due to infinite recursion when (a) all the TreeViewItems have the same height, and (b) the user scrolls to a position just before an item boundary - within a millionth of a pixel. [519728, PresentationFramework.dll, Bug] +* Some dual GPU machines may experience visual artifacts while running WPF apps in high contrast, this issue is now fixed. [525011, PresentationCore.dll, Bug] +* Fixed the issue described in https://github.com/NuGet/Home/issues/5894 [530595, PresentationBuildTasks.dll, Microsoft.WinFX.targets, Bug] +* Applications loading two versions of the same resource assembly may get XamlParseExceptions for resources not found, even when the resource exists in the assembly. This issue is fixed for applications that set the AppContext flag ```Switch.System.Windows.Baml2006.AppendLocalAssemblyVersionForSourceUri``` to false. [546550, PresentationCore.dll; PresentationFramework.dll, Bug] +* Fixed a crash that can occur during shutdown of an application that hosts WPF content in a separate AppDomain. An example of this is an Office application hosting a VSTO add-in that uses WPF. [581148, PresentationCore.dll, Bug] +* Fixed a problem where a WPF application that changes TreeView.IsEnabled and (at the same time) changes the underlying collection(s) could experience a spurious ElementNotAvailableException. [581149, PresentationCore.dll, PresentationFramework.dll, Bug] +* Fixed a problem where a WPF application can crash with NullReferenceException when changing a property used by a DataTrigger whose host element has been removed from the visual tree. This crash only occurs if the host element is garbage-collected during a small window of time during the property-change notification. [581151, PresentationCore.dll, Bug] +* Fixed a problem that causes XAML Browser Applications (XBAP’s) targeting .NET 3.5 to sometimes be loaded using .NET 4.x runtime incorrectly. This fix requires the setting of an opt-in registry key described at https://github.com/Microsoft/dotnet/blob/net472/releases/net472/KnownIssues/560016-XBAP%20Applications%20targeting%20.NET%202.0%2C3.5%20select%20wrong%20runtime%20version.md [581487, PresentationHost_v0400.dll, Bug] +* Adds an AppContext switch that opts out of some work done during AppDomain or process shutdown. This can reduce (but not eliminate) the chance of a crash in apps that make unwarranted assumptions about the timing of the finalizer thread. [593963, WindowsBase.dll, Bug] +* Fixes a crash in WPF when replacing multiple characters with a single character (in a different language than the replaced text) using IMEPad. [605996, PresentationFramework.dll, Bug] +* ComboBox grouped items now report children correctly via UIAutomation. [605922, PresentationFramework.dll, Bug] diff --git a/releases/net472/dotnet472-known-issues.md b/releases/net472/dotnet472-known-issues.md new file mode 100644 index 000000000..241bd45a6 --- /dev/null +++ b/releases/net472/dotnet472-known-issues.md @@ -0,0 +1,18 @@ +.NET Framework 4.7.2 Known Issues +================================= + +This document lists the known issues that you may experience after you install the Microsoft .NET Framework 4.7.2. + +## Product issues for the .NET Framework 4.7.2 +- [405199 - WPF - Non-Adorner TextSelection Occludes Text](https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/405199%20-%20WPF%20Non-Adorner%20TextSelection%20Occludes%20Text.md) +- [504055 - WPF - WPF May Not Show Touch Keyboard In All Scenarios on Windows 10 April 2018 Update](https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/504055%20-%20WPF%20May%20Not%20Show%20Touch%20Keyboard%20In%20All%20Scenarios%20on%20Windows%2010%20April%202018%20Update.md) +- [593963 - WPF - WPF Exceptions during AppDomain or process shutdown](https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/593963%20-%20WPF%20Exceptions%20during%20AppDomain%20or%20process%20shutdown.md) +- [560016 - XBAP - Applications targeting .NET 2.0,3.5 select wrong runtime version](https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/560016-XBAP%20Applications%20targeting%20.NET%202.0%2C3.5%20select%20wrong%20runtime%20version.md) +- [593963 - WPF Exceptions during AppDomain or process shutdown](https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/593963%20-%20WPF%20Exceptions%20during%20AppDomain%20or%20process%20shutdown.md) +- [599936 - WinForms - Narrator does not announce the ReadOnly Status for DataGridView TextBox column with the TextBox column Readonly property set as true](https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/599936%20-%20Narrator%20does%20not%20annouce%20the%20ReadOnly%20Status%20for%20DataGridView%20TextBox%20column%20with%20the%20TextBox%20column%20Readonly%20property%20set%20as%20true.md) +- [611802 - SQL - SQLConnection.ConnectionString throws NullReferenceException](https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/611802%20-%20SQLConnection.ConnectionString%20throws%20NullReferenceException%20.md) +- [613745 - BCL - Single-name references are removed by the SDK when targeting 4.7.2](https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/613745%20-%20Single-name%20references%20are%20removed%20by%20the%20SDK%20when%20targeting%204.7.2.md) +- [663475 - Setup - Applications that rely on TLS 1.2 strong encryption experience connectivity failures after a Windows upgrade](https://support.microsoft.com/help/4458166) +- [669153 - Remoting calls made within a transaction can lead to Transaction.Current incorrectly returning null](https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/669153%20-%20Remoting%20calls%20made%20within%20a%20transaction%20can%20lead%20to%20Transaction.Current%20incorrectly%20returning%20null.md) +- [695400 - Setup fails to install the product after migrating OS from Windows 7 or Windows Server 2008 R2](https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/695400%20-%20Setup%20fails%20to%20install%20the%20product%20after%20migrating%20OS%20from%20Windows%207%20or%20Windows%20Server%202008%20R2.md) +- [706819 - Winforms applications may have problems rendering UI on Windows 10 October 2018 Update](https://github.com/Microsoft/dotnet/blob/master/releases/net472/KnownIssues/706819%20-%20Winforms%20applications%20may%20have%20problems%20rendering%20UI%20on%20latest%20Operating%20Systems.md) diff --git a/releases/net48/KnownIssues/776516-InvalidOperationException in System_Web_ni!System.Web.Hosting.RecycleLimitMonitor+RecycleLimitMonitorSingleton.AlertProxyMonitors.md b/releases/net48/KnownIssues/776516-InvalidOperationException in System_Web_ni!System.Web.Hosting.RecycleLimitMonitor+RecycleLimitMonitorSingleton.AlertProxyMonitors.md new file mode 100644 index 000000000..95280851d --- /dev/null +++ b/releases/net48/KnownIssues/776516-InvalidOperationException in System_Web_ni!System.Web.Hosting.RecycleLimitMonitor+RecycleLimitMonitorSingleton.AlertProxyMonitors.md @@ -0,0 +1,20 @@ +# InvalidOperationException in ASP.Net-RecycleLimitMonitor-AlertProxyMonitors + +## Symptoms +ASP.Net applications may crash intermittently due to an `InvalidOperationException` in +`System_Web_ni!System.Web.Hosting.RecycleLimitMonitor+RecycleLimitMonitorSingleton.AlertProxyMonitors`. + +## Cause +This issue was introduced when ASP.Net 4.7 separated cache management and memory monitoring. This new `RecycleLimitMonitorSingleton` monitors worker process private bytes usage against the recycling limit for the process, and when +the limit is near, it alerts a set of "proxy monitors" in each registered AppDomain so they can take action to avoid a process +recycle. The collection of "proxy monitors" being enumerated was not thread-safe, though, so new AppDomains spinning up or old +AppDomains shutting down while this monitor enumerated the collection could result in this unhandled `InvalidOperationException` +in the default AppDomain, causing a crash. + +## Workaround +There is no reliable workaround. If the environment does not tend to consume private bytes near the recycling limit, or if +web app domain lifetimes tend to last the entire length of the process lifetime, then chances of hitting this issue are +extremely minimal. More private bytes consumption and/or more AppDomain recycling increases the odds of hitting this exception condition. + +## Resolution +A hotfix for this issue is available for .Net 4.8. https://support.microsoft.com/en-us/help/4502560/cumulative-update-for-net-framework-june-18-2019 diff --git a/releases/net48/KnownIssues/wpf-pma-window-drag.md b/releases/net48/KnownIssues/wpf-pma-window-drag.md new file mode 100644 index 000000000..35d6fb0fa --- /dev/null +++ b/releases/net48/KnownIssues/wpf-pma-window-drag.md @@ -0,0 +1,10 @@ +# Per-Monitor DPI-aware WPF applications position mouse cursor incorrectly when dragging between monitors + +## Symptoms +A user running a WPF application that enables the Per-Monitor DPI awareness feature introduced in .NET Framework 4.7.2 may notice that the mouse cursor is in a different location relative to the window after dragging the window from one monitor to another. + +## Cause +This issue is caused by a calculation error when resizing and placing the window after switching DPI. + +## Resolution +This issue is being tracked at https://github.com/dotnet/wpf/issues/967. diff --git a/releases/net48/README.md b/releases/net48/README.md new file mode 100644 index 000000000..64895f95c --- /dev/null +++ b/releases/net48/README.md @@ -0,0 +1,27 @@ +# .NET Framework 4.8 Release Notes + +You can learn about the changes made in the .NET Framework 4.8. + +- [Download](http://go.microsoft.com/fwlink/?LinkId=2085155) +- [.NET Framework 4.8 RTM Announcement blog post](https://go.microsoft.com/fwlink/?linkid=2054306) +- [.NET Framework 4.8 Windows Update Release Blog Post](https://go.microsoft.com/fwlink/?linkid=2100817) +- [Release notes](dotnet48-changes.md) +- [Application compatibility](https://go.microsoft.com/fwlink/?linkid=2053971) +- [API changes](dotnet48-api-changes.md) +- [Known issues](dotnet48-known-issues.md) + +## Release Notes by Product Area + +- [ASP.NET](dotnet48-changes.md#aspnet) +- [BCL](dotnet48-changes.md#bcl) +- [ClickOnce](dotnet48-changes.md#clickonce) +- [CLR](dotnet48-changes.md#clr) +- [Networking](dotnet48-changes.md#networking) +- [SQL](dotnet48-changes.md#sql) +- [WCF](dotnet48-changes.md#wcf) +- [Windows Forms](dotnet48-changes.md#windows-forms) +- [WPF](dotnet48-changes.md#wpf) +- [Workflow](dotnet48-changes.md#workflow) + +NOTE: .NET Framework 4.8 will be available on Windows Update, Windows Server Update Services (WSUS), and Microsoft Update Catalog soon. However, if you have a business requirement to temporarily block the automatic installation through Windows Update in your managed environment, you can refer to [KB4516563](https://support.microsoft.com/en-us/help/4516563) for guidance. + diff --git a/releases/net48/dotnet48-api-changes.md b/releases/net48/dotnet48-api-changes.md new file mode 100644 index 000000000..10e1b3d81 --- /dev/null +++ b/releases/net48/dotnet48-api-changes.md @@ -0,0 +1,331 @@ +```diff +namespace System.Security.Cryptography.X509Certificates { + public class X509Certificate { + public virtual byte[] GetCertHash(HashAlgorithmName hashAlgorithm) + public virtual string GetCertHashString(HashAlgorithmName hashAlgorithm) + } +} +namespace System.Security.Cryptography { + protected class SHA1Managed.Dispose(bool) + protected class SHA256Managed.Dispose(bool) + protected class SHA384Managed.Dispose(bool) + protected class SHA512Managed.Dispose(bool) +} +namespace System { + public static class GC{ + public static long GetAllocatedBytesForCurrentThread() + } +} +namespace System.Reflection{ + public enum MethodImplAttributes{SecurityMitigations} +} +namespace System.Runtime.CompilerServices { + public enum MethodImplOptions{ SecurityMitigations } +} +namespace System.Threading { + public static class Interlocked{ + public static void SpeculationBarrier() + } +} +namespace System.Net.Configuration { + public sealed class WebProxyScriptElement : ConfigurationElement { + [ConfigurationProperty("autoConfigUrlRetryInterval", DefaultValue = 600)] + public static int AutoConfigUrlRetryInterval { get; set; } + } +} +namespace System.Net { + [Flags] + public enum SecurityProtocolType { + Tls13 = 12288 + } +} +namespace System.Security.Authentication { + public enum SslProtocols { + Tls13 = 12288, + } +} +namespace System.Net.Configuration { + public sealed class SettingsSection : ConfigurationSection { + [ConfigurationProperty("windowsAuthentication")] + public WindowsAuthenticationElement WindowsAuthentication { get; } + } + public sealed class WindowsAuthenticationElement : ConfigurationElement { + [ConfigurationProperty("defaultCredentialsHandleCacheSize", DefaultValue = 0)] + public int DefaultCredentialsHandleCacheSize { get; set; } + } +} +namespace System.ServiceModel.Configuration { + public sealed class ServiceHealthElement : BehaviorExtensionElement { + public ServiceHealthElement(); + public override Type BehaviorType { get; } + public bool HealthDetailsEnabled { get; set; } + public string HttpGetBinding { get; set; } + public string HttpGetBindingConfiguration { get; set; } + public bool HttpGetEnabled { get; set; } + public Uri HttpGetUrl { get; set; } + public string HttpsGetBinding { get; set; } + public string HttpsGetBindingConfiguration { get; set; } + public bool HttpsGetEnabled { get; set; } + public Uri HttpsGetUrl { get; set; } + protected override ConfigurationPropertyCollection Properties { get; } + public override void CopyFrom(ServiceModelExtensionElement from); + protected internal override object CreateBehavior(); + } +} +namespace System.ServiceModel.Description { + public class ServiceHealthBehavior : ServiceHealthBehaviorBase { + public ServiceHealthBehavior(); + protected virtual bool HasXmlSupport { get; } + protected static void AddHttpProperty(Message message, HttpStatusCode status, bool isXml); + protected static bool EnsureHttpStatusCode(int code); + protected virtual HttpStatusCode GetHttpResponseCode(ServiceHostBase serviceHost, string[] queries); + protected virtual ServiceHealthSectionCollection GetServiceHealthSections(ServiceHostBase serviceHost); + protected virtual XmlDocument GetXmlDocument(ServiceHostBase serviceHost); + public override void HandleHealthRequest(ServiceHostBase serviceHost, Message httpGetRequest, string[] queries, out Message replyMessage); + protected static bool TryParseBooleanQueryParameter(string parameterName, string parameter, bool defaultValue, out bool result); + protected static bool TryParseHttpStatusCodeQueryParameter(string parameterName, string parameter, HttpStatusCode defaultErrorCode, out HttpStatusCode result); + } + public abstract class ServiceHealthBehaviorBase : IServiceBehavior { + protected ServiceHealthBehaviorBase(); + public bool HealthDetailsEnabled { get; set; } + public Binding HttpGetBinding { get; set; } + public bool HttpGetEnabled { get; set; } + public Uri HttpGetUrl { get; set; } + public Binding HttpsGetBinding { get; set; } + public bool HttpsGetEnabled { get; set; } + public Uri HttpsGetUrl { get; set; } + protected DateTimeOffset ServiceStartTime { get; } + public abstract void HandleHealthRequest(ServiceHostBase serviceHost, Message httpGetRequest, string[] queries, out Message replyMessage); + void System.ServiceModel.Description.IServiceBehavior.AddBindingParameters(ServiceDescription description, ServiceHostBase serviceHostBase, Collection endpoints, BindingParameterCollection parameters); + void System.ServiceModel.Description.IServiceBehavior.ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase serviceHostBase); + void System.ServiceModel.Description.IServiceBehavior.Validate(ServiceDescription description, ServiceHostBase serviceHostBase); + } + public sealed class ServiceHealthElement { + public ServiceHealthElement(string key, string[] values); + public string Key { get; set; } + public string[] Values { get; set; } + } + public sealed class ServiceHealthElementCollection : KeyedCollection { + public ServiceHealthElementCollection(); + public void Add(string key, string value); + public void Add(string key, string[] values); + protected override string GetKeyForItem(ServiceHealthElement element); + } + public class ServiceHealthModel { + public const string Namespace = "http://schemas.microsoft.com/net/2018/08/health"; + public ServiceHealthModel(); + public ServiceHealthModel(ServiceHostBase serviceHost); + public ServiceHealthModel(ServiceHostBase serviceHost, DateTimeOffset serviceStartTime); + public ServiceHealthModel.ChannelDispatcherModel[] ChannelDispatchers { get; } + public DateTimeOffset Date { get; } + public ServiceHealthModel.ProcessInformationModel ProcessInformation { get; } + public ServiceHealthModel.ProcessThreadsModel ProcessThreads { get; } + public ServiceHealthModel.ServiceEndpointModel[] ServiceEndpoints { get; } + public ServiceHealthModel.ServicePropertiesModel ServiceProperties { get; } + public class ChannelDispatcherModel { + public ChannelDispatcherModel(); + public ChannelDispatcherModel(ChannelDispatcherBase channelDispatcher); + public string BindingName { get; } + public ServiceHealthModel.CommunicationTimeoutsModel CommunicationTimeouts { get; } + public string ContractName { get; } + public bool IsSystemEndpoint { get; } + public Nullable ListenerState { get; } + public string ListenerUri { get; } + public string MessageEncoder { get; } + public string[] MessageInspectors { get; } + public ServiceHealthModel.ServiceThrottleModel ServiceThrottle { get; } + public Nullable State { get; } + } + public class CommunicationTimeoutsModel { + public CommunicationTimeoutsModel(); + public CommunicationTimeoutsModel(IDefaultCommunicationTimeouts timeouts); + public TimeSpan CloseTimeout { get; } + public bool HasTimeouts { get; } + public TimeSpan OpenTimeout { get; } + public TimeSpan ReceiveTimeout { get; } + public TimeSpan SendTimeout { get; } + } + public class ProcessInformationModel { + public ProcessInformationModel(); + public ProcessInformationModel(ServiceHostBase serviceHost); + public int Bitness { get; } + public string GCMode { get; } + public string ProcessName { get; } + public DateTimeOffset ProcessStartDate { get; } + public DateTimeOffset ServiceStartDate { get; } + public ServiceHealthModel.ProcessThreadsModel Threads { get; } + public TimeSpan Uptime { get; } + public void SetServiceStartDate(DateTimeOffset serviceStartTime); + } + public class ProcessThreadsModel { + public ProcessThreadsModel(); + public int AvailableCompletionPortThreads { get; } + public int AvailableWorkerThreads { get; } + public int MaxCompletionPortThreads { get; } + public int MaxWorkerThreads { get; } + public int MinCompletionPortThreads { get; } + public int MinWorkerThreads { get; } + public int NativeThreadCount { get; } + } + public class ServiceEndpointModel { + public ServiceEndpointModel(); + public ServiceEndpointModel(ServiceEndpoint endpoint); + public string Address { get; } + public string[] BehaviorNames { get; } + public string BindingName { get; } + public string ContractName { get; } + } + public class ServicePropertiesModel { + public ServicePropertiesModel(); + public ServicePropertiesModel(ServiceHostBase serviceHost); + public string[] BaseAddresses { get; } + public Nullable ConcurrencyMode { get; } + public Nullable InstanceContextMode { get; } + public string Name { get; } + public string[] ServiceBehaviorNames { get; } + public ServiceHealthModel.ServiceThrottleModel ServiceThrottle { get; } + public string ServiceTypeName { get; } + public CommunicationState State { get; } + } + public class ServiceThrottleModel { + public ServiceThrottleModel(); + public ServiceThrottleModel(ServiceThrottle serviceThrottle); + public int CallsCapacity { get; } + public int CallsCount { get; } + public bool HasThrottle { get; } + public int InstanceContextsCapacity { get; } + public int InstanceContextsCount { get; } + public int SessionsCapacity { get; } + public int SessionsCount { get; } + } + } + public sealed class ServiceHealthSection : Collection { + public ServiceHealthSection(); + public ServiceHealthSection(string title); + public string BackgroundColor { get; set; } + public string ForegroundColor { get; set; } + public string Title { get; set; } + public ServiceHealthElementCollection CreateElementsCollection(); + } + public sealed class ServiceHealthSectionCollection : Collection { + public ServiceHealthSectionCollection(); + public ServiceHealthSection CreateSection(string title); + public ServiceHealthSection CreateSection(string title, string backgroundColor); + public ServiceHealthSection CreateSection(string title, string backgroundColor, string foregroundColor); + } +} +namespace System.Windows.Forms { +    public class AccessibleObject : StandardOleMarshalObject, IAccessible, IReflect, UnsafeNativeMethods.IEnumVariant, UnsafeNativeMethods.IExpandCollapseProvider, UnsafeNativeMethods.IGridItemProvider, UnsafeNativeMethods.IGridProvider, UnsafeNativeMethods.IOleWindow, UnsafeNativeMethods.IRawElementProviderSimple, UnsafeNativeMethods.ITableItemProvider, UnsafeNativeMethods.ITableProvider, UnsafeNativeMethods.IToggleProvider, UnsafeNativeMethods.IValueProvider { +        public bool RaiseAutomationNotification(AutomationNotificationKind notificationKind, AutomationNotificationProcessing notificationProcessing, string notificationText); +    } +    public class AccessibleObject { +        public virtual bool RaiseLiveRegionChanged(); +    } +      public class Label : Control, IAutomationLiveRegion { +        public AutomationLiveSetting LiveSetting { get; set; } +    } + public class ToolStripComboBox : ToolStripControlHost { + protected override AccessibleObject CreateAccessibilityInstance(); + } + public class ToolStripProgressBar : ToolStripControlHost { + protected override AccessibleObject CreateAccessibilityInstance(); + } + protected override AccessibleObject CreateAccessibilityInstance() { + protected override AccessibleObject CreateAccessibilityInstance(); + } + public class ToolStripStatusLabel : ToolStripLabel { } + public class ToolStripStatusLabel : ToolStripLabel, IAutomationLiveRegion { + protected override AccessibleObject CreateAccessibilityInstance(); + public AutomationLiveSetting LiveSetting { get; set; } + protected override void OnTextChanged(EventArgs e) { + } + public class Button : ButtonBase, IButtonControl { + protected override void RescaleConstantsForDpi(int deviceDpiOld, int deviceDpiNew); + } + public class CheckBox : ButtonBase { + protected override void RescaleConstantsForDpi(int deviceDpiOld, int deviceDpiNew); + } + public class RadioButton : ButtonBase { + protected override void RescaleConstantsForDpi(int deviceDpiOld, int deviceDpiNew); + } + public partial class Control { + public Size LogicalToDeviceUnits(Size value) + } + + public class PropertyGrid : ContainerControl, IComPropertyBrowser, UnsafeNativeMethods.IPropertyNotifySink { + protected override void RescaleConstantsForDpi(int deviceDpiOld, int deviceDpiNew); + } + public abstract class ScrollBar : Control { + protected override void RescaleConstantsForDpi(int deviceDpiOld, int deviceDpiNew) { + public bool ScaleScrollBarForDpiChange { get; set; } + } + public class SystemInformation { + public static int VerticalScrollBarArrowHeightForDpi(int dpi); + } +} +namespace System.Windows.Forms.Automation { +    public enum AutomationNotificationKind { +        ActionAborted = 3, +        ActionCompleted = 2, +        ItemAdded = 0, +        ItemRemoved = 1, +        Other = 4, +    } +    public enum AutomationNotificationProcessing { +        All = 2, +        CurrentThenMostRecent = 4, +        ImportantAll = 0, +        ImportantMostRecent = 1, +        MostRecent = 3, +    } + public enum AutomationLiveSetting { +        Assertive = 2, +        Off = 0, +        Polite = 1, +    } +    public interface IAutomationLiveRegion { +        AutomationLiveSetting LiveSetting { get; set; } +    } +} +namespace System.Windows.Automation.Peers { + public abstract class AutomationPeer: DispatcherObject { + virtual protected int GetSizeOfSetCore() + virtual protected int GetPositionInSetCore() + public int GetSizeOfSet() + public int GetPositionInSet() + } + public abstract class AutomationPeer: DispatcherObject { + virtual protected List GetControlledPeersCore() + public List GetControlledPeers() + private IRawElementProviderSimple[] GetControllerForProviderArray() + } + public abstract class AutomationPeer: DispatcherObject { + public static readonly DependencyProperty SelectionTextBrushProperty + public Brush SelectionTextBrush + private static Brush GetDefaultSelectionTextBrush() + } + public class GroupItemAutomationPeer : FrameworkElementAutomationPeer { + protected override List GetChildrenCore() + override protected void SetFocusCore() + protected override bool IsKeyboardFocusableCore() + override protected bool HasKeyboardFocusCore() + } +} +namespace System.Windows.Automation { + public static class AutomationProperties { + public static void SetPositionInSet(DependencyObject element, int value) + public static int GetPositionInSet(DependencyObject element) + public static void SetSizeOfSet(DependencyObject element, int value) + public static int GetSizeOfSet(DependencyObject element) + } + public sealed class AutomationElement { + public static readonly AutomationProperty SizeOfSetProperty + public static readonly AutomationProperty PositionInSetProperty + } + public sealed class AutomationElementIdentifiers { + public static readonly AutomationProperty SizeOfSetProperty + public static readonly AutomationProperty PositionInSetProperty + } +} + +``` diff --git a/releases/net48/dotnet48-changes.md b/releases/net48/dotnet48-changes.md new file mode 100644 index 000000000..eb316080c --- /dev/null +++ b/releases/net48/dotnet48-changes.md @@ -0,0 +1,410 @@ +# .NET Framework 4.8 Release Notes + +.NET Framework release notes describe product improvements grouped by product area. Each change includes a Microsoft-internal VSTS bug ID, the primary binary that was updated and whether the change was a bug or a feature. + +## ASP.NET + +* Fix handling of InputAttributes and LabelAttributes for ASP.NET CheckBox control. [643614, System.Web.dll, Bug, Build:3646] +* Fixed a perf issue in HttpApplication instances pool in HttpApplicationFactory class. [639421, system.web.dll, Bug, Build:3673] +* Fixed NullReferenceException thrown from the page/control with only parameterized constructors with default values when targeting 4.7.2 [635479, System.Web.dll, Bug, Build:3673] +* Hardened ASP.NET application services against malicious JSON attacks [684132, System.Web.Extensions.dll, System.Web.dll, Bug, Build:3673] +* Fixed an issue with ValidationContext.MemberName when using custom DataAnnotation.ValidationAttribute. [563497, System.web.dll, Bug, Build:3694] +* Fixed ArgumentOutOfRangeException in MemoryCache when using change monitors with non-existent files east of GMT. [684136, System.Web.dll, Bug, Build:3694] +* Fix handling of multi-value HTTP headers that may affect multipart data processing. [684397, System.Web.dll, Bug, Build:3694] +* Fixed handling of multi-value HTTP headers that may affect multipart data processing. [726155, System.Web.dll, Bug, Build:3734] +* For client applications (winforms, WPF, or console apps, etc) the ASP.NET Client Application Services API’s have been hardened against potentially malicious JSON payloads. [727703, System.Web.dll, Bug, Build:3734] +* Fixed an issue introduced in ASP.NET 4.7, where the unexpected removal of a particular type of cache item can result in an orphaned *.delete file that prevents web applications from running. [750653, System.Web.dll, Bug, Build:3734] +* Fixed System.Web.Caching initialization bug when using ASP.NET cache on machines without IIS. [889110, System.Web.dll, Bug, Build 3928] + +## BCL + +* Fixed deserialization of Collections which uses culture aware StringComparer. [566534, mscorlib.dll, Bug, Build:3621] +* Fixed System.Runtime.CompilerServices.RuntimeFeature.IsSupported to correctly account for application compatibility quirk settings for the Portable PDB feature introduced in .NET Framework 4.7.1. [571206, mscorlib.dll, Bug, Build:3621] +* Fixed the exception by parsing Japanese dates that have the year number exceeding the number of years in that date era. The behavior change will be noticed only if someone tries to parse a date containing some era and year while the year exceeds the last year in that era. [590659, mscorlib.dll, Bug, Build:3621] +* Fixed the serialization compatibility issue for CultureAwareComparer class. [621387, mscorlib.dll , Bug, Build:3632] +* Upgraded the System.IO.Compression zlib (inside clrcompression.dll) to the latest zlib version 1.2.11 [532490, clrcompression.dll, Bug, Build:3646] +* Fixed by reducing memory allocations in hashing with the CAPI classes (SHA256CryptoServiceProvider, et al) [548940, System.Core.dll, Bug, Build:3646] +* Fixed by reducing memory allocations in hashing with the CNG classes (SHA256Cng, et al) [548941, System.Core.dll, Bug, Build:3646] +* Fixed the issue of System.DateTime returning the wrong time after Windows processes a leap second, by following changes: +DateTime and DateTimeOffset will work with the leaps seconds reported by Windows 10, Version 1809 systems. DateTime.Now and DateTime.UtcNow will always be synchronized with the system time. +DateTime and DateTimeOffset will never report the leap second as value 60, instead, it’ll always report it as 59. +DateTime and DateTimeOffset operations will continue to work as it used to work, i.e. internally always handle the minutes as 60 seconds which make it compatible with the down levels platforms. [641206, mscorlib.dll, clr.dll, Bug, Build:3646] +* Fixed WCF de-serialization failure issue of CultureAwareComparer object. Fixed the issue where Applications using WCF to communicate with web services or applications using data contract serialization directly, were experiencing failures to deserialize the CultureAwareComparer object. [645084, mscorlib.dll, Bug, Build:3646] +* Reduced the impact of the "FIPS mode" bit being set in the OS [653796, mscorlib.dll;System.Core.dll, Bug, Build:3646] +* Changed default content encryption algorithm of EnvelopedCms to AES. [656518, System.Security.dll, Bug, Build:3646] +* Fixed GetECDsaPublicKey to work with brainpool curves. [586452, System.Core.dll, Bug, Build:3673] +* Reduced the number of object finalizations that occur as a result of using X509Certificate2 and related types. [654137, mscorlib.dll, System.dll, System.Security.dll, Bug, Build:3673] +* Fixed formatting of Japanese date with year 1 (as first year of any era), the date will be formatted using 元 character and not year number “1”. Example of the new formatted date behavior: 平成元年11月21日compared to old formatted date behavior 平成1年11月21日 [670097, mscorlib.dll, Bug, Build:3673] +* Fixed default settings used by RsaProtectedConfigurationProvider (use AES instead of 3DES, RSA is now using 2048bit key, OAEP is on by default), fixed encryption with OAEP so that it writes correct metadata. [549418, System.Configuration.dll, Bug, Build:3694] +* By default, elevated processes will not read HKCU for managed COM activation information. [691317, clr.dll, Bug, Build:3694] +* Add API to obtain certificate thumbprints with a caller-specified digest algorithm. [700365, mscorlib.dll, Feature, Build:3694] +* Fixed an IndexOutOfRangeException thrown when asynchronously reading a process output with less than a character's worth of bytes is read at the beginning of a line. [724219, System.dll, Bug, Build:3707] +* Mitigate compatibility breaks seen in some System.Data.SqlClient usage scenarios. [727701, System.Configuration.dll, Bug, Build:3707] +* Fixed a serialization exception that occurred when a huge amount of objects were serialized with BinaryFormatter. [761576, mscorlib.dll, Bug, Build:3734] +* Added support for formatting the Japanese first year of era using Gannen 元 when the date pattern does not have single quotes around 年 (e.g., y年). [777279, mscorlib.dll, Bug, Build:3745] +* Changed the name of "Former Yugoslav Republic of Macedonia" to "North Macedonia" [802482, mscorlib.dll, Bug, Build:3761] + + +## ClickOnce + +* Fixed Clickonce UI dialogs on high Dpi machines with scale set to more than 100% for both new and existing applications which scale upto 300%. In the scenario where user wants to see legacy images, there is an opt out switch "Switch.System.Windows.Forms.UseLegacyImages" that can be set to "true" in dfsvc.exe.config file. [389534, Microsoft.Build.Tasks.v4.0.dll, Bug, Build:3621] +* Fixed Mage so it can properly update the identity of dependent assemblies in ClickOnce application manifests. [534286, Microsoft.Build.Tasks.v4.0.dll, Bug, Build:3621] +* Fixed ClickOnce dialogs (Splash screen, Install progress dialog, Maintenance dialog and Update dialog) have accessibility issues as mentioned in this bug. Fix is for realigning control indices and setting accessible names where it was missing. [541886, Microsoft.Build.Tasks.v4.0.dll, Bug, Build:3621] +* Fixed progress bar alignment from Right to Left in Splash Screen and Download progress dialog for ARA & HEB languages for ClickOnce UI. Fixed RTL layout in the ClickOnce dialogs. Individual controls are to be set in RTL layout as this property is not propagated. Set this property explicitly on progress bar control. [552893, Microsoft.Build.Tasks.v4.0.dll, Bug, Build:3621] + + +## CLR + +* Fixed LoadFrom(String, Byte[], AssemblyHashAlgorithm) works with SHA2 algorithms. [229901, mscorlib.dll, Bug, Build:3621] +* Reduced AsyncLocal memory overhead on value change. [470761, mscorlib.dll, Bug, Build:3621] +* Improved spin-waits in several synchronization primitives to perform better on Intel Skylake and more recent microarchitectures. [495945, mscorlib.dll, Bug, Build:3621] +* Fixed issues where incorrect values are sent to EventListeners. This includes incorrect activity ids on start and stop events and improper EventLevel values. [581072, mscorlib.dll, Bug, Build:3621] +* Fixed a potential crash with concurrent calls to a new dynamic method. [581154, mscorlib.dll, Bug, Build:3621] +* Fixed a possible deadlock when calling Dispose() on an EventSource. [597221, System.Core.dll, Bug, Build:3621] +* The ‘shadowCopyVerifyByTimestamp’ setting is now configurable for individual appdomains, as opposed to being a process wide setting. This helps in situations where you may not be the host process, but want to configure a new appdomain that verifys timestamps when shadow copying. [565570, clr.dll, Bug, Build:3632] +* Addressed the issue where the JIT compiler optimized away a call to the CompareExchange intrinsic operation under specific conditions [638227, clrjit.dll, Bug, Build:3646] +* CLR COM no longer returns E_INVALIDARG when marshalling a byref SafeArray from an Event Handler. [239541, WindowsBase.dll, Bug, Build:3673] +* Fixed a potential hang when a blocking GC is induced in low memory situations [374828, clr.dll, Bug, Build:3673] +* If you are using Server GC on a Skylake or later machine, you might notice that clr!SVR::t_join::join is taking a lot more CPU cycles. This is because clr!SVR::t_join::join uses the PAUSE instruction which takes a lot longer on Skylake+. This fix scales down the number of times it’s called when running on Skylake+ machine. [683269, clr.dll, Bug, Build:3673] +* Fixed an issue with the GC where frequent LOH under high memory pressure may result in premature OOM errors. [657730, clr.dll, Bug, Build:3694] +* Process corrupting exceptions in exception filter (like access violation) now result in aborting the current process. [110375, clr.dll, Bug, Build:3694] +* .NET now integrates with antimalware providers to scan assemblies loaded from byte arrays. [576558, clr.dll, Feature, Build:3694] +* Fixed an issue with missing Win32 resources in ReadyToRun images. [624174, crossgen.exe, Bug, Build:3694] +* Fixed an issue with ngen createpdb where passing in a long output folder could cause a crash. [627712, ngen.exe, Bug, Build:3694] +* Fixed a crossgen failure when compiling assemblies with no Win32 resources into ReadyToRun images. [722265, coreclr.dll, Bug, Build:3694] +* Fixed ability to handle process corrupted state exceptions stemming from Marshal.PtrToStructure on x86. [381677, clr.dll, Bug, Build:3707] +* Fixed intermittent access violation errors when Server GC interacts with type-forwarded value types implemented in mscorlib or other domain-neutral assemblies during garbage collection. [425626, clr.dll, Bug, Build:3707] +* Enabled a very obscure and uncommon usage pattern where FX Closure Walks are too expensive in the default domain. Introduced DeferFxClosureWalk (opt-in) switch that when set does the following things: 1) Disable DisableFxClosureWalk switch 2) When in LoaderOptimization.MultiHost, all assemblies are assumed sharable in the default domain and the closure walk is deferred as long as possible. This solution will provide good default domain performance and correctness. [485894, clr.dll, Bug, Build:3707] +* Fixed crashes that can occur when NGen'ed facade assemblies are loaded as multidomain-sharable. [602785, clr.dll, Bug, Build:3707] +* Improved Monitor’s lock acquisition performance and scalability under a perpetual lock convoy. [602844, clr.dll, Bug, Build:3707] +* Fixed an issue that previously caused Ngen to run out of memory every time it executed due to registry corruption. [702519, mscorsvc.dll / mscorsvw.exe, Bug, Build:3707] +* Triggering a System.Threading.ThreadAbortException when System.Diagnostics.Debugger.s_triggerThreadAbortExceptionForDebugger is set to true. [732816, mscorlib.dll, Bug, Build:3707] +* Fix a crash on COM interop and properly return the hresult for the OOM. [733492, clr.dll, Bug, Build:3707] +* Prevents applications from COM activating managed types whose GUIDs mismatch the declared CLSID in the registry" [752205, clr.dll, Bug, Build:3734] +* Fixed deadlocks that could occur when loading exception stack traces in out-of-memory conditions. [748860, diasymreader.dll, Bug, Build:3734] +* Improved scalability of System.Threading.Timer. Previously System.Threading.Timer had a single global queue that was protected by a single process-wide lock. This can become a scalability problem if Timers are used frequently on multi-CPU machine. This change splits into N per-processor Queues as well as other improvements that improve the performance in a high-scale environment. For compatibility reasons this new code is not activated by default at the present time. It needs to be activated by using .NET Config variable ScalableTimer. [735923, clr.dll, mscorlib.dll, Bug, Build:3734] +```xml + + ... + + + + +``` +* Added an opt-in config option to disable spin-waiting for a critical section when contended. The change can be opted into in an .exe.config file as follows: [754173, clr.dll, Bug, Build:3734] +```xml + + ... + + + + +``` +* Fixed the output from the "!u -gcinfo" command in the SOS Debugging Extension [740360, sos.dll, Bug, Build:3734] +* Customers who are profiling their .NET Framework application will no longer experience leaks on their ICorProfilerCallback9 COM object as ICorProfilerCallback9 COM object is never freed in the destructor of EEToProfInterfaceImpl instance. [742282, clr.dll, Bug, Build:3734] +* Updated ICorProfilerInfo4::GetILToNativeMapping2 to respect the rejitID field and return the appropriate mapping. [748879, clr.dll, Bug, Build:3734] +* Fixed storing of instances to the mark stack so that the subsequent code that follows can operate by popping the stack. [750816, clr.dll, clrgc.dll, Bug, Build:3734] +* Fixed an issue in the JIT with the compilation of methods that use explicit tailcalls. This feature is never used by C# programs but can impact some F# programs. If you are developing an F# application, you may see incorrect results or program crashes. A workaround is to disable tailcalls or use a debug build of your F# program. [754566, clrjit.dll, Bug, Build:3734] +* Fixed an issue that prevented call stacks from being displayed in the managed debugger during debugging of certain issues. [755544, clr.dll, Bug, Build:3761] +* Fixed an issue where Appdomain Resource Monitoring would not accurately report allocated bytes if it was enabled after process startup [824471, clr.dll, Bug, Build:3761] + + +## Networking + +* Fixed a memory leak issue in HttpWebRequest when communicating with a HTTPS server through a proxy. [484621, System.dll, Bug, Build:3621] +* Fixed HTTP Status line parsing to be more tolerant of missing status description text in HTTP responses. [534936, System.dll, Bug, Build:3621] +* Fixed a NetworkInformation.NetworkChange deadlock scenario when there is a lock around NetworkChanged listener and user’s callback. [554780, System.Net.NetworkInformation.dll, System.dll, netstandard.dll, Bug, Build:3621] +* Fixed a deadlock scenario when ServicePoint.ConnectionLimit is updated and requests are sent at the same time. [528650, System.dll, Bug, Build:3673] +* Fix a race condition that would sometimes cause all of the connections to a server to stop sending HTTP requests. [499777, System.dll, Bug, Build:3694] +* Added the ability via the config file to specify opt-in performance caching of default credentials for Windows authentication for HTTP and SMTP APIs. [514209, System.dll, Bug, Build:3694] +* Added retry timer for PAC file discovery after failure. [567511, System.dll, Bug, Build:3694] +* Fixed handling of 1xx interim responses. [711440, System.dll, Bug, Build:3734] +* Fixed domain spoofing vulnerability in .NET Framework and .NET Core which causes the meaning of a URI to change when International Domain Name encoding is applied by disallowing certain Unicode characters during the IDN encoding process - CVE-2019-0657 [694688, System.Private.Uri, Bug, Build:3745] + + +## SQL + +* Fixed the issue that SqlDataReader.ReadAsync() runs synchronously. Now the method runs asynchronously as expected. [594433, System.Data.dll, Bug, Build:3621] +* Fixed the issue while using SqlConnection.ConnectionString to set a null or empty connection string, an NRE exception will be thrown by the usage of the API in .Net Framework 4.7.2. [613944, System.Data.dll, Bug, Build:3621] +* Fixed the following issue relevant to SQL: while connecting to Azure SQL DB using .NET 4.7.2, using MultipleActiveResultSets=true in the connection string with System.Data.SqlClient.SqlConnection, async query operations sometimes lead to a bad TDS protocol request stream to be sent from the client, causing the Async Query APIs to fail connection string. [624283, System.Data.dll, Bug, Build:3632] +* Fixed a bug where SqlClient login may use an infinite timeout due to truncating a small millisecond timeout to zero when converting to seconds. [647908, System.Data.dll, Bug, Build:3646] +* This change provides an AppContext switch for making the default value of TransparentNetworkIPResolution false in SqlClient connection strings. [710778, System.Data.dll, Bug, Build:3694] + + +## WCF + +* Fixed an accessibility problem in WCF Trace Viewer that caused ComboBox controls to be themed incorrectly in High Contrast themes. [424922, SvcTraceViewer.exe, Bug, Build:3621] +* Fixed the race-condition that exists in AsyncResult that closes a WaitHandle before Set() is called. When this happens, the process crashes with an ObjectDisposedException. [552736, System.ServiceModel.Internals.dll, Bug, Build:3621] +* Fixed race-condition when aborting connections which caused ObjectDisposedException to be thrown in CleanupChannelCollections. [586151, mscorlib.dll, Bug, Build:3621] +* Fixed a high lock contention issue when a large number of threads calling WCF serialization logic [570201, System.Runtime.Serialization.dll, Bug, Build:3646] +* ServiceHealthBehavior is a new service behavior (IServiceBehavior) for WCF services that exposes a “?health” endpoint.  This new behavior allows one to monitor the internal state of their WCF service and obtain specific HTTP response codes during those times that listeners become faulted, throttle capacities are reached, etc.  One can extend this behavior to further scope the health of their WCF services to match their own custom business rules and needs. [620852, System.Servicemodel.dll, Feature, Build:3694] +* Fixed a System.AccessViolationException due to accessing disposed X509Certificate2 instance in a rare race condition. The fix is to defer the service certificate cleanup to GC. The impacted scenario is WCF NetTcp bindings using reliable sessions with certificate authentication. Customer can opt-in to the fix by adding the follow AppSetting to the config file. Without this AppSetting set to true, existing services won’t be affected by this code change. : + + + [695709, System.Servicemodel.dll, Bug, Build:3694] +* Fixed a race condition with IIS hosted net.tcp services when the portsharing service is restarted which resulted in the service being unavailable. [695877, System.ServiceModel.WasHosting.dll, Bug, Build:3694] +* Fixed broken WCF document links in the tracing log that were broken due to MSDN doc location change. [712450, System.ServiceModel.dll, Bug, Build:3707] +* Fixed a security vulnerability in SvcTraceViewer.exe associated with .stvproj file. *Microsoft would like to thank 9sg Security Team for their responsible disclosure of a remote information vulnerability in the .NET Framework. [728568, System.ServiceModel.dll, Bug, Build:3707] +* Made some format changes and added lang attribute to WCF service Health page (like http://localhost:83/Service1?health) and WCF service metadata page (like http://localhost:83/Service1) to improve accessibility. [777308, System.ServiceModel.dll, Bug, Build:3745] + + +## Windows Forms + +* Maximize/Minimize button of new child Form are not scaled well on HDPI devices because of image property set to not to scale. On 100% dpi machines scaling it not required but on high dpi devices, when scaling set to more than 100%, the images set for Maximize/Minimize boxes need to be scaled. [515092, System.Windows.Forms.dll, Bug, Build:3621] +* Checkbox height is changed from square to rectangle when scaled. Padding and margins were scaled, thus adding to already scaled height of the checkbox as we were using item height to draw checkbox instead of checkbox height. Earlier these margins/paddings were constants and ignorable pixel sizes, and were not visible. [528418, System.Windows.Forms.dll, Bug, Build:3621] +* The new UIA behavior for CheckedListBox control has been introduced: the first checkbox item in the CheckedListBox control is now announced by Narrator when focus moves to the control without any selected item. This change is effective in applications that were recompiled to target .NET Framework 4.8. [533226, System.Windows.Forms.dll, Bug, Build:3621] +* The new behavior for disabled link labels has been introduced: link labels' enable/disable state is now provided correctly - disabled links have IsEnabled = false Accessibility Property and read by Narrator as 'Some Link, disabled'. This change is effective in applications that were recompiled to target .NET Framework 4.8. [537224, System.Windows.Forms.dll, Bug, Build:3621] +* The new behavior for link label with defined link area has been introduced: link area accessible name is now read by Narrator as full text of the parent link label. This change is effective in applications that were recompiled to target .NET Framework 4.8. [537934, System.Windows.Forms.dll, Bug, Build:3621] +* Improved accessibility for the DateTimePicker control. In order for the application to benefit from these changes, the application should be recompiled to target .NET Framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. [543580, System.Windows.Forms.dll, Bug, Build:3621] +* An associated label name is now used as an accessible name for DateTimePicker control when AccessibleName property is not set. The default DateTimePicker's AccessibleRole is ComboBox now. These changes are effective in applications that were recompiled to target .Net Framework 4.8. [544791, System.Windows.Forms.dll, Bug, Build:3621] +* Fixed issues to add support for UIA live regions to WinForms. Added support for notifications about the Text property changes to the Label class (through UIA Live Regions). [545374, System.Windows.Forms.dll, Bug, Build:3621] +* Application Files' and 'Application Directory' label text is truncated on localized OSes. Developers will not be able to see the shortcut information for this control on the UI. This fix helps to resolve that issue and always show the full text of the label . [549024, System.Windows.Forms.dll, Bug, Build:3621] +* The new UIA behavior for numeric and domain up-down controls has been introduced: numeric and domain up-down controls without labels (custom UIA name) are announced by Narrator as 'spinners'. This change is effective in applications that were recompiled to target .NET Framework 4.8. [549543, System.Windows.Forms.dll, Bug, Build:3621] +* The new UIA behavior for CheckedListBox control has been introduced: an empty CheckedListBox control now has a focus rectangle drawn for a virtual first item when the control becomes focused. This change is effective in applications that were recompiled to target .NET Framework 4.8. [549558, System.Windows.Forms.dll, Bug, Build:3621] +* Improved ListView accessibility by enabling showing grey rectangle around the selected ListView item when parent ListView is out if focus. This change is effective in applications that were recompiled to target .NET Framework 4.8. [564762, System.Windows.Forms.dll, Bug, Build:3621] +* Fixed VisualStyle property in Winforms, is checking for supported values (by Winforms) and any value that goes outside of this range, Winforms throws an exception. Winforms also checks if the VisualStyle property set is supported by Winforms when it is using this property and does no-op if it is not supported. Underlying native method we use to set visual styles does not care what the value for visualstyle is being passed to it. Making this change will align Winforms code with windows and does not throw exception but still validate supported visual styles when using this property. Removing the validation condition while setting this property. [578093, System.Windows.Forms.dll, Bug, Build:3621] +* Fixed the DataGridView's Combobox expand/collapse state accessible for the customers who use assistive technologies. In order for the application to benefit from these changes, the application should be recompiled to target .NET Framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. For example: + ``` + + + + + + + + + ``` + In order for an application that targets .NET Framework 4.8 to opt out from this change, use the following combination of switches: +. [574309, System.Windows.Forms.dll, Bug, Build:3621] +* Fixed and improved the stability of Live Regions feature by adding LiveSetting property setter check. This feature is available starting with Windows 10, version 1709. +In order for the application to benefit from these changes, the application should be recompiled to target .NET Framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file as seen in the example for Bug 574309. [583863, System.Windows.Forms.dll, Bug, Build:3621] +* Fixed by adding support for UIA notification event to Label and GroupBox classes. This feature is available starting with Windows 10, version 1709. In order for the application to benefit from these changes, the application should be recompiled to target .NET Framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file as seen in the example for Bug 574309. [563596, Windows.UI.Xaml.Automation.Peers.dll, Windows.dll, Bug, Build:3621] +* Fixed by adding support for the live region feature to the ToolStripStatusLabel class. In order for the application to benefit from these changes, the application should be recompiled to target .NET Framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file as seen in the example for Bug 574309. [564300,Windows.UI.Xaml.Automation.Peers.dll, Windows.dll, Bug, Build:3621] +* Fixed by improving the accessibility of DataGridView and ListView to make sort direction available via UIA: added exposing sort order and sort column via ItemStatus property and column name. This change is effective in applications that were recompiled to target .NET Framework 4.8. [549288, System.Windows.Forms.dll, Bug, Build:3621] +* Fixed by making the forward and backward toolstrip navigation consistent. This feature is available starting with Windows 10, version 1709. In order for the application to benefit from these changes, the application should be recompiled to target .NET Framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file as seen in the example for Bug 574309. [544592, System.Windows.Forms.dll, Bug, Build:3621] +* Fixed the announcement of DataGridView Read-only TextBox cells by making accessible and clear: editable TextBoxes are announced as 'editable' and read-only TextBoxes are announced as 'read-only'. This change is effective in applications that were recompiled to target .NET Framework 4.8. [599936, System.Windows.Forms.dll, Bug, Build:3621] +* Added support for UIA notification event to ProgressBar class. The feature is available starting with Windows 10, version 1709. [581351, System.Windows.Forms.dll, Bug, Build:3632] +* Fixed an issue where read-only Status for DataGridView TextBox column is not announced by Narrator. This change is effective in applications that were recompiled to target .NET framework 4.8. [599936, System.Windows.Forms.dll, Bug, Build:3632] +* Fixed reliability issues in Graphics class when used in RDP sessions. [627739, System.Drawing.dll, Bug, Build:3632] +* Fixed the issue of Narrator not announcing the updated value of ComboBox in PropertyGrid. +Added support for UIA notification event to PropertyGrid. The feature is available starting with Windows 10, version 1709. Added screen reader announcement for PropertyGrid's ComboBox value changes. Added ComboBox's text field update in response of ComboBox selection changes. +In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. App.config file content is shown below (in 642548). [508369, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed improper scaling of auto-sized controls when form is moved to secondary monitor with different DPI scaling. [515971, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed improper scaling of the System-style control's font on a Font-scaled form, when Form is moved to a secondary monitor with different DPI scaling [519500, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed Checkbox and RadioButton control truncation issues control property is set to "FlatStyle". [519530, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed the improper scaling issue of auto-sized controls when form is moved to secondary monitor with different DPI scaling. All Controls (e.g. buttons) in the FlowLayout are placed into the first column with setting the AutoScroll property as True when DPI changed [525684, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed the WinForms control tooltip's issue where it does not appear when moving keyboard focus to the control +A control's tooltip is displayed now when a user uses a keyboard to focus the control. +This change is effective in applications that have Switch.System.Windows.Forms.UseLegacyToolTipDisplay value and either Switch.UseLegacyAccessibilityFeatures.3 value is set to false or application is built to target .NET version 4.8. App.config file content is shown below (in 642548). [548792, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed font scaling issue when DPI changes. Winforms applications and controls, when enabled for "per-Monitor" Dpi awareness, are not scaled according to the DPI of the monitor (or device). Winforms apps, by default, behave like "System" DPI aware. This was causing Winforms applications/controls to be displayed blurry as a result of windows scaling them, and in some cases controls are either not scaled or scaled out of proportion. +Made changes on control level to respond to DPI change event (assuming windows raise this event whenever there is a DPI change) and rescale controls according to the new DPI [597091, System.Windows.Forms.dll, Bug, Build:3646] +* Added support of Accessibility Invoke pattern to DataGridView Image cell with ability to invoke cell's default action. (in case Image cell is actually an image of a button) +In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. App.config file content is shown below (in 642548). [615721, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed PropertyGrid control scaling issue in Winforms, when parent window DPI changed. PropertyGrid control in the .NET 4.8 runtime will now properly scale according to current running monitor DPI setting. Developer has to opt-in to this fix by either targeting to .NET 4.8 framework or using the .NET 4.8 opt-in config switch. [616661, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed Checkbox and RadioButton controls when set to 'FlatStyle' not being scaled on high Dpi monitors. [638326, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed DataGridView ComboBox accessible hierarchy. Introduced the support of ComboBox UIA notifications. The feature is available starting with Windows 10, version 1709. +In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. +In order for an application that targets .NET Framework 4.8 to opt out from this change, use the following combination of switches: . [642548, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed RadioButton/ChecKBox controls truncation issue when control property is set to 'Flat/Popup style ' [645041, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed Button control to scale according to monitor Dpi on which the control is being displayed. [656271, System.Windows.Forms.dll, Bug, Build:3646] +* Improved loading/rendering time for windows forms controls. [662839, System.Windows.Forms.dll, Bug, Build:3646] +* Fixed accessible hierarchy of WinForms DataGridView control to represent its currently editing control (inner cell TextBox or ComboBox) as a child of corresponding editing cell. Added support of UIA notifications to DataGridView control. [442899, System.Windows.Forms.Dll, Feature, Build:3673] +* A ToolStrip item's tooltip is displayed now when a user uses a keyboard to focus the ToolStrip item. +This change is effective in applications that have Switch.System.Windows.Forms.UseLegacyToolTipDisplay value and either Switch.UseLegacyAccessibilityFeatures.3 value is set to false or application is built to target .NET version 4.8. [549360, System.Windows.Forms.dll, Bug, Build:3673] +App.config file content example: +```xml + + ... + + + + + + +``` +* Fixed vulnerability that might lead to remote code execution. [598032, Winres.exe, Bug, Build:3673] +* Fixed DataGridView ComboBox accessible hierarchy. Introduced the support of ComboBox UIA notifications [642548, System.Windows.Forms.Dll, Bug, Build:3673] +* Fixed localizable UI Automation Provider name for DataGridView EditingPanel. +In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. [654115, System.Windows.Forms.Dll, Bug, Build:3673] +* Fixed DataGridView not sortable column announcement and providing item status to prevent exposing 'Not sorted' info and just be silent regarding the sorting status for such columns. +In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. +In order for an application that targets 4.8 to opt out from this change, use the following combination of switches: + [661319, System.Windows.Forms.Dll, Bug, Build:3673] +* Fixed ToolStrip and MenuStrip control accessible hierarchy of inner menu/tool items. Enabled support of UI Automation notifications for ToolStrip and MenuStrip controls. In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file as seen in the example for Bug 549360. [497307, System.Windows.Forms.dll, Bug, Build:3694] +* The keyboard tooltips feature is "opt-in" now - it is no longer switched on implicitly when app targets .NET 4.8. "Switch.UseLegacyAccessibilityFeatures.3=false", which is a default value for .NET 4.8 apps, is still required by the feature. [686499, System.Windows.Forms.dll, Bug, Build:3694] +App.config file content example with enabled keyboard tooltips for apps targeting .NET 4.7.2 or older: + ``` + + ... + + + + + + App.config file content example with enabled keyboard tooltips for apps targeting .NET 4.8: + + + ... + + + + +* Added per monitor DPI awareness support to ToolStrip and ToolStrip Items. [378542, System.Windows.Forms.dll, Bug, Build:3707] +* Fixed accessibility information about ComboBox DataGridView cell, including expanded/collapsed state of this cell. [657355, System.Windows.Forms.dll, Bug, Build:3707] +* Fixed providing accessibility information about ComboBox selected item: item selection is announced and accessible info is presented even the DropDownList is not opened and user selects the items using arrow keys. In ordr=er for the application to benefit from these changes, the application should explicitly opt-in into all accessibility app context switches in the app.config file as seen in the example for Bug 549360. [703373, System.Windows.Forms.dll, Bug, Build:3707] +* Added per monitor DPI awareness support to the PropertyGrid. [719232, System.Windows.Forms.dll, Bug, Build:3707] +* Fixed a vulnerability in System.Windows.Forms.Clipboard APIs. [655431, System.Windows.Forms.dll, Bug, Build:3707] +* Added Scroll UIA pattern to ListBox items in order to make the control accessible. [742319, System.Windows.Forms.dll, Bug, Build:3734] +* Fixed ColorEditor, ContentAlignmentEditor, CursporEditor to respond to DPI changed messages and made changes in FontEditor to always open in the 'SystemAware' mode even when the application is in "per-monitor" mode. [746634, System.Windows.Forms.dll, System.Drawing.Design.dll, Bug, Build:3734] +* Fixed providing correct accessibility information and correct accessible hierarchy of PropertyGrid control. [526702, system.windows.forms.dll, Bug, Build:3734] +* The screen reader announcement of the WinForms' Menu and ToolStrip expandable subitems has been fixed to not read in items' and scan mode the hidden (collapsed) subitems until corresponding parent Menu item/ToolStrip DropDown item is expanded. In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. [560840, System.Windows.Forms.dll, Bug, Build:3734] +* Fixed UI Automation provided accessibility of WinForms DataGridView ComboBox to have appropriate and consistent screen reader announcement for ComboBox interactions. The feature is available starting with Windows 10, version 1709. In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. [732559, System.Windows.Forms.Dll, Bug, Build:3734] +In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. +* With the fix applied, SmartTags will work fine in VS on secondary monitor when PMA option is turned on. [754549, System.Windows.Forms.dll, Bug, Build:3761] +* With the fix applied, Menu control in WinForms designer can be edited using Narrator navigation - user is able to add Menu Strip items, MenuItem can be added as a child via navigation and ""Type Here"" placeholder for a new item can be announced. +In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file as seen in the example for Bug 549360. [792793, System.Windows.Forms.dll, Bug, Build:3761] +* With the fix applied, Chart control meets high contrast standards. In high contrast regimen user is able to access information from Chart control's labels which colors are enough contrast now. +In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. [826994, System.Windows.Forms.dll, Bug, Build:3761] +* With the fix applied, Chart control shows the focus indicator and can be focused using mouse. User is able to access information from Chart control more effectively using assistive technologies. +In order for the application to benefit from these changes, the application should be recompiled to target .NET framework 4.8 or the application should explicitly opt-in into all accessibility app context switches in the app.config file. [827003, System.Windows.Forms.dll, Bug, Build:3761] +* Grid error dialog in the property browser (of VS) doesn't support PMA mode yet. Hence, Fixed it to show up as “SystemAware” only dialog when the process is in PMV2 mode. This behavior may change in the future release. [827142, System.Windows.Forms.dll, Bug, Build:3761] +* Fixed the ability to select ComboBox edit field text using mouse down + move. [853381, System.Windows.Forms.dll, Bug, Build 3928] +* Fixed the issue with interaction between a WPF user control and the hosting WinForms app when processing keyboard input. [899206, WindowsFormsIntegration.dll, Bug, Build 3928] +* Fixed the issue with Narrator/NVDA announcing of PropertyGrid’s ComboBox expanding and collapsing action. [792617, System.Windows.Forms.dll, Bug, Build 3928] +* Fixed the issue with rendering “…” button of PropertyGrid control in HC mode to draw button background and dots contrasted. [792780, System.Windows.Forms.dll, Bug, Build 3928] + + +## WPF + +* Fixed a memory leak arising when removing data items from their parent collections, when UIAutomation is present. [172291, PresentationFramework.dll, Bug, Build:3621] +* Fixed virtualizing ItemsControl hung during scrolling when Items collection contains duplicate value-typed objects. [360053, PresentationFramework.dll, Bug, Build:3621] +* Fixed WPF application can crash with NullReferenceException when changing a property used by a DataTrigger whose host element has been removed from the visual tree. The crash only occurs if the host element is garbage-collected during a small window of time during the property-change notification. [401484, PresentationFramework.dll, Bug, Build:3621] +* Fixed WPF app that has multiple top-level windows in different threads that crashes during a theme change. [404464, PresentationFramework.dll, Bug, Build:3621] +* Fixed WPF applications running on touch or stylus-enabled machines can sometimes hang at startup or during connection of a tablet or stylus device. [474688, PresentationFramework.dll, Bug, Build:3621] +* Fixed focus issues in WPF applications running in high contrast themes, it can be difficult to distinguish when a TextBox, PasswordBox, or RichTextBox has focus. [486957, PresentationFramework.dll, Bug, Build:3621] +* Fixed WPF applications using DocumentViewer controls may see issues with the rendering of text selection graphics after a theme change. This change addresses that issue. [494408, PresentationFramework.dll, Bug, Build:3621] +* In WPF applications running on touch or stylus-enabled machines that set the AppContext switch "Switch.System.Windows.Input.Stylus.EnablePointerSupport" to true, StylusPlugins would not be properly unhooked when element properties were changed prior to the presentation source being set to null. This change fixes this issue. [500125, PresentationFramework.dll, Bug, Build:3621] +* Fixed an issue that caused XAML Browser Applications (XBAP’s) targeting .NET 3.5 to sometimes load using .NET 4.x runtime incorrectly. [560029, PresentationHost_v0400.dll, Bug, Build:3621] +* Fixed an infinite loop arising during layout of a Grid in some cases when *-columns with MinSize constraints consume all the available space. [560609, PresentationFramework.dll, Bug, Build:3621] +* Fixed WPF applications running under high contrast themes, the border color of a disabled TextBox, RichTextBox, and PasswordBox was incorrect. This change addresses that issue. [527669, PresentationFramework.dll, Bug, Build:3621] +* Fixed WPF applications using non-adorner based text selection for TextBox and PasswordBox (Switch.System.Windows.Controls.Text.UseAdornerForTextboxSelectionRendering=false), developers may now set the SelectionTextBrush property in order to alter the rendering of the selected text. By default, this color changes with SystemColors.HighlightTextBrushKey. If non-adorner based text selection is not enabled, this property does nothing. [531137, PresentationFramework.dll, Bug, Build:3621] +* Fixed WPF application running in high contrast mode has difficult to see selection visuals on DataGridCells. This change addresses that issue. [545871, PresentationFramework.dll, Bug, Build:3621] +* Fixed WPF applications running on a touch or stylus-enabled machine, users might periodically see a crash in System.Windows.Window.GetWindowMinMax. This change addresses that issue. [546769, PresentationFramework.dll, Bug, Build:3621] +* Fixed a memory leak arising when sending bitmaps to the clipboard. [589759, PresentationCore.dll, Bug, Build:3621] +* Fixed WPF application running on a stylus or touch-enabled machine may see NullReferenceExceptions or InvalidCastExceptions under certain circumstances. This change addresses this issue. [577690, PresentationCore.dll, Bug, Build:3621] +* Fixed issue when non-Adorner-based text selection is enabled in .NET Framework 4.7.2 and above, the default SelectionOpacity of FlowDocumentReader, FlowDocumentScrollViewer, and SinglePageViewer will cause the selection to obscure the underlying text. This change addresses this issue by setting the default SelectionOpacity to the correct value. [568305, PresentationFramework.dll, Bug, Build:3621] +* Fixed WPF applications using non-adorner based text selection (AppContext flag "Switch.System.Windows.Controls.Text.UseAdornerForTextboxSelectionRendering=false"), editable ComboBoxes do not appropriately follow theme colors for text selection. [572332, PresentationFramework.dll, Bug, Build:3621] +* Fixed timing issues in the finalizer thread could potentially cause exceptions during AppDomain or process shutdown in certain .NET applications. This is generally seen in applications that do not correctly shut down Dispatchers running on worker threads prior to process or AppDomain shutdown. Such applications should take care to properly manage the lifetime of Dispatchers. This change adds an AppContext switch that can help alleviate (but not eliminate) some of the issues that may arise from these application design issues. To enable this, set the AppContext flag "Switch.MS.Internal.DoNotInvokeInWeakEventTableShutdownListener=true". [606492, WindowsBase.dll, Bug, Build:3621] +* Fixed crash issues and allows the replace to proceed.When replacing multiple characters with a single character (in a different language than replaced text) using IMEPad, WPF crashes. [595046, PresentationFramework.dll, Bug, Build:3621] +* Fixed WPF application that changes TreeView.IsEnabled and (at the same time) changes the underyling collection(s) can experience a spurious ElementNotAvailableException. [573999, PresentationFramework.dll, Bug, Build:3621] +* Addressed the issue of high CPU usage or hangs. This used to happen under certain conditions, where, WPF applications using WindowChromeWorker experience high CPU usage or hangs. . [437642, PresentationFramework.dll, Bug, Build:3632] +* Fixed a bug in the 4.7 algorithm for allocating sizes to *-rows in a Grid. In some cases (e.g. Grid with Height="Auto" containing empty rows), rows were arranged at the wrong position, possibly outside the Grid altogether. [590061, PresentationFramework.dll, Bug, Build:3632] +* Fixed a potential deadlock in WPF Packaging APIs when multiple threads were both creating and closing large packages simultaneously. [609850, PresentationCore.dll, WindowsBase.dll, Bug, Build:3632] +* Fixed incorrect result of pressing an arrow key when focus is on a Hyperlink within an item that is not the SelectedItem of the parent ItemsControl. [405208, PresentationFramework.dll, Bug, Build:3646] +* Fixed issue where internal class PriorityQueue can return items in the wrong order. [442569, PresentationCore.dll, Bug, Build:3646] +* Fixed usage of resources internal to theme files to avoid potential conflicts. [494194, System.Windows.Controls.Ribbon.dll, Bug, Build:3646] +* Fixed an issue where automation properties set on an editable RibbonComboBox are not properly announced by screen readers or other assistive technologies. [520147, PresentationCore.dll, Bug, Build:3646] +* GridViews with focusable Header rows will now not experience keyboard focus landing on the padding column in the header. [559546, PresentationFramework.dll, Bug, Build:3646] +* Fixed Binding's incorrect use of IList indexer when the source object declares a custom indexer with the same signature [585942, PresentationFramework.dll, Bug, Build:3646] +* Fixed the issues of certain bounding rectangles, not being drawn corrently. When WPF is run in Per-Monitor Aware mode, certain bounding rectangles around text are drawn incorrectly by Accessibility tools like Narrator. This fix addresses the problem. To opt-into this fix, the target framework version of the Application should be set to .NET 4.8. Alternatively, an AppContext switch - "Switch.UseLegacyAccessibilityFeatures.2" - can be overridden with the value "false" to enable the fix. [617457, PresentationFramework.dll, Bug, Build:3646] +* Fixed a hang arising during layout of a Grid when UseLayoutRounding=true, high DPI is in effect, grid *-column widths are determined from children with ColumnSpan > 1, and floating-point roundoff is unfavorable. [619978, PresentationFramework.dll, Bug, Build:3646] +* Fixed an issue where re-entrant calls during shutdown could cause various application faults in WPF applications running on a touch or stylus enabled machine. [633620, PresentationCore.dll, PresentationFramework.dll, Bug, Build:3646] +* Fixed a memory leak arising when the number of TextBoxes drops to 0. [645497, PresentationFramework.dll, Bug, Build:3646] +* Fixed the DeadLock issue faced during creation of Spellchecker while Finalizer is ending another Instance. Under certain circumstances, WPF applications using the spell-checker that use custom dictionaries could throw unexpected excpetions and crash [646599, PresentationFramework.dll, Bug, Build:3646] +* Addressed the issue where GroupItem headers containing an Expander were not announced correctly by screen readers [646633, PresentationFramework.dll, Bug, Build:3646] +* Fixed WPF issue of not creating correctly-size rendertarget for mixed-mode child windows. Under certain circumstances, per-monitor DPI aware applications that host WPF based controls or plugins were not rendering the WPF window fully [646801, wpfgfx_v0400.dll, Bug, Build:3646] +* Addressed the restore issue of Window.Left & Window.Top. When WPF applications are running in per-monitor aware mode, saving the value of Window.Left and Window.Top at application end, and restoring the values to a Window prior to creation upon the next application launch, was not restoring the application to the same screen position where it was at the time the application was closed. [646803, PresentationFramework.dll; PresentationCore.dll;WindowsBase.dll, Bug, Build:3646] +* Fixed the issue where HwndHost does not adapt child-HWND sizing correctly during DPI changes. When WPF is run in Per-Monitor Aware mode, controls hosted within HwndHost were not sized correctly after DPI changes (for e.g., when moving applications from one monitor to another). This fix ensures that controls hosted so are sized appropriately [646805, PresentationFramework.dll;PresentationCore.dll;WindowsBase.dll, Bug, Build:3646] +* Fixed the issue of WPF Windows not scaling correctly. WPF windows that are parented under native HWND’s, including Windows Forms (using ElementHost), will correctly react to DPI changes and scale themselves appropriately when the dpiAwareness element in the application manifest is updated to “PerMonitorV2” value. [478267, PresentationCore.dll,wpfgfx_v0400.dll, Feature, Build:3673] +* Fixed a race condition where an external process (e.g. anti-virus scanner or search indexer) could block access to temporary files. [519951, PresentationCore.dll, PresentationFramework.dll, System.Speech.dll, Bug, Build:3673] +* Automation properties set on TextBoxes within a DatePicker are now announced correctly by 3rd-party screen readers. [619245, PresentationCore.dll, Bug, Build:3673] +* Improved reliability of WPF under certain situations and prevents hangs.[629025, wpfgfx_v0400.dll, Bug, Build:3673] +* Fixed a regression involving bindings to properties of type DataView or RelatedView. In some cases the value gets GC'd prematurely, causing the bindings to sliently stop working. [636340, PresentationFramework-SystemData.dll, Bug, Build:3673] +* When WPF is run in Per-Monitor Aware mode, controls hosted within HwndHost are not sized correctly after DPI changes (for e.g., when moving applications from one monitor to another). This fix ensures that controls hosted so are sized appropriately. +On .NET Framework Versions 4.7.2 and older, applications must opt in to enable the fix by setting the AppContext switch +""Switch.System.Windows.DoNotUsePresentationDpiCapabilityTier2OrGreater"" to ""false"". This switch can be set either in the registry or in the application - see the documentation for AppContext (https://msdn.microsoft.com/en-us/library/system.appcontext(v=vs.110).aspx). [646805, PresentationFramework.dll;PresentationCore.dll;WindowsBase.dll, Bug, Build:3673] +* Fixed an issue arising when refreshing a grouped collection view. While the groups are being rebuilt, they pass through a transient state where the subgroups are empty but the cached value for count still reports non-empty. A re-entrant call to get an item at a given index during this time will get ArgumentOutOfRangeException, even though index < count. [656948, PresentationFramework.dll, Bug, Build:3673] +* Fixed a crash due to TaskCanceledException that can occur during shutdown of some WPF apps. Apps that continue to do work involving weak events or data binding after Application.Run() returns are known to be vulnerable to this crash. [668328,WindowsBase.dll, Bug, Build:3673] +* Added support for ControllerFor UIAutomation property [503411, PresentationCore.dll, UIAutomationTypes.dll, Feature, Build:3694] +* Fixed an issue where focus loops inside a WPF UserControl instead of breaking out of it under some hosting scenarios. [542626, PresentationCore.dll, PresentationFramework.dll, WindowFormsIntegration.dll, Bug, Build:3694] +* Fixed an issue where dragging from a WPF application and dropping into an application that fails causes a crash in WPF. [685894, PresentationFramework.dll, Bug, Build:3694] +* Fixed a crash when using "live sorting" and NewItemPlaceholderPosition.AtBeginning at the same time. [387603, PresentationFramework.dll, Bug, Build:3694] +* Added support for SizeOfSet and PositionInSet UIAutomation properties, this change also provides defaults for some controls. [488213, PresentationCore.dll, PresentationFramework.dll, System.Windows.Controls.Ribbon.dll, UIAutomationClient.dll, UIAutomationTypes.dll, Feature, Build:3694] +* Scrolling panels now honor the system setting for mouse wheel to "scroll by screen". [586801, PresentationFramework.dll, System.Windows.Controls.Ribbon.dll, Bug, Build:3694] +* Tooltips now show underneath controls when keyboard focused, Ctrl+Shift+F10 dismisses/reshows tooltips. [614397, PresentationFramework.dll, System.Windows.Controls.Ribbon.dll, Feature, Build:3694] +* Improved the performance of rebuilding the automation tree of an items control (ListBox, DataGrid, etc.) in which grouping is enabled. [104559, PresentationCore.dll, PresentationFramework.dll, Bug, Build:3707] +* Fixed the behavior of automation Grid pattern in a ListView. [401080, PresentationFramework.dll, Bug, Build:3707] +* Fixed the automation tree exposed for a plain ItemsControl (as opposed to a derived class like ListBox, DataGrid, etc.). [410007, PresentationCore.dll, PresentationFramework.dll, Bug, Build:3707] +* Fixed an infinite loop that can arise when setting the height of ListBox (or other ItemsControl) to zero. [448747, PresentationFramework.dll, Bug, Build:3707] +* Fixed a reliability problem to reduce crashes with rapid window size changes when running in Software Rendering mode. [691364, wpfgfx_v0400.dll, Bug, Build:3707] +* Fixed a crash arising when Visual Studio's diagnostic tools are enabled to debug an app that has a ResourceDictionary whose Source points to invalid XAML. [727642, PresentationFramework.dll, Bug, Build:3707] +* Fixed a security vulnerability when pasting in WPF textboxes and in WPFs Clipboard APIs [678471, PresentationCore.dll, Bug, Build: 3707] +* Fixed a security vulnerability when pasting in WPF RichTextbox and InkCanvas [678477, PresentationFramework.dll, Bug, Build: 3707] +* Improved the memory allocation and cleanup scheduling behavior of the weak-event pattern. To opt-in to these improvements, set AppContext switches to 'true': Switch.MS.Internal.EnableWeakEventMemoryImprovements and Switch.MS.Internal.EnableCleanupSchedulingImprovements. [759824, WindowsBase.dll, PresentationFramework.dll, Bug, Build:3734] +* Fixed context menus and popups that are sometimes dismissed unexpectedly when shown for the first-time on a non-primary High-DPI monitor [732853, PresentationFramework.dll, PresentationCore.dll, Bug, Build:3734] +* Fixed a crash due to ElementNotAvailableException arising when scrolling and expanding/collapsing nodes in a TreeView with VirtualizationMode=Recycling, that changes its IsEnabled property while expanding nodes. This crash only occurs when there is a "partial automation client" running (and no full automation client); The chief example is running the app over RDP to a Win10 machine. [705448, PresentationCore.dll, Bug, Build:3734] +* Fixed a crash in WPF when displaying specific Unicode characters (Unicode codepoint 0xFDFD 47 times or more in a row) [725381, PresentationCore.dll, Bug, Build:3734] +* Fixed the construction of automation for an ItemsControl to avoid calling the control's IsItemItsOwnContainerOverride method. This avoids crashes in cases where the override has bugs [755174, PresentationCore.dll, PresentationFramework.dll, Bug, Build:3734] +* Fixed an issue arising when removing an item from a grouped collection view. Any groups that become empty are themselves removed, raising CollectionChanged events before the parent groups' counts have been fully updated. An event handler that calls back into the collection view can get ArgumentOutOfRangeException. [765355, PresentationFramework.dll, Bug, Build:3734] +* In .NET 4.8 Preview, WPF programs that create many RenderTargets (e.g. RenderTargetBitmap) can leak GDI handles and memory eventually resulting in an OutOfMemoryException from System.Windows.Media.Composition.DUCE+Channel.SyncFlush(). This was due to a COM reference cycle keeping render targets alive in the WPF renderer. Fixed this issue. [756618, wpfgfx_v0400.dll, Bug, Build:3734] +* Added an AppContext switch 'Switch.System.Windows.Controls.ItemsControlDoesNotSupportAutomation' that guards the fix for the automation tree under a plain ItemsControl (previously disclosed Bug 410007).  This switch defaults to 'false' for apps that target .NET 4.8, or to 'true' for apps that target earlier versions.  [778689, PresentationCore.dll, WindowsBase.dll, Bug, Build:3745] +* Fixed an accessibility issue when replacing an item in a collection with another item that compares as equal. [774503, PresentationFramework.dll, Bug, Build:3761] +* Added an AppContext switch Switch.System.Windows.Automation.Peers.ItemAutomationPeerKeepsItsItemAlive that opts-out of part of an earlier memory leak fix (172291) by changing ItemAutomationPeer's reference to its item from weak to strong. This re-introduces some of the leaks, but can fix problems in custom automation implementations that tactically assume a strong reference. For example, a custom automation peer (for an ItemsControl) that implements its own logic for re-using its item peers is likely to have a problem when an item X in the underlying collection is replaced by a "separate-but-equal" item X' - a different object where Object.Equals(X, X') is true. [801226, PresentationFramework.dll, Bug, Build:3761] +* Fixed an issue involving bindings with DataContext explicitly on the binding path.  When DataContext changes to {DisconnectedItem}, the binding should not pass that value to user code like converters, property-change handlers, etc. [801039, PresentationFramework.dll, Bug, Build:3761] +* Fixed a handle leak during creation of a Window in WPF applications that are manifested for Per Monitor DPI V2 Awareness. This leak could lead to extraneous GC.Collect calls that can impact performance in Window creation scenarios. [845699, PresentationFramework.dll, Bug, Build 3928] +* Fixed a regression caused by the bug fix involving bindings with DataContext explicitly on the binding path. [850536, PresentationFramework.dll, Bug, Build 3928] +* Fixed a crash due to an ArgumentNullException when loading a DataGrid containing a ComboBox while automation is active. This might occur, for example, when navigating Visual Studio to the Text Editor\C#\Code Style\Naming page in Tools\Options. [801039, PresentationFramework.dll, Bug, Build 3928] + + +## WorkFlow + +* We have modified the hashing algorithm used to generate XOML file checksums when building projects with XOML files. If this causes problems, the previous hashing algorithm can be used by specifying ""true"" for the following AppContext switch: Switch.System.Workflow.ComponentModel.UseLegacyHashForXomlFileChecksum. Note that this AppContext switch applies to the MSBuild process, so must be specified in the ""config path"" of the MSBuild.Exe that is used to perform the builds. [531054, System.Workflow.Runtime.dll, Bug, Build:3621] +* We have modified the hashing algorithm used to calculate keys to internal in-memory caches. If this causes problems, the previous hashing algorithm can be used by specifying ""true"" for the following AppContext switches: Switch.System.Workflow.Runtime.UseLegacyHashForWorkflowDefinitionDispenserCacheKey Switch.System.Workflow.Runtime.UseLegacyHashForSqlTrackingCacheKey. [532505, System.Workflow.Runtime.dll, Bug, Build:3621] +* Fixed default hashing algorithm that help debugging symbols has changed. If you encounter problems with breakpoints in the workflow designer not being hit when expected, you may have a mismatch of hashing algorithms between MSBuild and the project being debugged. The following AppContext switch can be specified for MSBuild.exe and the project being debugged to help alleviate the problem. Switch.System.Activities.UseLegacyHashForDebuggerSymbols If this switch has a value of ""true"", then the default hashing algorithm for pre-4.7.2 versions of .NET are used. If the value of the switch is ""false"", the newer default hashing algorithm is used. [537692, System.Workflow.Runtime.dll, Bug, Build:3621] +* Previously, under extreme usage conditions (high volume of connections to MSDTC), it was possible for a CriticalSection to be held by a single thread indefinitely, resulting in the need to restart the process. This problem has been resolved. In addition, some object caches that would help performance in multi-threaded scenarios were not taken advantage of correctly. This has been resolved. [540812, System.Workflow.Runtime.dll, Bug, Build:3621] +* Fixed an accessibility problem to enable connector label reading on workflow designer [604810, System.Activities.Presentation.dll, Bug, Build:3646] +* Fixed an accessibility problem to have more texts clearly visible on workflow designer. [613975, System.Activities.Presentation.dll, Bug, Build:3646] +* Fixed the StackOverflowException issue for larger nesting depth of XOML. Previosuly, if the object nesting depth in the XOML was large, there were possibilities to cause the process to encounter a StackOverflowException. These problems have been resolved. +The maximum object nesting depth can be adjusted (default being 300) with the following AppSetting specification in the process that creates and invokes the WorkflowCompiler class: + +Where n is the new maximum object nesting depth. +The possible issues like, random code execution during XOML deserialization (even when CheckTypes parameter is specified to the WorkflowCompiler), have been resolved [631082, System.Workflow.ComponentModel.dll, Bug, Build:3646] +* Fixed an accessibility problem that the warning icons on workflow activity designer is not accessible [407415, System.Activities.Presentation.dll, Bug, Build:3673] +* Fixed an accessibility problem to enable connector label reading on workflow designer [604810, System.Activities.Presentation.dll, Bug, Build:3673] +* Fixed a problem with Transaction.Current and remoting operations. + In some .NET Remoting scenarios, when using TransactionScopeAsyncFlowOption.Enabled, it was possible to have Transaction.Current reset to null after a remoting call. Sometimes this was due to the remoting lease lifetime expiring while the remoting call was outstanding (pre 4.7.2). And sometimes this occurred when the remoting call did not leave the caller's AppDomain (with 4.7.2). +``This is now fixed for the latter case (remoting in the same AppDomain). +For the former case (lease lifetime expires), a new AppSetting for the configuration file has been introduced to allow the user to specify the lease lifetime of the object used for keeping track of Transaction.Current in the call context. The user should set this to the number of minutes of the longest expected remoting call. +The AppSetting looks like this: +The value specifies the lease lifetime for the object, in minutes.`` [672774, System.Transactions.dll, Bug, Build:3673] +* Fixed an accessibility problem to have navigation information for ExpandAll/CollapseAll ToggleButtons on workflow designer. [682170, System.Activities.Presentation.dll, Bug, Build:3673] +* Previously Visual Studio builds of C# projects would create 3 temporary files and not clean them. With this change, the files are only created for C# projects that contain XAML files and utilize the XamlAppDef build action and those files are deleted with the Clean task. [392996, System.Workflow.Runtime.dll, Bug, Build:3694] +* Prevented vulnerabilities based on misuse of serialized ActivitySurrogateSelector.ObjectSurrogates. [726199, System.Workflow.ComponentModel.dll, Bug, Build:3707] +* Fixed a vulnerability in the WorkflowMarkupSerializer that allowed "random" code to be executed with certain XOML constructs. +If users experience application compatibility problems, there are couple of "opt-out" < appSettings> values that allow users to modify the behavior introduced by this change: +```xml + +``` +Setting this value to "true" completely disables the type checking that is done during deserialization. It takes precedence over the value below. +```xml + +``` +The type checker has a list of hard-coded types that are disallowed by default. Setting this value to "true" allows those hard-coded types. The user can specify a list of unauthorized types on their own by adding the following to the app.config file: +```xml + + ​ + ​ +
​ + ​ + ​ + + + ​ + ​ + + + ​ + ​ + +``` +In the above example, the type System.ActivitiesPresentation.WorkflowDesigner in the System.Activities.Presentation assembly is unauthorized because its "Authorized" value is "false". [735532, System.Workflow.ComponentModel.dll, Bug, Build:3745] diff --git a/releases/net48/dotnet48-known-issues.md b/releases/net48/dotnet48-known-issues.md new file mode 100644 index 000000000..446473175 --- /dev/null +++ b/releases/net48/dotnet48-known-issues.md @@ -0,0 +1,13 @@ +.NET Framework 4.8 Known Issues +================================= + +This document lists the known issues that you may experience after you install the Microsoft .NET Framework 4.8 + +## Product issues for the .NET Framework 4.8 +- [776516 - ASP.NET - InvalidOperationException in ASP.Net-RecycleLimitMonitor-AlertProxyMonitors](https://github.com/Microsoft/dotnet/blob/master/releases/net48/KnownIssues/776516-InvalidOperationException%20in%20System_Web_ni!System.Web.Hosting.RecycleLimitMonitor%2BRecycleLimitMonitorSingleton.AlertProxyMonitors.md) + +- [780675 - WPF - Per-Monitor DPI-aware WPF applications position mouse cursor incorrectly when dragging between monitors](https://github.com/Microsoft/dotnet/blob/master/releases/net48/KnownIssues/wpf-pma-window-drag.md) + + + + diff --git a/releases/net481/KnownIssues/4.x WCF optional components.md b/releases/net481/KnownIssues/4.x WCF optional components.md new file mode 100644 index 000000000..e13354ffe --- /dev/null +++ b/releases/net481/KnownIssues/4.x WCF optional components.md @@ -0,0 +1,12 @@ +# 4.x WCF optional components + +## Symptoms +The .NET Framework 4.x WCF optional components on Windows 11 ARM64 client machines will fail to be enabled either through the dism command or add/remove program UI. + +## Workaround +No workaround available + +## Resolution + A resolution to this issue will be included in an upcoming release + +**Note**: Message Queuing (MSMQ) Activation will remain disabled because MSMQ is not available on Windows 11 for ARM64 client machines diff --git a/releases/net481/README.md b/releases/net481/README.md new file mode 100644 index 000000000..6745258ea --- /dev/null +++ b/releases/net481/README.md @@ -0,0 +1,17 @@ +# .NET Framework 4.8.1 Release Notes + +You can learn about the changes made in the .NET Framework 4.8.1. + +- [Download](https://go.microsoft.com/fwlink/?LinkId=2203304) +- [.NET Framework 4.8.1 RTM announcement blog post](https://devblogs.microsoft.com/dotnet/announcing-dotnet-framework-481) +- [.NET Framework 4.8.1 RTM availability on Windows Update and Catalog announcement blog post](https://devblogs.microsoft.com/dotnet/upcoming-availability-of-net-framework-4-8-1-on-windows-update-and-catalog/) +- [Release notes](dotnet481-changes.md) +- [Application compatibility](https://github.com/Microsoft/dotnet/blob/master/Documentation/compatibility/README.md#net-framework-481) +- [Known issues](dotnet481-known-issues.md) + +## Release Notes by Product Area + +- [Native support for Arm64](dotnet481-changes.md#native-support-for-Arm64) +- [Accessible tooltips](dotnet481-changes.md#accessible-tooltips) +- [Windows Forms – accessibility improvements](dotnet481-changes.md#windows-forms) + diff --git a/releases/net481/dotnet481-changes.md b/releases/net481/dotnet481-changes.md new file mode 100644 index 000000000..b7e5c8d75 --- /dev/null +++ b/releases/net481/dotnet481-changes.md @@ -0,0 +1,25 @@ +# .NET Framework 4.8.1 Release Notes + +.NET Framework release notes describe product improvements grouped by product area. + +## Native support for Arm64 + +* Add native Arm64 support to the .NET Framework family to leverage the benefits of running workloads natively on Arm64 for better performance when compared to running x64 code emulated on Arm64. + +## Accessible Tooltips + +* tooltips now comply with the guidelines set forth in the [WCAG2.1 content on Hover or Focus](https://www.w3.org/WAI/WCAG21/Understanding/content-on-hover-or-focus.html) guidance. The requirements for tooltips require the following: +- Tooltips must display either via mouse hover or by keyboard navigation to the control. +- Tooltips should be **dismissable**. That is, a simple keyboard command like the ESC key should dismiss the tooltip. +- Tooltips should be **hoverable**. Users should be able to place their mouse cursor over the tooltip. This enables scenarios like using magnifier to be able to read the tooltip for low-vision users. +- Tooltips should be **persistent**. Tooltips should not automatically disappear after a certain time has elapsed. Rather, the tooltips should be dismissed by the user moving their mouse to another control, or by dismissing the tooltip as described above. + +## Windows Forms + +* Added support for the UIA Text Pattern to enable assistive technology to traverse the content of a TextBox or similar text-based control letter by letter. +* Fixed high contrast issues in several controls and have changed the contrast ratio of selection rectangles to be darker and more visible. +* Fixed several DataGridView issues: +- Updated the scrollbar names for consistency. +- Fixed an issue where Narrator was unable to focus on empty DataGridView cells. +- Enabled developers to set the localized control type property for Custom DataGridView cells. +- Updated the link color for DataGridViewLink cells to have better contrast with the background. \ No newline at end of file diff --git a/releases/net481/dotnet481-known-issues.md b/releases/net481/dotnet481-known-issues.md new file mode 100644 index 000000000..fd00d8452 --- /dev/null +++ b/releases/net481/dotnet481-known-issues.md @@ -0,0 +1,7 @@ +.NET Framework 4.8.1 Known Issues +================================= + +This document lists the known issues that you may experience after you install the Microsoft .NET Framework 4.8.1 + +## Product issues for the .NET Framework 4.8.1 +- [ASP.NET - 4.x WCF optional components](https://github.com/microsoft/dotnet/blob/master/releases/net481/KnownIssues/4.x%20WCF%20optional%20components.md) diff --git a/releases/reference-assemblies/README.md b/releases/reference-assemblies/README.md new file mode 100644 index 000000000..a85f36a62 --- /dev/null +++ b/releases/reference-assemblies/README.md @@ -0,0 +1,105 @@ +# .NET Framework Targeting Pack Nuget Packages + +These packages enable building .NET Framework projects on any machine with at least MSBuild or the .NET Core SDK installed. + +The following scenarios and benefits are enabled for .NET Framework projects: + +- Build without requiring admin operations to install pre-requisites such as [Visual Studio](https://visualstudio.microsoft.com/vs/) or [.NET Framework targeting packs](https://dotnet.microsoft.com/download/visual-studio-sdks). +- Build libraries on any operating system supported by the .NET Core SDK. +- Build Mono-based projects. + +## Usage + +### .NET Core project + +This sample uses a multi-targeting ClassLibrary project, that can be created using `dotnet new classlib`. + +Change `TargetFramework` property to `TargetFrameworks` and add a new .NET Framework target, like in the following example: + +```xml +netstandard2.0;net472 +``` + +Add Package reference: + +```xml + + + +``` + +Build as usual: + +```console +dotnet build +``` + +### SDK-style project + +Add the `TargetFramework` property and a `PackageReference` like in the following example `csproj` file: + +```xml + + + + Exe + net472 + + + + + + +``` + +### Classic-style project + +1. Add `PackageReference` to your `csproj` file, the same way as in the SDK-style sample above. + +2. Add or modify the `TargetFrameworkVersion` property in your *csproj* file: + +```xml +v4.7.2 +``` + +### Building your .NET Framework (SDK and Classic) project + +1. Restore NuGet packages: + +```console +msbuild /t:restore +``` + +2. Build the project: + +```console +msbuild +``` + +## Package location + +https://www.nuget.org/packages/Microsoft.NETFramework.ReferenceAssemblies + +## Latest release + +Version: 1.0.2 + +Date: May 6th, 2021 + +## Changelog + +### 1.0.3 + +Adds .NET Framework 4.8.1 package. + +### 1.0.2 + +Fixes naming issue with System.Configuration.dll in 2.0 and 3.5 packages. Incorrect capitalization (System.configuration.dll) was causing build issues on Linux. + +### 1.0.1 + +Adds .NET Framework 3.5 package. + +### 1.0.0 + +Initial release diff --git a/src/bc-readme-gen/Program.cs b/src/bc-readme-gen/Program.cs new file mode 100755 index 000000000..1273e48c9 --- /dev/null +++ b/src/bc-readme-gen/Program.cs @@ -0,0 +1,128 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Text; + +namespace bc_readme_gen +{ + class Program + { + static void Main(string[] args) + { + if (args == null || args.Length == 0) + { + Console.WriteLine("Bad argument."); + Console.WriteLine("You need to specify location of breaking change documents."); + } + + string bcpath = args[0]; + + var bcList = new Dictionary>(); + var template = "README-template.md"; + string templateText = null; + string bcpathREADME = Path.Combine(bcpath, "README.md"); + var bcdir = new DirectoryInfo(bcpath); + const string versionIntroduced = "### Version Introduced"; + + + foreach(var changeFile in bcdir.GetFiles("*.md")) + { + if (changeFile.Name == "! Template.md" || changeFile.Name == "README.md" || changeFile.Name == "!categories.md") + { + continue; + } + + var change = new BreakingChange(); + + using (var reader = changeFile.OpenText()) + { + var titleLine = reader.ReadLine(); + var title = titleLine.Substring(3); + change.Title = title; + change.Path = changeFile.Name; + + string versionLine = null; + while ((versionLine = reader.ReadLine()) != null) + { + if (versionLine != versionIntroduced) + { + continue; + } + + var version = reader.ReadLine(); + change.Version = version; + break; + } + + if (!bcList.ContainsKey(change.Version)) + { + bcList.Add(change.Version,new List()); + } + + var versionChanges = bcList[change.Version]; + versionChanges.Add(change); + } + } + + using (var templateReader = File.OpenText(template)) + { + templateText = templateReader.ReadToEnd(); + } + + var keysArrayLength = bcList.Keys.Count; + var keysArray = new string[keysArrayLength]; + bcList.Keys.CopyTo(keysArray,0); + + Array.Sort(keysArray); + Array.Reverse(keysArray); + + using (var writer = File.CreateText(bcpathREADME)) + { + writer.Write(templateText); + writer.WriteLine(); + + foreach(var ver in keysArray) + { + var hashVersion = new StringBuilder(); + foreach (var c in ver) + { + if (c != '.') + { + hashVersion.Append(c); + } + } + + var hashLink = $"net-framework-{hashVersion.ToString()}"; + writer.WriteLine($"- [.NET Framework {ver}](#{hashLink})"); + } + + foreach(var ver in keysArray) + { + writer.WriteLine(); + writer.WriteLine($"## .NET Framework {ver}"); + writer.WriteLine(); + + var breaks = bcList[ver]; + + breaks.Sort((break1,break2)=>break1.Title.CompareTo(break2.Title)); + + foreach (var b in breaks) + { + writer.WriteLine($"- [{b.Title}]({b.Path})"); + } + } + + writer.WriteLine(); + writer.WriteLine("This file was generated by [Breaking Change Readme Generator](https://github.com/Microsoft/dotnet/blob/master/src/bc-readme-gen)."); + } + } + + } +} + +public class BreakingChange +{ + public string Title; + public string Path; + public string Version; +} diff --git a/src/bc-readme-gen/README-template.md b/src/bc-readme-gen/README-template.md new file mode 100644 index 000000000..a9dbd9073 --- /dev/null +++ b/src/bc-readme-gen/README-template.md @@ -0,0 +1,5 @@ +# .NET Framework Application Compatibility + +The following documents provide information on .NET Framework application compatibility. They describe breaking changes and other changes in behavior in each .NET Framework release. + +Please help us improve the [.NET Framework Application Compatibility documents](https://github.com/Microsoft/dotnet/tree/master/Documentation/compatibility). In particular, better titles will improve the index below, both in content and the sort. diff --git a/src/bc-readme-gen/README.md b/src/bc-readme-gen/README.md new file mode 100644 index 000000000..fc98fb738 --- /dev/null +++ b/src/bc-readme-gen/README.md @@ -0,0 +1,5 @@ +# Breaking Change README Generator + +This tool generates the [.NET Framework Breaking Change README](https://github.com/Microsoft/dotnet/blob/master/Documentation/compatibility/README.md). It should be run when the [breaking change documents](https://github.com/Microsoft/dotnet/blob/master/Documentation/compatibility) are updated to ensure that the README is still correct. + +The tool uses a [README template](README-template.md) for the boiler plate part of the README. diff --git a/src/bc-readme-gen/bcreadgen.csproj b/src/bc-readme-gen/bcreadgen.csproj new file mode 100755 index 000000000..abb9969a5 --- /dev/null +++ b/src/bc-readme-gen/bcreadgen.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp1.1 + + + diff --git a/tools/DrainNGENQueue/DrainNGenQueue.ps1 b/tools/DrainNGENQueue/DrainNGenQueue.ps1 new file mode 100644 index 000000000..42fa61762 --- /dev/null +++ b/tools/DrainNGENQueue/DrainNGenQueue.ps1 @@ -0,0 +1,39 @@ +# Script to force the .NET Framework optimization service to run at maximum speed. + +$isWin8Plus = [Environment]::OSVersion.Version -ge (new-object 'Version' 6,2) +$dotnetDir = [environment]::GetEnvironmentVariable("windir","Machine") + "\Microsoft.NET\Framework" +$dotnet2 = "v2.0.50727" +$dotnet4 = "v4.0.30319" + +$dotnetVersion = if (Test-Path ($dotnetDir + "\" + $dotnet4 + "\ngen.exe")) {$dotnet4} else {$dotnet2} + +$ngen32 = $dotnetDir + "\" + $dotnetVersion +"\ngen.exe" +$ngen64 = $dotnetDir + "64\" + $dotnetVersion +"\ngen.exe" +$ngenArgs = " executeQueuedItems" +$is64Bit = Test-Path $ngen64 + + +#32-bit NGEN -- appropriate for 32-bit and 64-bit machines +Write-Host("Requesting 32-bit NGEN") +Start-Process -wait $ngen32 -ArgumentList $ngenArgs + +#64-bit NGEN -- appropriate for 64-bit machines + +if ($is64Bit) { + Write-Host("Requesting 64-bit NGEN") + Start-Process -wait $ngen64 -ArgumentList $ngenArgs +} + +#AutoNGEN for Windows 8+ machines + +if ($isWin8Plus) { + Write-Host("Requesting 32-bit AutoNGEN -- Windows 8+") + schTasks /run /Tn "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319" +} + +#64-bit AutoNGEN for Windows 8+ machines + +if ($isWin8Plus -and $is64Bit) { + Write-Host("Requesting 64-bit AutoNGEN -- Windows 8+") + schTasks /run /Tn "\Microsoft\Windows\.NET Framework\.NET Framework NGEN v4.0.30319 64" +} diff --git a/tools/DrainNGENQueue/DrainNGenQueue.wsf b/tools/DrainNGENQueue/DrainNGenQueue.wsf new file mode 100644 index 000000000..abff566ca --- /dev/null +++ b/tools/DrainNGENQueue/DrainNGenQueue.wsf @@ -0,0 +1,117 @@ + + +