Visual Studio Icon Visual Studio 2017 Preview Release Notes

| Developer Community | System Requirements | Compatibility | Distributable Code | License Terms | Blogs | Known Issues |


This release is not "go-live" and not intended for use on production computers or for creating production code.

Click a button to download the newest preview version of Visual Studio 2017. For instructions on installing and updating Visual Studio 2017, see the Update Visual Studio 2017 to the most recent release documentation.

What's New in 15.8

The Visual Studio Blog is the official source of product insight from the Visual Studio Engineering Team. You can find in-depth information about the Visual Studio 15.8 releases in the following posts:

Visual Studio 2017 version 15.8 Preview Releases

Visual Studio 2017 version 15.8 Announcements

Known Issues

See all existing known issues and available workarounds in Visual Studio 2017 version 15.8.

Visual Studio 2017 Known Issues

The PowerShell tools component has been removed from Visual Studio setup. If you upgrade to Visual Studio update 8 preview 3 or later, the installed PowerShell tools is removed. If you want to continue using this component, install from Visual Studio gallery at PowerShell Tools for Visual Studio 2017.

Release Notes Icon Visual Studio 2017 version 15.8 Preview 1

released May 07, 2018

Summary of What's New in 15.8 Preview 1

New Features in 15.8 Preview 1

Issues Fixed in 15.8 Preview 1

These are the customer-reported issues addressed in this release. If you are looking for a specific customer-reported issue that has been fixed in 15.8 Preview 1, visit the Developer Community.

Details of What's New in 15.8 Preview 1


C++ Quick Info tooltips on macros now show what they expand to, rather than just their definition. This is particularly useful for complex macros that reference other macros as it clarifies what the macro identifier is replaced with by the preprocessor.

Visual Studio Web Tools

Library Manager is a new feature included in Visual Studio 2017. It helps you manage client-side libraries in your web projects.

Container Tools

In Visual Studio 15.8 Preview 1, we have added a new single project Docker container experience for ASP.NET Core web projects. This supplements the existing Docker Compose-based container tooling and provides a simpler, easier way to create, debug, and build Docker containers right from Visual Studio.

You can add Docker support when creating the project (Figure 1):

Enable Docker Support
(Figure 1) Enable Docker Support

Or, you can enable Docker support to an existing project through the project's context menu in Solution Explorer (Figure 2). Once you do this, Visual Studio creates a single Dockerfile in the project. You have the option to choose either Windows or Linux.

Add Docker Support
(Figure 2) Add Docker Support

Visual Studio also adds a debugger launch profile (Figure 3) for Docker so that the project can be debugged while running within a container.

Docker Launch Profile
(Figure 3) Docker Launch Profile

If you have a solution with multiple Docker projects, by default, only one container runs when you choose to start the solution. If you wish to run multiple containers simultaneously, you can right-click on the solution in Solution Explorer and select Set Startup Projects, then Multiple startup projects, and then set the Action drop-down to Start or Start without debugging for all projects that you want to run.

Once you have your containerized project running the way you want, you can right-click on the project and select Build Docker Image to build an image locally, when ready to push to Azure Container Registry or DockerHub.

You can also add the existing Docker Compose-based functionality to an ASP.NET Core web project through the new Container Orchestrator Support option (Figure 4). Right-click on the ASP.NET Core web project in Solution Explorer, select Add > Container Orchestrator Support, and then select Docker Compose from the drop-down menu.

Add Container Orchestrator Support
(Figure 4) Add Orchestration Support

Release Notes Icon Visual Studio 2017 version 15.8 Preview 1.1

released May 08, 2018

Issues Fixed in 15.8 Preview 1.1

  • This release provides a fix that reduces memory usage and GC pressure during solution load.

Release Notes Icon Visual Studio 2017 version 15.8 Preview 1 Security Advisory Notice

updated May 08, 2018

Microsoft Security Advisory for .NET Core Denial Of Service Vulnerability


Microsoft is releasing this security advisory to provide information about a vulnerability in .NET Core and .NET native version 2.0. This advisory also provides guidance on what developers can do to update their applications to remove this vulnerability.

Microsoft is aware of a denial of service vulnerability that exists when .NET Framework and .NET Core improperly process XML documents. An attacker who successfully exploited this vulnerability could cause a denial of service against a .NET Framework, .NET Core, or .NET native application.

The update addresses the vulnerability by correcting how .NET Framework, .NET Core, and .NET native applications handle XML document processing.

If your application is an ASP.NET Core application, developers are also advised to update to ASP.NET Core 2.0.8.

