{"id":41415,"date":"2022-08-09T10:03:18","date_gmt":"2022-08-09T17:03:18","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/dotnet\/?p=41415"},"modified":"2022-11-22T14:46:53","modified_gmt":"2022-11-22T21:46:53","slug":"announcing-dotnet-7-preview-7","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/dotnet\/announcing-dotnet-7-preview-7\/","title":{"rendered":"Announcing .NET 7 Preview 7"},"content":{"rendered":"<p>Today we released .NET 7 Preview 7. This is the last preview for .NET 7 and the next version will be our first release candidate (RC). The dates for <a href=\"https:\/\/dotnetconf.net\">.NET Conf 2022<\/a> have been announced! Join us November 8-10, 2022 to celebrate the .NET 7 release!<\/p>\n<p>Visual Studio 2022 17.3 also released today with GA support for .NET Multi-platform App UI (MAUI). Read the <a href=\"https:\/\/aka.ms\/maui\/vs-release\">.NET MAUI announcement<\/a> and tune into <a href=\"https:\/\/focus.dotnetconf.net\">.NET Conf: Focus on MAUI<\/a> that is live streaming now!<\/p>\n<p>This preview of .NET 7 includes improvements to System.LINQ, Unix file permissions, low-level structs, p\/Invoke source generation, code generation, and websockets.<\/p>\n<p>You can <a href=\"https:\/\/dotnet.microsoft.com\/download\/dotnet\/7.0\">download .NET 7 Preview 7<\/a>, for Windows, macOS, and Linux.<\/p>\n<ul>\n<li><a href=\"https:\/\/dotnet.microsoft.com\/download\/dotnet\/7.0\">Installers and binaries<\/a><\/li>\n<li><a href=\"https:\/\/mcr.microsoft.com\/catalog?search=dotnet\/\">Container images<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/core\/blob\/master\/release-notes\/7.0\/\">Linux packages<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/core\/tree\/master\/release-notes\/7.0\">Release notes<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/core\/blob\/main\/release-notes\/7.0\/known-issues.md\">Known issues<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/core\/issues\">GitHub issue tracker<\/a><\/li>\n<\/ul>\n<p>.NET 7 Preview 7 has been tested with Visual Studio 17.4 Preview 1. We recommend you use the <a href=\"https:\/\/visualstudio.com\/preview\">preview channel builds<\/a> if you want to try .NET 7 with Visual Studio family products. If you&#8217;re on macOS, we recommend using the latest <a href=\"https:\/\/visualstudio.microsoft.com\/vs\/mac\/preview\/\">Visual Studio 2022 for Mac preview<\/a>. Now, let&#8217;s get into some of the latest updates in this release.<\/p>\n<h2>Simplified ordering with <code>System.LINQ<\/code><\/h2>\n<p><a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/67194\">dotnet\/runtime#67194<\/a><\/p>\n<p><code>System.Linq<\/code> now has the methods <code>Order<\/code> and <code>OrderDescending<\/code>, which are there to order an <code>IEnumerable<\/code> according to <code>T<\/code>.<\/p>\n<p><code>IQueryable<\/code> also supports this now.<\/p>\n<blockquote><p>Note: This change does <em>not<\/em> introduce a new language feature to <code>System.Linq.Expressions<\/code>.<\/p><\/blockquote>\n<h3>Usage<\/h3>\n<p>Previously, you had to call <code>OrderBy<\/code>\/<code>OrderByDescending<\/code> by referencing the own value.<\/p>\n<pre><code class=\"language-csharp\">var data = new[] { 2, 1, 3 };\r\nvar sorted = data.OrderBy(static e =&gt; e);\r\nvar sortedDesc = data.OrderByDescending(static e =&gt; e);<\/code><\/pre>\n<p>Now, you can write:<\/p>\n<pre><code class=\"language-csharp\">var data = new[] { 2, 1, 3 };\r\nvar sorted = data.Order();\r\nvar sortedDesc = data.OrderByDescending();<\/code><\/pre>\n<h2>Support for Unix file modes<\/h2>\n<p><a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/69980\">dotnet\/runtime PR#69980<\/a><\/p>\n<p>Previously, .NET had no built-in support for getting and setting Unix file permissions, which control which users can read, write, and execute files and directories. P\/Invoking manually to syscalls isn&#8217;t always easy because some are exposed differently on different distros. For example, on Ubuntu you may have to pinvoke to <code>__xstat<\/code>, on RedHat to <code>stat<\/code>, and so on. This makes a first-class .NET API important.<\/p>\n<p>In Preview 7, we introduced a new enum:<\/p>\n<pre><code class=\"language-c#\">public enum UnixFileMode\r\n{\r\n    None,\r\n    OtherExecute, OtherWrite, OtherRead,\r\n    GroupExecute, GroupWrite, GroupRead,\r\n    UserExecute, UserWrite, UserRead,\r\n     ...\r\n}<\/code><\/pre>\n<p>and APIs <code>File.GetUnixFileMode<\/code> and <code>File.SetUnixFileMode<\/code> that get and set the file mode on either a path or a handle (file descriptors). As well as a new property on <code>FileInfo<\/code> and <code>DirectoryInfo<\/code> named <code>UnixFileMode<\/code>.<\/p>\n<p>There is also a new overload of <code>Directory.CreateDirectory<\/code> and a new property on <code>FileStreamOptions<\/code> to allow you to create a directory or file with a particular mode in one shot. Note that when you use these, <code>umask<\/code> is still applied, as it would if you created the directory or file in your shell.<\/p>\n<h3>Usage<\/h3>\n<pre><code class=\"language-C#\">\/\/ Create a new directory with specific permissions\r\nDirectory.CreateDirectory(\"myDirectory\", UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute);\r\n\r\n\/\/ Create a new file with specific permissions\r\nFileStreamOptions options = new()\r\n{\r\n    Access = FileAccess.Write,\r\n    Mode = FileMode.Create,\r\n    UnixCreateMode =  UnixFileMode.UserRead | UnixFileMode.UserWrite,\r\n};\r\nusing FileStream myFile = new FileStream(\"myFile\", options);\r\n\r\n\/\/ Get the mode of an existing file\r\nUnixFileMode mode = File.GetUnixFileMode(\"myFile\");\r\n\r\n\/\/ Set the mode of an existing file\r\nFile.SetUnixFileMode(\"myFile\", UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute);<\/code><\/pre>\n<p>See <a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/69980\/files#diff-cec8e6f471b4193246bdc0107b0dd7cbe131fb7fd189b288b37269c333d1171d\">all new Unix File Mode APIs<\/a>.<\/p>\n<p>A big thank you goes out to <a href=\"https:\/\/github.com\/tmds\">@tmds<\/a>, a long-term contributor from Red Hat, who proposed, designed, and implemented this feature.<\/p>\n<h2>Low-level <code>struct<\/code> improvements: <code>ref<\/code> field support<\/h2>\n<p>The .NET 7 runtimes now have full support for <code>ref<\/code> fields within <a href=\"https:\/\/docs.microsoft.com\/dotnet\/api\/system.type.isbyreflike\">ByRefLike<\/a> types (that is, <code>ref struct<\/code>). There was extensive language design behind this much requested feature that users can read about: <a href=\"https:\/\/github.com\/dotnet\/csharplang\/blob\/main\/proposals\/low-level-struct-improvements.md\">low-level struct improvements<\/a>. With this feature, types previously requiring specialized handling in the runtimes (for example, <code>Span&lt;T&gt;<\/code> and <code>ReadOnlySpan&lt;T&gt;<\/code>), can now be fully implemented in C#.<\/p>\n<h2><code>LibraryImport<\/code> P\/Invoke source generator<\/h2>\n<p><a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/60595\">dotnet\/runtime#60595<\/a><\/p>\n<p>The <code>LibraryImport<\/code> source generator is now available in a supported manner to all users. The culmination of more than 18 months this source generator is designed to be a drop-in replacement for the majority of <code>DllImport<\/code> uses, both in the runtime product and in user code. The .NET libraries have all adopted <code>LibraryImport<\/code> and have been shipping with source generated marshalling code since <a href=\"https:\/\/github.com\/dotnet\/core\/issues\/7106#issuecomment-1021816362\">.NET 7 Preview 1<\/a>.<\/p>\n<p>The source generator ships with the .NET 7 TFM and is readily available for consumption. In order to get the benefit of the source generated marshalling, replace usages of <code>DllImport<\/code> with <code>LibraryImport<\/code>. There are Analyzers and Fixers that can assist with this process.<\/p>\n<h3>Usage<\/h3>\n<p><strong>Before<\/strong><\/p>\n<pre><code class=\"language-csharp\">public static class Native\r\n{\r\n    [DllImport(nameof(Native), CharSet = CharSet.Unicode)]\r\n    public extern static string ToLower(string str);\r\n}<\/code><\/pre>\n<p><strong>After<\/strong><\/p>\n<pre><code class=\"language-csharp\">public static class Native\r\n{\r\n    [LibraryImport(nameof(Native), StringMarshalling = StringMarshalling.Utf16)]\r\n    public static partial string ToLower(string str);\r\n}<\/code><\/pre>\n<p>There is an analyzer and code-fix to automatically convert your <code>DllImport<\/code> attributes to <code>LibraryImport<\/code>. For Preview 7, it is opt-in. Add <code>dotnet_diagnostic.SYSLIB1054.severity = suggestion<\/code> to your EditorConfig file to enable the conversion analyzer as a diagnostic.<\/p>\n<p>Design documentation and details on marshalling custom types can be found under <a href=\"https:\/\/github.com\/dotnet\/runtime\/tree\/main\/docs\/design\/libraries\/LibraryImportGenerator\"><code>docs\/design\/libraries\/LibraryImportGenerator<\/code><\/a>.<\/p>\n<h2>ClientWebSocket upgrade response details<\/h2>\n<p><a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/25918\">dotnet\/runtime#25918<\/a><\/p>\n<p><code>ClientWebSocket<\/code> previously did not provide any details about upgrade response. However, the information about response headers and status code might be important in both failure and success scenarios.<\/p>\n<p>In case of failure, the status code can help to distinguish between retriable and non-retriable errors (server doesn&#8217;t support web sockets at all vs. just a tiny transient error). Headers might also contain additional information on how to handle the situation.<\/p>\n<p>The headers are also helpful even in case of a successful web socket connect, e.g., they can contain a token tied to a session, some info related to the subprotocol version, or the server can go down soon, etc.<\/p>\n<h3>Usage<\/h3>\n<pre><code class=\"language-C#\">ClientWebSocket ws = new();\r\nws.Options.CollectHttpResponseDetails = true;\r\ntry\r\n{\r\n    await ws.ConnectAsync(uri, default);\r\n    \/\/ success scenario\r\n    ProcessSuccess(ws.HttpResponseHeaders);\r\n    ws.HttpResponseHeaders = null; \/\/ clean up (if needed)\r\n}\r\ncatch (WebSocketException)\r\n{\r\n    \/\/ failure scenario\r\n    if (ws.HttpStatusCode != null)\r\n    {\r\n        ProcessFailure(ws.HttpStatusCode, ws.HttpResponseHeaders);\r\n    }\r\n}<\/code><\/pre>\n<h2>Improvements in CodeGen<\/h2>\n<p>Many thanks to JIT community contributors for these community PRs!<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/MichalPetryka\">@MichalPetryka<\/a> fixed the issue <a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/71632\">#71632<\/a> in <a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/71633\">PR #71633<\/a> Make getTypeForPrimitiveValueClass treat different signs as different types.<\/li>\n<li><a href=\"https:\/\/github.com\/shushanhf\">@shushanhf<\/a> made <a href=\"https:\/\/github.com\/dotnet\/runtime\/pulls?q=is%3Apr+is%3Aclosed+label%3Aarea-CodeGen-coreclr+closed%3A2022-06-23..2022-07-11+author%3Ashushanhf+\">2 fixes<\/a> in LoongArch64.<\/li>\n<li><a href=\"https:\/\/github.com\/singleaccretion\">@singleaccretion<\/a> made <a href=\"https:\/\/github.com\/dotnet\/runtime\/pulls?q=is%3Apr+is%3Aclosed+label%3Aarea-CodeGen-coreclr+closed%3A2022-06-23..2022-07-11+author%3Asingleaccretion+\">20 PR contributions<\/a> during Preview 7.<\/li>\n<li><a href=\"https:\/\/github.com\/SkiFoD\">@SkiFoD<\/a> optimized to use Min\/Max intrinsics if one of arguments is constant (<a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/69434\">PR #69434<\/a>).<\/li>\n<li>For <strong>Arm664<\/strong>, <a href=\"https:\/\/github.com\/a74nh\">@a74nh<\/a> implemented the first part of <a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/67894\">#67894<\/a> in <a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/71616\">PR #71616<\/a> that generates csel and ccmp for conditional comparison and selection instructions (issue <a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/55364\">#55364<\/a>).<\/li>\n<\/ul>\n<h3>Loop Optimizations<\/h3>\n<p>In preview 7, we made several improvements on Loop Optimizations.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/71184\">PR #71184<\/a> strengthens checking of the loop table for better loop integrity checks as described in <a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/71084\">#71084<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/71868\">PR #71868<\/a> Do not compact blocks around loops<\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/71659\">PR #71659<\/a> Adjust weights of blocks with profile inside loops in non-profiled methods<\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/71504\">PR #71504<\/a> Improvements to loop hoisting<\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/70271\">PR #70271<\/a> optimized multi-dimensional array access. It improved the latency by up to 67% (<a href=\"https:\/\/github.com\/dotnet\/perf-autofiling-issues\/issues\/6721\">Performance Link<\/a>).<\/li>\n<\/ul>\n<p>In addition, Hot\/Cold splitting is enabled for Exception Handling funclets in <a href=\"https:\/\/github.com\/dotnet\/runtime\/pull\/71236\">PR #71236<\/a>.<\/p>\n<h2>Contributor spotlight: Hugh Bellamy<\/h2>\n<p>A huge &#8220;Thank you&#8221; goes out to all our community members. We deeply appreciate your thoughtful contributions. We asked contributor <a href=\"https:\/\/github.com\/hughbe\">@hughbe<\/a> to share his thoughts.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2022\/08\/bellamy.jpg\"><img decoding=\"async\" class=\"alignleft size-medium wp-image-41414\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2022\/08\/bellamy-300x279.jpg\" alt=\"Image bellamy jpg\" width=\"300\" height=\"279\" srcset=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2022\/08\/bellamy-300x279.jpg 300w, https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2022\/08\/bellamy-768x714.jpg 768w, https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2022\/08\/bellamy.jpg 990w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>In Hugh&#8217;s own words:<\/p>\n<p>The first application I ever developed was as a young teen. Although &#8220;Hughser&#8221;, a C# wrapping the WebBrowser component, unfortunately did not prove to win the browser wars, .NET was my first window into the world of software development. After a few years developing apps for iOS, I regained interest in .NET when roslyn, corefx and coreclr were open-sourced. I was excited by the opportunity to look inside the black box and see how the SDK I used actually worked. My first PR in November 2015 was to clean up and add tests for various methods on System.String. (Anyone who has taken a look at my contribution history is well aware that cleaning up, improving and adding tests became something of a specialty of mine!). I soon gained confidence contributing and became one of the most active contributors to .NET open source. I&#8217;ve now contributed to a variety of .NET Foundation projects, including corefx\/coreclr\/runtime, roslyn, xunit, mono, wpf and winforms. A highlight of my time contributing was definitely when I was flown out to Seattle for the Microsoft Build Conference 2019 by Microsoft to meet the team and get a shoutout at the .NET Keynote! I&#8217;ve also been awarded three consecutive Microsoft MVP Awards for my contributions, which I&#8217;m very proud of.<\/p>\n<p>In the past, my contributions to .NET helped me secure an internship as a Junior Developer as a teenager. I currently work as an Management Consultant specializing in Financial Services Data &amp; Analytics. Although I have less time nowadays than I did at school and university, I still follow the .NET open source ecosystem keenly and maintain several .NET open source projects on GitHub under the username <a href=\"https:\/\/github.com\/hughbe\">@hughbe<\/a>. Coding and open source has always been a hobby of mine, but also something I&#8217;ve enjoyed integrating with my work. . As a Politics undergrad, I&#8217;m interested in how technology can be used in a political and social context. For example, as an intern at an NGO in Cambodia, I developed a Facebook scraping platform in .NET, parts of which I open sourced. The platform was used to provide insights into public political engagement to journalists, opposition parties and civil society. At the moment, I&#8217;m developing a prototype platform leveraging .NET to scrape public media sources, including Telegram, to assist in the gathering of Open Source Intelligence (OSINT) relating to the Ukrainian War.<\/p>\n<p>Contributing to .NET has been an incredible experience &#8211; as a teenager I was remotely working with people who I would never have otherwise crossed paths with, on an almost daily basis. The team at Microsoft, as well as the rest of the open source community, are extremely accommodating, insightful and happy to be challenged. There are so many ways to get started, be it <a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\">submitting or reviewing issues<\/a>, documentation and PRs, so <a href=\"https:\/\/github.com\/dotnet\/runtime\/blob\/main\/CONTRIBUTING.md\">get started today<\/a>!<\/p>\n<h2>Targeting .NET 7<\/h2>\n<p>To target .NET 7, you need to use a .NET 7 Target Framework Moniker (TFM) in your project file. For example:<\/p>\n<pre><code class=\"language-xml\">&lt;TargetFramework&gt;net7.0&lt;\/TargetFramework&gt;<\/code><\/pre>\n<p>The full set of .NET 7 TFMs, including operating-specific ones follows.<\/p>\n<ul>\n<li><code>net7.0<\/code><\/li>\n<li><code>net7.0-android<\/code><\/li>\n<li><code>net7.0-ios<\/code><\/li>\n<li><code>net7.0-maccatalyst<\/code><\/li>\n<li><code>net7.0-macos<\/code><\/li>\n<li><code>net7.0-tvos<\/code><\/li>\n<li><code>net7.0-windows<\/code><\/li>\n<\/ul>\n<p>We expect that upgrading from .NET 6 to .NET 7 should be straightforward. Please report any breaking changes that you discover in the process of testing existing apps with .NET 7.<\/p>\n<h2>Support<\/h2>\n<p>.NET 7 is a <strong>Standard Term Support (STS)<\/strong> release, meaning it will receive free support and patches for 18 months from the release date. It&#8217;s important to note that the quality of all releases is the same. The only difference is the length of support. For more about .NET support policies, see the <a href=\"https:\/\/dotnet.microsoft.com\/platform\/support\/policy\/dotnet-core\">.NET and .NET Core official support policy<\/a>.<\/p>\n<p>We recently changed the &#8220;Current&#8221; name to &#8220;Standard Term Support (STS)&#8221;. We&#8217;re in the <a href=\"https:\/\/github.com\/dotnet\/core\/pull\/7517\">process of rolling out that change<\/a>.<\/p>\n<h2>Breaking changes<\/h2>\n<h3>Trimming and NativeAOT: All assemblies trimmed by default<\/h3>\n<p>To better align with user expectations and produce smaller and more efficient apps, trimming now trims all assemblies in console apps by default. This change only affects apps that are published with <code>PublishTrimmed=true<\/code>, and it only affects apps that had existing trim warnings. It also only affects plain .NET apps that don&#8217;t use the Windows Desktop, Android, iOS, WASM, or ASP.NET SDK.<\/p>\n<h4>Previous behavior<\/h4>\n<p>Previously, only assemblies that were opted-in with <code>&lt;IsTrimmable&gt;true&lt;\/IsTrimmable&gt;<\/code> in the library project file were trimmed.<\/p>\n<h4>New behavior<\/h4>\n<p>Starting in .NET 7, trimming trims all the assemblies in the app by default. Apps that may have previously worked with <code>PublishTrimmed<\/code> may not work in .NET 7. However, only apps with trim warnings will be affected. If your app has no trim warnings, the change in behavior should not cause any adverse affects, and will likely decrease the app size.<\/p>\n<p>For example, an app that uses <code>Newtonsoft.Json<\/code> or <code>System.Text.Json<\/code> without source generation to serialize and deserialize a type in the user project may have functioned before the change, because types in the user project were fully preserved. However, one or more trim warnings (warning codes <code>ILxxxx<\/code>) would have been present. Now, types in the user project are trimmed, and serialization may fail or produce unexpected results.<\/p>\n<p>If your app did have trim warnings, you may see changes in behavior or exceptions. For example, an app that uses <code>Newtonsoft.Json<\/code> or <code>System.Text.Json<\/code> without source generation to serialize and deserialize a type in the user project may have functioned before the change, because types in the user project were fully preserved. However, one or more trim warnings (warning codes <code>ILxxxx<\/code>) would have been present. Now, types in the user project are trimmed, and serialization may fail or produce unexpected results.<\/p>\n<h4>Recommended action<\/h4>\n<p>The best resolution is to resolve all the trim warnings in your application. To revert to the previous behavior, set the <code>TrimMode<\/code> property to <code>partial<\/code>, which is the pre-.NET 7 behavior.<\/p>\n<pre><code class=\"language-xml\">&lt;TrimMode&gt;partial&lt;\/TrimMode&gt;<\/code><\/pre>\n<p>The default .NET 7+ value is <code>full<\/code>:<\/p>\n<pre><code class=\"language-xml\">&lt;TrimMode&gt;full&lt;\/TrimMode&gt;<\/code><\/pre>\n<h3>Other breaking changes<\/h3>\n<p>You can find the most recent list of breaking changes in .NET 7 by reading the <a href=\"https:\/\/docs.microsoft.com\/dotnet\/core\/compatibility\/7.0\">Breaking changes in .NET 7<\/a> document. It lists breaking changes by area and release with links to detailed explanations.<\/p>\n<p>To see what breaking changes are proposed but still under review, follow the <a href=\"https:\/\/github.com\/dotnet\/core\/issues\/7131\">Proposed .NET Breaking Changes GitHub issue<\/a>.<\/p>\n<h2>Roadmaps<\/h2>\n<p>Releases of .NET include products, libraries, runtime, and tooling, and represent a collaboration across multiple teams inside and outside Microsoft. You can learn more about these areas by reading the product roadmaps:<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/dotnet\/aspnetcore\/issues\/39504\">ASP.NET Core 7 and Blazor Roadmap<\/a><\/li>\n<li><a href=\"https:\/\/docs.microsoft.com\/ef\/core\/what-is-new\/ef-core-7.0\/plan\">EF 7 Roadmap<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/machinelearning\/blob\/main\/ROADMAP.md\">ML.NET<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/maui\/wiki\/Roadmap\">.NET MAUI<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/winforms\/blob\/main\/docs\/roadmap.md\">WinForms<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/wpf\/blob\/main\/roadmap.md\">WPF<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/NuGet\/Home\/issues\/11571\">NuGet<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/roslyn\/blob\/main\/docs\/Language%20Feature%20Status.md\">Roslyn<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/core\/blob\/main\/roadmap.md\">Runtime<\/a><\/li>\n<\/ul>\n<h2>Closing<\/h2>\n<p>We appreciate and <a href=\"https:\/\/dotnet.microsoft.com\/thanks\">thank you<\/a> for your all your support and contributions to .NET. Please <a href=\"https:\/\/dotnet.microsoft.com\/download\/dotnet\/7.0\">give .NET 7 Preview 7 a try<\/a> and tell us what you think!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>.NET 7 Preview 7 is now available with improvements to System.LINQ, Unix file permissions, low-level structs, p\/Invoke source generation, code generation, and websockets.<\/p>\n","protected":false},"author":368,"featured_media":41416,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[685],"tags":[4,30,7265],"class_list":["post-41415","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","tag-net","tag-announcement","tag-announcements"],"acf":[],"blog_post_summary":"<p>.NET 7 Preview 7 is now available with improvements to System.LINQ, Unix file permissions, low-level structs, p\/Invoke source generation, code generation, and websockets.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/41415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/users\/368"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/comments?post=41415"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/posts\/41415\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media\/41416"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/media?parent=41415"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/categories?post=41415"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet\/wp-json\/wp\/v2\/tags?post=41415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}