Release Notes Icon Visual Studio 2017 version 15.8 Preview 2

released May 31, 2018

Summary of What's New in 15.8 Preview 2

New Features in 15.8 Preview 2

Issues Fixed in 15.8 Preview 2

These are the customer-reported issues addressed in this release. If you are looking for a specific customer-reported issue that has been fixed in 15.8 Preview 2, visit the Developer Community.

Details of What's New in 15.8 Preview 2


You now have the option to download all installation files before starting your installation.

  • To use this new option, select the "Download all, then install" option in the installer (Figure 1). We suggest this option if you have a slower internet connection.
  • The default option remains "Install while downloading", which downloads and installs in parallel.
Download, then install option
(Figure 1) Download, then install option


We've added an option to disable reopening documents that were open in the previous session, as reopening certain types of files or designers can delay solution load.

  • Toggle this option in Tools > Options > Projects > Solutions > General.


When you have more than one instance of Visual Studio 2017 installed, you can now select which instance to deploy your extension to when debugging (Figure 2). That way you can develop in the e.g. the Visual Studio release channel while debugging in the preview channel.

Select your debug instance
(Figure 2) Select debug instance


You can now build Visual Studio extension (VSIX) projects using the Build Tools for Visual Studio 2017.

Performance Profiling (CPU Usage)

This release contains the following improvements to the CPU Usage tool of the Performance Profiler (available through ALT-F2):

  • The Call Tree view now displays asynchronous execution by logical call stack by default. You can turn off this behavior by unchecking the option "Stitch Async Code" in the Filter dropdown of the CPU Usage main view.
  • Added a Modules/Functions view which displays performance information by module (dll) and by function within a module. One can display the Modules/Functions view from the context menu available when selecting a function in the CPU Usage main view, or from the View dropdown in the Call Tree or Caller/Callee views.
  • Added 'instance indication' to the CPU Usage graph in the CPU Usage tool's main view. You can view the instances when a function is executing (for instance, on the stack) by double clicking a function listed in any of the CPU Usage views.


This release has the following updates and enhancements to C++:

  • Added Add > New Item template for generating a .clang-format file following the coding convention specified for ClangFormat in Tools > Options. If the Visual Studio convention is selected, the generated file tries to match the user's current Visual Studio formatting configuration from Tools > Options.
  • Updated the shipped clang-format.exe version to 6.0.0.
  • Templates to simplify adding configurations to CppProperties.json.

Visual Studio Tools for Xamarin

This release contains the following updates for Xamarin:

Hyper-V Android emulator support

This release contains a preview of the Google Android emulator that is compatible with Hyper-V which is available in the Windows 10 April 2018 Update (Figure 3). This enables you to use Google's Android emulator side-by-side with other Hyper-V based technologies, including Hyper-V virtual machines, Docker tooling, the HoloLens emulator, and more. Mobile app developers who use Hyper-V now have access to a fast Android emulator that always supports the latest Android APIs, works with Google Play Services out of the box, and supports all features of the Android emulator, including camera, geolocation, and Quick Boot.

Screenshot of both the Google Android emulator and HoloLens emulator running at the same time.
(Figure 3) Google Android Emulator and HoloLens emulator
Minimum support for Xamarin.Mac binding projects

We have added minimum support for Xamarin.Mac binding projects in Visual Studio 2017. This enables Visual Studio to load and recognize Xamarin.Mac binding projects as supported. You can also build Xamarin.Mac binding projects, however the build process is performed locally without using the native Mac tool chain so the generated IL assemblies cannot be used for running or debugging in apps.

F# and F# Tools

We focused on performance for F# tools when using .NET SDK-style projects and F# compiler fixes.

F# language
  • You can once again inherit from FSharpFunc. This was previously disabled in F# 4.1.
  • We fixed a bug where you could get an AccessViolationException with seq { } when using yield! with multiple collected sequences in release mode.
  • We fixed a bug in MailboxProcessor.TryReceive() where it could cause a spike in CPU usage on first invocation.
  • Enum pattern match warnings now print out a field name of an uncovered code, by John Wostenberg.
F# tools
  • We significantly improved the time to semantic colorization in newly-opened F# files in .NET SDK projects that are not using multi-targeting.
  • We significant improved IntelliSense performance for F# in .NET SDK projects that are not using multi-targeting.
  • Completion data in IntelliSense is now saved for up to two minutes, allowing descriptions in the tooltip to remain for up until that point per invocation.

Release Notes Icon Visual Studio 2017 version 15.8 Preview 3 New Release icon

released June 26, 2018

Summary of What's New in 15.8 Preview 3

New Features in 15.8 Preview 3

  • Visual Studio now offers .NET Framework 4.7.2 development tools to supported platforms with 4.7.2 runtime included.
  • We improved performance during project unload/reload and branch switching.
  • With added support for Azure Functions, you now have a new target host in the Configure Continuous Delivery to Azure dialog.
  • Git and TFS status now updates properly for external file changes in .NET Core projects.
  • We added new productivity features, such as code cleanup, invert-if refactoring, Go to Enclosing Block, Multi-Caret support, and new keyboard profiles.
  • C++ enhancements include Template IntelliSense, convert macro to constexpr lightbulbs, and experimental in-editor code analysis squiggles.
  • You can now use cross-language debugging with Python 3.7.0rc1.
  • Performance Profiling now offers the ability to pause/resume data collection and adds a new .NET Object Allocation Tracking tool.
  • We included improvements for Android incremental builds in the Xamarin support for Xcode 9.4.
  • The Build Tools now support Workflow.
  • Async autoload packages are delayed till startup and solution load complete

Issues Fixed in 15.8 Preview 3

These are the customer-reported issues addressed in this release. If you are looking for a specific customer-reported issue that has been fixed in 15.8 Preview 3, visit the Developer Community.

Visual Studio 2017 version 15.8 Preview 3 Security Advisory Notice

Microsoft Security Advisory for Git Security Vulnerability


We fixed a security vulnerability in Git that was disclosed by the Git community. The vulnerability can lead to arbitrary code execution when a user clones a malicious repository. This blog post has more information.

Details of What's New in 15.8 Preview 3

.NET Framework 4.7.2

Visual Studio 2017 version 15.8 now offers the .NET Framework 4.7.2 development tools to all supported platforms with the 4.7.2 runtime included. The .NET Framework 4.7.2 offers several new features and improvements as well as numerous reliability, stability, security, and performance fixes.

You can find more details about the .NET Framework 4.7.2 in these articles:


This release contains the following performance improvements:

  • Branch switching for C#, VB, and C++ projects is much faster for large solutions since solution reload is no longer required.
  • We have reduced the time to unload and reload a small set of C# and VB projects in large solutions from minutes to several seconds.

Performance Profiling

This release contains the following performance profiling enhancements:

  • We added the capability to start profiling paused:

    • The CPU Usage tool in the Performance Profiler (ALT-F2) can now start paused. This can be useful when it takes a while to get to a scenario worthy of a CPU Usage investigation. By starting the CPU usage collection disabled, the Performance Profiler will not collect any CPU usage sample stack data until it is specifically enabled. This makes the resultant amount of data much smaller to collect and analyze, thus making your performance investigations more efficient.
    • To start a session with CPU Usage sample collection disabled, click the settings (gear) icon next to the CPU Usage tool in the Performance Profiler launch page (Figure 1) to display the CPU Usage property page, then uncheck the checkbox labeled Enable CPU Profiling (Sampling). Finally, press OK to save the settings.
      CPU Usage Tool settings page
      (Figure 1) CPU Usage Tool Settings
    • Once you start the target application (by pressing the Start button in the Performance Profiler launch page), you'll see a monitoring display showing the CPU utilization graph (Figure 2) that allows you to control the CPU profiling. To enable CPU usage sample stack data collection, press the Enable CPU profiling link in the middle of the view, or click the Record CPU Profile button just below the CPU utilization graph. You can click the Record CPU Profile button to enable/disable sample data collection as many times as you like. The CPU utilization graph color changes to indicate whether sample collection is enabled/disabled at that point in time.
    CPU Usage Tool monitoring view
    (Figure 2) CPU Usage Tool Monitoring View
  • We added a .NET Object Allocation Tracking tool:

    • The .NET Object Allocation Tracking Tool joins the family of tools available from the Performance Profiler. Invoking this tool for a performance profiler session causes the collection of a stack trace for every .NET object allocation that occurs in the target application. This stack data is analyzed along with object type and size information to reveal details of the memory activity of your application. You can quickly determine the allocation patterns in your code and identify anomalies as well. In addition, for Garbage Collection (GC) events, one can easily determine which objects were collected and retained, quickly determining object types which dominate the memory usage of the application.
    • This is especially useful for API writers to help minimize allocations. A lot of applications will overrun the buffer limits involved in the diagnostics data collection, but small test applications exercising an API's key scenarios can be diagnosed quite well. While your test application is executing, the Performance Profiler displays a monitoring view with a line graph of Live Objects (count), as well as an Object Delta (% change) bar graph.
    • To use the .NET Object Allocation Tracking Tool, display the Performance Profiler launch page (Figure 3), select a target to profile (the default target is the startup project in the solution), check .NET Object Allocation Tracking from the list of available tools, then press the Start button.
    Performance Profiler launch page
    (Figure 3) Performance Profiler Launch Page


This release has the following updates and enhancements to C++:

  • We added a new quick-fix lightbulb to convert basic macros to constexpr as a new tool to modernize code.
  • You have a new, experimental, token-based preprocessor that conforms to C++11 standards (including C99 preprocessor features), enabled with /experimental:preprocessor switch. This is controlled with macro _MSVC_TRADITIONAL, which is defined 1 when using the traditional preprocessor and 0 when using the new experimental standards conformant preprocessor.
  • IntelliSense for templates provide you more details about template arguments to take full advantage of IntelliSense within your template body.
  • We added templates to simplify adding configurations to CMakeSettings.json.
  • We're working to refresh our code analysis experience. You can now enable the new, in-progress features under Tools > Options > Text Editor > C++ > Experimental > Code Analysis. Code analysis can run in the background when files are opened or saved and results are displayed in the error list and as green squiggles in the editor.
  • Just My Code now enables you to step-over code from system or 3rd party C++ libraries in addition to collapsing those calls in the call-stack window. You can control this behavior for any C++ libraries when your code is compiled with /JMC and the non-user libraries paths are specified in a .natjmc file. If the system library calls into user-code, when you step in, the debugger skips all system code and stops on the first line of user-code callback.
  • The Visual Studio Developer Command Prompt supports enabling the Visual C++ Spectre variant 1 mitigated runtimes (-vcvars_spectre_libs = spectre). More information about Spectre mitigations is available on the Visual C++ Team Blog.


You can now use mixed-mode (cross-language) debugging with Python 3.7.0rc1.

Visual Studio Tools for Xamarin

This release contains the following updates for Xamarin:

  • We added support for Xcode 9.4.
  • When you create a new Xamarin.Forms project, the default code sharing option is now .NET Standard. The shared project option is still available.
  • We added Android incremental build improvements. Xamarin.Android uses files generated in the intermediate output directory to achieve incremental builds that are faster than full builds. Previously, if you changed your project's target framework it would invalidate the files and result in a full build on the next run. In this release we now preserve the files in per-framework folders so you can switch between different target frameworks and still benefit from incremental builds. Cleaning the project allows you to reclaim the disk space used by the preserved files.
  • We also added templates for Xamarin.Essentials. Xamarin.Essentials is a core set of cross-platform APIs to help developers build native apps. This gives developers access to over thirty platform-specific APIs that can be accessed from their shared code. We include geolocation, secure storage, sensors, device information, and much more. Xamarin.Essentials can be used in any iOS, Android, UWP, or Xamarin.Forms app, regardless of how you create the user interface.


This release contains the following productivity enhancements:

  • You can perform additional code cleanup with Format Document (Ctrl + K, D or Ctrl + E, D) for C# development. Configure cleanup by going to Tools > Options > Text Editor > C# > Code Style > Formatting > General.
  • We added more refactorings and quick actions using Ctrl + . or Alt + Enter:
    • Invert If enables you to invert your logic in if-else statements. Place your cursor in the if keyword to trigger this refactoring.
    • Add parameter from method callsite allows you to add a parameter to a method by adding an argument to a method callsite and triggering Quick Actions and Refactorings.
    • Remove unnecessary parentheses removes parentheses around binary operators that are not essential for compilation. You can configure this style rule through Tools > Options > Text Editor > C# > Code Style > General or .editorconfig:
      • dotnet_style_parentheses_in_arithmetic_binary_operators
      • dotnet_style_parentheses_in_relational_binary_operators
      • dotnet_style_parentheses_in_other_binary_operators
      • dotnet_style_parentheses_in_other_operators
    • Use ternary conditionals in assignments and return statements can also be configured as a style rule in Tools > Options > ... or through .editorconfig:
      • dotnet_style_prefer_conditional_expression_over_assignment
      • dotnet_style_prefer_conditional_expression_over_return
  • We added new commands and improvements to the Go To All window:
    • Go to Enclosing Block (Ctrl + Alt + UpArrow) allows you to quickly navigate up to the beginning of the enclosing code block.
    • Go to Next/Previous Issue (Alt + PgUp/PgDn) allows you to skip to the next/previous issue (error, squiggle, lightbulb).
    • Go to Member (Ctrl + T, M) is now scoped to the file by default. You can change the default back to solution by toggling the Scope to Current Document (Ctrl + Alt + C).
  • You can now create insertion points and selections at multiple, arbitrary locations in a file with multiple caret support. This allows you to add, edit, or delete text in multiple places simultaneously.
    • Insert carets with Ctrl + Alt + LeftMouseClick.
    • Add a selection and caret at next location that matches current selection with Shift + Alt + Ins.
    • See Edit > Multiple Carets for full list of actions.
  • Access a contextual navigation menu with Alt + `.
  • Keep your keybindings consistent with two new keyboard profiles: Visual Studio Code and ReSharper (Visual Studio). You can find these schemes under Tools > Options > General > Keyboard and using the top drop-down menu.

Connected Services

You can now configure continuous delivery for Azure functions directly from Visual Studio 2017 for solutions with Azure Function Projects.

Delay loading of packages that autoload asynchronously

Visual Studio now delays the loading of asynchronous packages that are configured to autoload until after the Visual Studio IDE has fully started and the solution has loaded. This change does not affect synchronously autoloaded packages. Users can look at the Task Status Center in the lower left corner of the status bar to monitor progress. Extension authors that create asyncpackages should test their extension. For more information, see Improving the responsiveness of critical scenarios by updating auto load behavior for extensions.

Release Notes Icon Visual Studio 2017 version 15.8 Preview 4

released July 10, 2018

Summary of What's New in 15.8 Preview 4

This release contains the following improvements and enhancements:

Issues Fixed in 15.8 Preview 4

These are the customer-reported issues addressed in this release. If you are looking for a specific customer-reported issue that has been fixed in 15.8 Preview 4, visit the Developer Community.

Visual Studio 2017 version 15.8 Preview 4 Security Advisory Notices

updated July 10, 2018

Visual Studio Remote Code Execution Vulnerability


A remote code execution vulnerability that can lead to exploitation of a user's machine by opening a specially crafted project, or resource file. The security update addresses the vulnerability by correcting how Visual Studio checks the source markup of a file. For more information, see Microsoft Security Response Center article (CVE-2018-8172).

.NET Framework Remote Code Execution Vulnerability


A remote code execution vulnerability exists in .NET software which can lead to exploitation of a user's machine by allowing attackers to run arbitrary code in the context of the current user. The security update addresses the vulnerability by correcting how .NET checks the source markup of a file. For more information, see Microsoft Security Response Center article (CVE-2018-8260).

.NET Microsoft Macro Assembler Tampering Vulnerability


Tampering vulnerability related to the Microsoft Macro Assembler improperly validating code. The security update addresses the vulnerability by ensuring that Microsoft Macro Assembler properly validates code logic. For more information, see Microsoft Security Response Center article (CVE-2018-8232).

ASP.NET Core Security Feature Bypass Vulnerability


An ASP.NET Core Security Feature Bypass Vulnerability exists when the number of incorrect login attempts is not validated that can lead to an attacker trying infinite authentication attempts. The update addresses the vulnerability by validating the number of incorrect login attempts. For more information, see Microsoft Security Response Center (CVE-2018-8171).

Details of What's New in 15.8 Preview 4


This release has the following updates and enhancements to C++:

  • Two new additions to the SSA Optimizer focused on modern C++ code generation: redundant store elimination and folding of redundant branches.
  • Optimized memory mapped I/O performance in the linker to reduce link times.
  • C++ IntelliSense now responds to changes in the remote environment for both CMake and MSBuild projects targeting Linux. As you install new libraries or change your CMake projects, C++ IntelliSense will automatically parse the new headers files on the remote machine for a complete and seamless C++ editing experience.

Test Performance

We have significantly improved performance when running a few tests in a large solution with multiple test projects. In our labs, a solution with over 10,000 MSTests executed a single test up to 82% faster!

.NET Test Adapter Extension: breaking change and deprecation

  • Breaking Change: All test projects must include their .NET test adapter nuget reference in their csproj. If they do not, this test output will appear on the project if discovery by a test adapter extension is kicked off after a build or if the user tries to run the selected tests:
    • Test project {} does not reference any .NET NuGet adapter. Test discovery or execution might not work for this project. It is recommended to reference NuGet test adapters in each test project in the solution.
  • .NET test frameworks have been releasing their adapters in nuget packages and moving away from Visual Studio extensions. In Visual Studio 2017 Update 15.8 Preview 4, support for .NET test adapters delivered through extension is deprecated, but still supported. This means two new options will be available in Tools > Options > Test.
    • The first option allows Visual Studio to only use the test adapters it finds in the test assembly folder (populated by the test adapter nuget reference) or as specified in the runsettings file.
    • The second option allows Visual Studio to "fallback" to the old behavior and search for test adapter extensions for projects that do not have a test adapter nuget reference. Both options are checked by default so no default behavior will change in this release.
  • Note, non-.NET test adapters are not affected with this change.

Publish Improvements

This release contains the following publish improvements:

  • When publishing a Docker container to a container registry, you can now customize the tag for the image. You can either manually add a tag (default is "latest") or use an auto-generated tag to make sure each tag is unique.
  • When creating a new Azure App Service, you can also configure Application Insights to automatically collect telemetry. If you choose a region that also has Application Insights, it defaults to enabled. If you choose a region that does not yet contain Application Insights, you can manually specify a different region for your Application Insights resource from the dropdown.
  • When publishing Azure Functions projects you can choose to publish using the new Run-From-Zip feature.

Visual Basic Performance Improvement

Visual Basic now provides a significant performance improvement when using the pattern CInt(Fix(number)) to convert from non-integer types to integers.

Visual Studio Tools for Xamarin

The Xamarin.Forms Previewer now has toolbox support when using Xamarin.Forms version or higher. Xamarin.Forms controls will appear in the toolbox so they are more discoverable for those new to the toolkit. You can also drag and drop a control onto the XAML code editor to add the control to the page.

Release Notes Icon Visual Studio 2017 version 15.8 Preview 5 New Release icon

released July 26, 2018

Summary of What's New in 15.8 Preview 5

This release contains the following improvements and enhancements:

Issues Fixed in 15.8 Preview 5

These are the customer-reported issues addressed in this release. If you are looking for a specific customer-reported issue that has been fixed in 15.8 Preview 5, visit the Developer Community.

Details of What's New in 15.8 Preview 5

F# 4.5 and F# Tools for Visual Studio

We are introducing the preview of F# language version 4.5 with this release. This also corresponds with the new 4.5.x family of FSharp.Core (the F# core library). You can read the specs for each of these changes in the F# RFC repository. There are also many improvements to F# tools for Visual Studio with this release.

F# 4.5

Here are the some of the highlights with the F# language version 4.5 preview:

Span<'T> support

We implemented Span<'T> and related features so that effective consumption and production of APIs using Span, Memory, and ref-like constructs are possible with F#. The features for this include:

  • New voidptr type.
  • New NativePtr.ofVoidPtr and NativePtr.toVoidPtr functions in FSharp.Core.
  • New types inref<'T> and outref<'T>, which are readonly byrefs and write-only byrefs, respectively. This correspond to in ref and out ref in C#.
  • The ability to produce ByRefLike structs (such as Span and ReadOnlySpan).
  • The ability to produce IsReadOnly structs.
  • Implicit dereference of byref- and inref-returns from methods.
  • The ability to produce extension members on byref/inref/outref.

This feature set fixes a bug in the initial design of byref-returns in F# 4.1, where functions, methods, and properties returning byrefs were not implicitly dereferencing the return value. We make this change to bring the feature in-line with how C# handles ref-returns. An error message is used when a type annotation indicates that an implicit dereference of a ref-return is now used.

Additionally, this feature set also fixes a bug in the F# compiler where "Evil struct replacement" was possible; i.e., calling a method on an F# struct could replace the actual struct being called with a different one. The this parameter on a struct is now considered an inref<MyStruct>, with an error that suggests you add a mutable field if you wish to modify the struct.

You can learn more about span and ref-like constructs in the RFC for this feature set.

Match! in computation expressions

F# 4.5 introduces match!, a new keyword for use within computation expressions, contributed entirely by John Wostenberg. This syntactic sugar is equivalent to a let! followed by a match on the result. You can learn more in the RFC for match!.

Relaxing the need to upcast with yield in sequence, list, and array expressions

F# 4.5 now relaxes some cases where an upcast when using yield was required to convert a subtype into a supertype. This restriction was already not necessary for these expressions since F# 3.1 when not using yield, so this makes things more consistent with existing behavior. You can learn more in the RFC for this feature.

Permitting undentation on list and array brackets

F# 4.5 now relaxes the indentation rule for list and array brackets that required then to be indented one scope forward when on their own line. This previous requirement has always been quite confusing, especially for beginners to F#. Additionally, it is not required for F# sequence expressions. This now brings array and list expressions to the same consistent state as sequence expressions. You can learn more in the RFC for this feature.

Enum cases emitted as public

F# 4.5 now emits enumeration cases as public under all circumstances, to align with how C# emits enumeration cases. This also makes it easier for profiling tools to analyze logs from F# code, where the value rather than the label name was emitted. You can learn more in the RFC for this feature.

F# Compiler Improvements

We made improvements to the F# compiler in addition to the previously-mentioned language features. These features include:

  • We improved compiler performance work by removing up to 2.2% of all allocations in the F# compiler (under various scenarios).
  • A bug resulting in an AccessViolatioNException when using yield! with struct-based enumerables has been fixed.
  • It is now possible to inherit from FSharpFunc again.
  • Tail calls are disabled by default for debug builds of F# for .NET Core. They are enabled for release, thus matching the desktop F# compiler.
  • F# reference normalization has been fixed to allow you to control transitive assembly references written to an output file. This allows you to perform the equivalent of assembly redirection on .NET Core.
  • A bug has been fixed where the error message used when attempting to use dynamic invocation on inline functions was ignored. The error message now propagates.
  • F# now respects the WarningsNotAsErrors flag that you can set in project files.
  • The error message when branches of a pattern match do not return the same type has been updated to be much more friendlier by Isaac Abraham.
  • A bug where an internal error when compiling interface implementation that lacks an overloaded method implementation has been fixed by Steffen Forkmann.
  • Some unnecessary array copying in the lexing phase of the compiler has been removed by Gauthier Segay.
  • Incomplete pattern matches on F# enumerations now produces a detailed warning that gives an example of a case not covered, contributed by John Wostenberg.
  • `#nowarn "2003" is now respected, contributed by Matthias Diitrich.
  • A bug where consuming C# extensions methods could fail in F# overload resolution has been fixed by Steffen Forkmann.
  • An internal QueueList data structure bug was fixed by Steffen Forkmann.
  • Various smaller optimizations and code cleanup efforts were contributed by Steffen Forkmann, Eugene Auduchinok, and ncave.

F# Core Library 4.5.x

We made the following additions to the F# Core Library:

  • Significant work has been done to improve stack traces for async { } computation expressions. You should now be able to see user code and user line numbers in stack traces. You can learn more in the RFC for this feature.
  • FuncConvert.FromFunc and FuncConvert.FromAction APIs that type System.Func and System.Action overloads, to help in interoperation with C#. You can learn more in the RFC for this feature.
  • ValueOption is a new type available, which is the first in a set of future features ultimately aimed at better performance for Active Patterns. You can learn more in the RFC for this feature.
  • TryGetValue is now a new member on the F# Map type. You can learn more in the RFC for this feature.
  • We fixed High CPU usage upon the first invocation of MailboxProcessor.TryReceive.
  • Comparison for bool now uses fast generic comparison, contributed by Vasily Kirichenko.
  • The summary text for Array.allPairs has been updated to be correct, contributed by Patrick McDonald

F# Tooling Improvements

We made significant improvements in the F# tools, and as always, with a large number of contributions from the F# open source community. Here are the highlights:

  • We improved IntelliSense performance for .NET SDK-style projects of all forms, including those that use multi-targeting.
  • A community-driven effort to analyze and improve IntelliSense performance for very large files was contributed by Vasily Kirichenko, Steffen Forkmann, and Gauthier Segay. IntelliSense in very large files (10k+ lines of code) is roughly twice as fast now.
  • The warning for an outdated FSharp.Core (despite the package being installed) is no longer present in .NET SDK-style projects.
  • The description tooltip that displays XML documentation for a member after . in IntelliSense no longer times out after 10 seconds.
  • A bug where you could not set breakpoints in object constructor arguments has been fixed.
  • A bug where a renamed symbol would be duplicated when it is a generic parameter has been fixed.
  • Templates for .NET Framework (classic F# templates) now consume FSharp.Core from a NuGet package, to align with .NET SDK F# templates.
  • Automatic, transactional brace completion is now available for (), [], {}, [||], and [<>] brace pairs. We did this work in collaboration with Gibran Rosa.
  • You can now go to definition with Ctrl + Click on an F# symbol. The settings for this gesture are also respected in the Tools > Options window.
  • The IntelliSense performance UI has been modified to allow configuration of stale typecheck information for various IDE features. Explanations for each option are now present in tooltips for the settings.
  • Brace match highlighting now correctly highlights braces, completed in collaboration with Vasily Kirichenko.
  • Go to definition now navigates correctly when a type is defined recursively, contributed by Vasily Kirichenko.
  • A bug where an auto-imported namespace wasn't opened when the top of a file was empty has been fixed by Vasily Kirichenko.
  • A bug where printf specifiers that contained dots were miscolored has been fixed by Vasily Kirichenko.
  • A bug where all opens were considered unused inside of a recursive module has been fixed by Vasily Kirichenko.
  • The performance of the Unused Opens analyzer has been improved significantly by Vasily Kirichenko.
  • Autocompletion for attributes now only suggests options that are actually attributes, contributed by Vasily Kirichenko.
  • Signature Help tooltips are now generated for Type Provider static parameters at the constructor call site, contributed by Vasily Kirichenko.
  • A bug where value types used as units of measure were colored as reference types has been fixed by Vasily Kirichenko.
  • A bug where semantic colorization could disappear for some files while scrolling has been fixed by Vasily Kirichenko.
  • There is now an experimental CodeLens implementation, contributed by Victor Peter Rouven Müller. You can turn it on in Options > Text Editor > F# > Code Lens.
  • A bug where the F# compiler service would incorrectly elide the module names in XML documentation has been fixed by Sebastian Urban.
  • Code that uses Dictionary with ContainsKey and subsequent Item calls has been changed to use TryGetValue, by Eugene Auduchinok.
  • Jakob Majoka also contributed in the process of consuming a different API for Tooltips.

Infrastructure, Packaging, and Open Source Improvements

We made the following enhancements to infrastructure, packaging, and open source improvements:

  • The F# compiler distributed with Visual Studio no longer installs as a singleton in the F# Compiler SDK location. It is now fully side-by-side with Visual Studio, meaning that side-by-side installations of Visual Studio will finally have truly side-by-side F# tooling and language experiences.
  • The FSharp.Core NuGet package is now signed.
  • ETW logging has been added to the F# tools and compiler.
  • The very large control.fs/contro.fsi files in FSharp.Core have been split into async.fs/async.fsi, event.fs/event.fsi, eventmodule.fs/eventmodule.fsi, mailbox.fs/mailbox.fsi, and observable.fs/observable.fsi.
  • WE added .NET SDK-style versions of our project performance stress test artifacts.
  • We removed Newtonsoft.Json from our codebase, and you now have one less package downloaded for OSS contributors.
  • We now use the latest versions of System.Collections.Immutable and System.Reflection.Metadata.

ASP.NET .NET Framework Secrets Support

For ASP.NET .NET Framework projects that target .NET Framework 4.7.1 or higher, you can now open and store secrets you do not want in your source code in usersecrets.xml by right clicking on the project and selecting "Managed User Secrets".

Migrate Local Azure Function Settings

The "Managed Application Settings" dialog available from the publish summary page now displays values from your local.settings.json file and enables you to migrate values to your remote Azure Function app hosted in Azure.

Test Explorer Improvement

Test Explorer now displays a more informative test status summary pane (lower pane of test explorer) when one of the groupings in the hierarchy view is selected. The pane now displays how many tests failed, passed, or not run in that grouping.

New Extensibility Features

Language Server Protocol

Visual Studio now has native support for the Language Server Protocol. Extension authors can create extensions that communicate with existing language servers to add additional language support to Visual Studio. Extension users can install these extensions to start using their favorite language inside Visual Studio like Rust.

AsyncPackage Template

Extension authors can now use item templates to create AsyncPackages to optimize their extension's performance. Read our docs to learn more about how to use AsyncPackages.

Extension Packs

Easily share your favorite set of extensions or set up a new install of Visual Studio with all your extensions by using extension pack. Extension packs allow you to create a list of extensions, package them in an extension, and use it quickly to install those extensions in bulk.

Command Line Extension Publishing

Publish your extensions to the Visual Studio Marketplace using the command line.


We would love to hear from you! For issues, let us know through the Report a Problem option in the upper right-hand corner of either the installer or the Visual Studio IDE itself. The Feedback Icon icon is located in the upper right-hand corner. You can track your issues in the Visual Studio Developer Community, where you can ask questions and find answers. You can also make a product suggestion through UserVoice or get free installation help through our Live Chat support.


Take advantage of the insights and recommendations available in the Developer Tools Blogs site to keep you up-to-date on all new releases and include deep dive posts on a broad range of features.

Developer Tools Blogs

Visual Studio 2017 Release Notes History

For information relating to past versions of Visual Studio 2017, see the Visual Studio 2017 Release Notes History page.

Top of Page