{"id":517,"date":"2023-11-05T21:28:39","date_gmt":"2023-11-06T05:28:39","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/?p=517"},"modified":"2024-05-16T18:22:57","modified_gmt":"2024-05-17T01:22:57","slug":"net-8-rc2%e7%8e%b0%e5%b7%b2%e6%8e%a8%e5%87%ba","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/net-8-rc2%e7%8e%b0%e5%b7%b2%e6%8e%a8%e5%87%ba\/","title":{"rendered":".NET 8 RC2\u73b0\u5df2\u63a8\u51fa"},"content":{"rendered":"<p style=\"text-align: center;\"><em>\u672c\u7bc7\u7ffb\u8bd1\u4e8eJon Douglas\u7684<a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/announcing-dotnet-8-rc2\/\">Announcing .NET 8 Release Candidate 2<\/a><\/em><\/p>\n<p>.NET 8 RC2 \u73b0\u5df2\u63a8\u51fa\u3002\u8fd9\u662f\u6211\u4eec\u6700\u540e\u4e00\u4e2a\u5019\u9009\u7248\u672c\u3002\u6b64\u7248\u672c\u5305\u542b .NET \u5305\u7684\u65b0 NuGet \u5305\u81ea\u8ff0\u6587\u4ef6\u3001\u9002\u7528\u4e8e MSBuild \u7684\u57fa\u4e8e CLI \u7684\u7b80\u5355\u9879\u76ee\u8bc4\u4f30\u3001\u5c06\u5bb9\u5668\u53d1\u5e03\u5230 tar.gz \u5b58\u6863\u4ee5\u53ca\u9002\u7528\u4e8e .NET \u7684 Tensor Primitives\u7b49\u5185\u5bb9\u3002<\/p>\n<p><a href=\"https:\/\/www.dotnetconf.net\/\">.NET Conf 2023<\/a>\u7684\u65e5\u671f\u5df2\u516c\u5e03\uff01\u8bf7\u4e8e2023 \u5e74 11 \u6708 14 \u65e5\u81f3 16 \u65e5\u540c\u6211\u4eec\u4e00\u8d77\u5e86\u795d.NET 8 \u53d1\u5e03\u4f1a\u7684\u5f00\u5e55\uff01<\/p>\n<p>\u4e0b\u8f7d\u9002\u7528\u4e8e Linux\u3001macOS \u548c Windows \u7684<a href=\"https:\/\/dotnet.microsoft.com\/en-us\/download\/dotnet\/8.0\">.NET 8 RC2<\/a> \u3002<\/p>\n<ul>\n<li><a href=\"https:\/\/dotnet.microsoft.com\/en-us\/download\/dotnet\/8.0\">\u5b89\u88c5\u7a0b\u5e8f\u548c\u4e8c\u8fdb\u5236\u6587\u4ef6<\/a><\/li>\n<li><a href=\"https:\/\/hub.docker.com\/_\/microsoft-dotnet-aspnet\/\">\u5bb9\u5668\u955c\u50cf<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/core\/tree\/main\/release-notes\/8.0\">\u53d1\u884c\u8bf4\u660et<\/a><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/core\/compatibility\/8.0?toc=%2Fdotnet%2Ffundamentals%2Ftoc.json&amp;bc=%2Fdotnet%2Fbreadcrumb%2Ftoc.json\">\u91cd\u5927\u66f4\u6539<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/core\/blob\/main\/release-notes\/8.0\/known-issues.md\">\u5df2\u77e5\u7684\u95ee\u9898<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/core\/issues\">GitHub \u95ee\u9898\u8ddf\u8e2a<\/a><\/li>\n<\/ul>\n<blockquote><p>\u26a0\ufe0f\u91cd\u8981\u63d0\u793a: \u7531\u4e8e Razor \u5de5\u5177\u5b58\u5728\u4f9d\u8d56\u6027\u9519\u8bef\uff0c.NET SDK 8.0.100-rc.2\u5fc5\u987b\u4e0e Visual Studio 17.8 Preview 3 \u4e00\u8d77\u4f7f\u7528\u3002\u66f4\u591a\u8be6\u60c5\u8bf7\u53c2\u9605 <a href=\"https:\/\/github.com\/dotnet\/sdk\/issues\/35810\">SDK \u516c\u544a<\/a>\u3002<\/p><\/blockquote>\n<p>\u60a8\u8fd8\u53ef\u4ee5\u67e5\u770b\u53e6\u5916\u4e00\u4e9b\u4ee4\u4eba\u5174\u594b\u7684\u5185\u5bb9\uff1a<\/p>\n<ul>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/asp-net-core-updates-in-dotnet-8-rc-2\/\">.NET 8 RC2 \u4e2d\u7684NET Core \u66f4\u65b0<\/a><\/li>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/announcing-dotnet-maui-in-dotnet-8-rc-2\/\">.NET 8 RC2 \u4e2d\u7684 .NET MAUI \u66f4\u65b0<\/a><\/li>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/visualstudio\/visual-studio-2022-17-8-preview-3-is-here\/\">Visual Studio 2022 17.8 Preview 3<\/a><\/li>\n<li><a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/announcing-ef8-rc2\/\">.NET 8 RC2 \u4e2d\u7684Entity Framework\u66f4\u65b0<\/a><\/li>\n<li><a href=\"https:\/\/learn.microsoft.com\/en-us\/dotnet\/core\/whats-new\/dotnet-8\">.NET 8 \u7684\u65b0\u589e\u529f\u80fd<\/a> \u5c55\u793a\u4e86 .NET 8 \u4e2d\u7684\u6240\u6709\u65b0\u529f\u80fd\u3002\u5982\u679c\u60f3\u8981\u66f4\u5168\u9762\u7684\u4e86\u89e3\u8fd9\u4e2a\u5e73\u53f0\uff0c\u8bf7\u9605\u8bfb<a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/why-dotnet\/\">\u4e3a\u4ec0\u4e48\u9009\u62e9 .NET\uff1f<\/a>\u3002<\/li>\n<\/ul>\n<h2><strong>.NET <\/strong><strong>\u5e93\u7684\u65b0\u5305\u81ea\u8ff0\u6587\u4ef6<\/strong><\/h2>\n<p>\u5305\u4f7f\u7528\u8005\u9762\u4e34\u7684\u6700\u5927\u4f7f\u7528\u95ee\u9898\u662f\u7f3a\u4e4f\u6587\u6863\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u6b63\u5728\u52aa\u529b\u63d0\u9ad8 NuGet \u5305\u81ea\u8ff0\u6587\u4ef6\u7684\u91c7\u7528\u7387\u548c\u8d28\u91cf\u3002<\/p>\n<p>\u81ea\u8ff0\u6587\u4ef6\u662f\u5305\u7684\u91cd\u8981\u7ec4\u6210\u90e8\u5206\uff0c\u56e0\u4e3a\u5b83\u4e3a\u7528\u6237\u63d0\u4f9b\u4e86\u91cd\u8981\u4fe1\u606f\uff0c\u5e76\u5e2e\u52a9\u4ed6\u4eec\u5feb\u901f\u4e86\u89e3\u5305\u662f\u4ec0\u4e48\u4ee5\u53ca\u5b83\u7684\u7528\u9014\u3002\u53e6\u5916\uff0c\u7528\u6237\u5728 NuGet.org \u4ee5\u53ca\u5176\u4ed6\u5de5\u5177\u4e0a\u67e5\u770b\u5305\u65f6\u9996\u5148\u8981\u505a\u7684\u4e8b\u60c5\u5c31\u662f\u67e5\u770b\u81ea\u8ff0\u6587\u4ef6\u3002\u5bf9\u4e8e\u5305\u4f5c\u8005\u6765\u8bf4\uff0c\u4e3a\u4ed6\u4eec\u7684\u5305\u7f16\u5199\u5e76\u5305\u542b\u9ad8\u8d28\u91cf\u7684\u81ea\u8ff0\u6587\u4ef6\u81f3\u5173\u91cd\u8981\u3002<\/p>\n<p>\u73b0\u5728\u6709\u4ee5\u4e0b Microsoft \u5305\u7684\u81ea\u8ff0\u6587\u4ef6\uff1a<\/p>\n<table>\n<tbody>\n<tr>\n<td width=\"312\">\u5305<\/td>\n<td width=\"312\">\u72b6\u6001<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.DependencyInjection<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Logging<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.DependencyInjection.Abstractions<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Hosting<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Hosting.WindowsServices<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Logging.Abstractions<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Http<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.IO.Ports<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.Data.OleDb<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Options<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.Management<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Options.ConfigurationExtensions<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Caching.Memory<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Logging.Console<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Hosting.Abstractions<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.Text.Encoding.CodePages<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Bcl.AsyncInterfaces<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.DirectoryServices.AccountManagement<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.Speech<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.DirectoryServices<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Logging.Debug<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.Net.Http.Json<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.Data.Odbc<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Primitives<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Bcl.Numerics (new package)<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Bcl.TimeProvider (new package)<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Configuration<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Configuration.Abstractions<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Configuration.Binder<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">Microsoft.Extensions.Logging.EventLog<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.Diagnostics.EventLog<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.Net.Http.WinHttpHandler<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.Text.Json<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<tr>\n<td width=\"312\">System.Threading.Channels<\/td>\n<td width=\"312\">\u2705<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><strong>MSBuild<\/strong><strong>\uff1a\u57fa\u4e8e<\/strong><strong> CLI <\/strong><strong>\u7684\u7b80\u5355\u9879\u76ee\u8bc4\u4f30<\/strong><\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/dotnet\/msbuild\/issues\/3911#issuecomment-1478468822\">Issue<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/msbuild\/pull\/9138\">PR<\/a><\/li>\n<\/ul>\n<p>MSBuild \u662f\u4e00\u4e2a\u975e\u5e38\u5f3a\u5927\u7684\u5e73\u53f0\uff0c\u975e\u5e38\u64c5\u957f\u5c06\u5176\u4ed6\u751f\u6001\u7cfb\u7edf\u7684\u6570\u636e\u548c\u5de5\u5177\u96c6\u6210\u5230\u5b83\u7684\u4e16\u754c\u89c2\u4e2d\u3002\u5b83\u5386\u6765\u90fd\u4e0d\u592a\u64c5\u957f\u5411\u66f4\u5e7f\u6cdb\u7684\u811a\u672c\u548c\u5de5\u5177\u4e16\u754c\u63d0\u4f9b\u5b83\u6240\u62e5\u6709\u7684\u6570\u636e\u3002\u5728\u8fc7\u53bb\uff0c\u5de5\u5177\u4f5c\u8005\u5fc5\u987b\u6267\u884c\u4e00\u4e9b\u64cd\u4f5c\uff0c\u4f8b\u5982\u6ce8\u5165\u81ea\u5df1\u7684 MSBuild \u4ee3\u7801\u8bfb\u53d6\u67d0\u4e9b\u5c5e\u6027\u3001\u9879\u76ee\u6216\u76ee\u6807\u8f93\u51fa\u5230\u6587\u4ef6\u4e2d\uff0c\u7136\u540e\u89e3\u6790\u8fd9\u4e9b\u6587\u4ef6\u3002\u8fd9\u9879\u5de5\u4f5c\u975e\u5e38\u5bb9\u6613\u51fa\u9519\u3002\u5728 .NET 8 \u4e2d\uff0cMSBuild \u56e2\u961f\u63d0\u4f9b\u4e86\u4e00\u9879\u65b0\u529f\u80fd\uff0c\u53ef\u4ee5\u66f4\u8f7b\u677e\u5730\u5c06 MSBuild \u4e2d\u7684\u6570\u636e\u5408\u5e76\u5230\u811a\u672c\u6216\u5de5\u5177\u4e2d\u3002\u8ba9\u6211\u4eec\u770b\u4e00\u4e2a\u793a\u4f8b\u8fdb\u884c\u4e86\u89e3\u3002<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-shell prettyprinted\"><span class=\"pun\">&gt;<\/span><span class=\"pln\">dotnet publish <\/span><span class=\"pun\">--<\/span><span class=\"pln\">getProperty<\/span><span class=\"pun\">:<\/span><span class=\"typ\">OutputPath<\/span><span class=\"pln\">\r\nbin\\Release\\net8<\/span><span class=\"pun\">.<\/span><span class=\"lit\">0<\/span><span class=\"pln\">\\<\/span><\/code><\/pre>\n<p>\u5728\u8fd9\u4e2a\u7b80\u5355\u7684\u793a\u4f8b\u4e2d\uff0c\u5728\u8fd0\u884c<span style=\"color: #ff0000;\">publish<\/span>\u547d\u4ee4\u540e\uff0c\u6211\u4eec\u4f7f\u7528 <span style=\"color: #ff0000;\">&#8211;getProperty<\/span> \u8bf7\u6c42 <span style=\"color: #ff0000;\">OutputPath<\/span> \u5c5e\u6027\u7684\u503c\uff0c MSBuild \u5df2\u5c06\u5355\u4e2a\u5c5e\u6027\u7684\u503c\u5199\u5165\u6211\u7684\u7ec8\u7aef\u7684\u6807\u51c6\u8f93\u51fa\u4e2d\u3002\u8fd9\u5bf9\u4e8e CI \u7ba1\u9053\u4e4b\u7c7b\u7684\u5de5\u5177\u975e\u5e38\u6709\u7528\uff0c\u4ee5\u524d\u60a8\u53ef\u80fd\u9700\u8981\u786c\u7f16\u7801\u8f93\u51fa\u8def\u5f84\uff0c\u73b0\u5728\u60a8\u53ef\u4ee5\u76f4\u63a5\u7531\u6570\u636e\u9a71\u52a8\uff01 \u8ba9\u6211\u4eec\u770b\u4e00\u4e2a\u66f4\u590d\u6742\u7684\u793a\u4f8b\uff0c\u5176\u4e2d\u6211\u4eec\u83b7\u53d6\u591a\u4e2a\u5c5e\u6027\u3002\u5728\u8fd9\u4e2a\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u4f7f\u7528 .NET SDK \u4e3a\u9879\u76ee\u53d1\u5e03\u5bb9\u5668\u955c\u50cf\uff0c\u6211\u4eec\u5e0c\u671b\u4f7f\u7528\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\u751f\u6210\u7684\u5bb9\u5668\u7684\u4e00\u4e9b\u5c5e\u6027\uff1a<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-shell prettyprinted\"><span class=\"pun\">&gt;<\/span><span class=\"pln\">dotnet publish <\/span><span class=\"pun\">-<\/span><span class=\"pln\">p <\/span><span class=\"typ\">PublishProfile<\/span><span class=\"pun\">=<\/span><span class=\"typ\">DefaultContainer<\/span> <span class=\"pun\">--<\/span><span class=\"pln\">getProperty<\/span><span class=\"pun\">:<\/span><span class=\"typ\">GeneratedContainerDigest<\/span> <span class=\"pun\">--<\/span><span class=\"pln\">getProperty<\/span><span class=\"pun\">:<\/span><span class=\"typ\">GeneratedContainerConfiguration<\/span>\r\n<span class=\"pun\">{<\/span>\r\n  <span class=\"str\">\"Properties\"<\/span><span class=\"pun\">:<\/span> <span class=\"pun\">{<\/span>\r\n    <span class=\"str\">\"GeneratedContainerDigest\"<\/span><span class=\"pun\">:<\/span> <span class=\"str\">\"sha256:ef880a503bbabcb84bbb6a1aa9b41b36dc1ba08352e7cd91c0993646675174c4\"<\/span><span class=\"pun\">,<\/span>\r\n    <span class=\"str\">\"GeneratedContainerConfiguration\"<\/span><span class=\"pun\">:<\/span> <span class=\"str\">\"{\\u0022config\\u0022:{\\u0022ExposedPorts\\u0022:{\\u00228080\/tcp\\u0022:{}},\\u0022Labels\\u0022:{\\u0022org.opencontainers.image.created\\u0022:\\u00222023-10-02T18:20:01.6356453Z\\u0022,\\u0022org.opencontainers.artifact.created\\u0022:\\u00222023-10-02T18:20:01.6356453Z\\u0022,\\u0022org.opencontainers.artifact.description\\u0022:\\u0022A project that demonstrates publishing to various container registries using just\\\\r\\\\n      the .NET SDK\\u0022,\\u0022org.opencontainers.image.description\\u0022:\\u0022A project that demonstrates publishing to various container registries using just\\\\r\\\\n      the .NET SDK\\u0022,\\u0022org.opencontainers.image.authors\\u0022:\\u0022Chet Husk\\u0022,\\u0022org.opencontainers.image.url\\u0022:\\u0022https:\/\/github.com\/baronfel\/sdk-container-demo\\u0022,\\u0022org.opencontainers.image.documentation\\u0022:\\u0022https:\/\/github.com\/baronfel\/sdk-container-demo\\u0022,\\u0022org.opencontainers.image.version\\u0022:\\u00221.0.0\\u0022,\\u0022org.opencontainers.image.licenses\\u0022:\\u0022MIT\\u0022,\\u0022org.opencontainers.image.title\\u0022:\\u0022.NET SDK 7 Container Demo\\u0022,\\u0022org.opencontainers.image.base.name\\u0022:\\u0022mcr.microsoft.com\/dotnet\/aspnet:8.0.0-rc.1\\u0022},\\u0022Env\\u0022:[\\u0022PATH=\/usr\/local\/sbin:\/usr\/local\/bin:\/usr\/sbin:\/usr\/bin:\/sbin:\/bin\\u0022,\\u0022APP_UID=1654\\u0022,\\u0022ASPNETCORE_HTTP_PORTS=8080\\u0022,\\u0022DOTNET_RUNNING_IN_CONTAINER=true\\u0022,\\u0022DOTNET_VERSION=8.0.0-rc.1.23419.4\\u0022,\\u0022ASPNET_VERSION=8.0.0-rc.1.23421.29\\u0022],\\u0022WorkingDir\\u0022:\\u0022\/app\\u0022,\\u0022Entrypoint\\u0022:[\\u0022dotnet\\u0022,\\u0022sdk-container-demo.dll\\u0022],\\u0022User\\u0022:\\u00221654\\u0022},\\u0022created\\u0022:\\u00222023-10-02T18:20:04.6914310Z\\u0022,\\u0022rootfs\\u0022:{\\u0022type\\u0022:\\u0022layers\\u0022,\\u0022diff_ids\\u0022:[\\u0022sha256:d310e774110ab038b30c6a5f7b7f7dd527dbe527854496bd30194b9ee6ea496e\\u0022,\\u0022sha256:379caff0dd639afb033e114cb8da17c334a36d0c6c01bb4cf5f2d1a811968742\\u0022,\\u0022sha256:80627b9413613b9703eec6adc7a3a751ac1b7571041c77899456345f823ef63a\\u0022,\\u0022sha256:6231bc2ccd45860760c09a50d6d059aa4b6aa357e41e6d06f4394f24176f203d\\u0022,\\u0022sha256:56fa0b94fd5e406124a3d070ec79998698ddea2e635bf53bbf106dc86aeaa240\\u0022,\\u0022sha256:272eedde5582036a7f26fe5d069f4ba328ba7a5c6be30f6dcbee9838224df148\\u0022,\\u0022sha256:4b8ab71658cccccfaf8979b1025f3ed1b12e936a448dcd13b9ab4f7709f31357\\u0022]},\\u0022architecture\\u0022:\\u0022amd64\\u0022,\\u0022os\\u0022:\\u0022linux\\u0022,\\u0022history\\u0022:[{\\u0022created\\u0022:\\u00222023-09-20T04:55:40.8154909Z\\u0022,\\u0022created_by\\u0022:\\u0022\/bin\/sh -c #(nop) ADD file:a1398394375faab8dd9e1e8d584eea96c750fb57ae4ffd2b14624f1cf263561b in \/ \\u0022},{\\u0022created\\u0022:\\u00222023-09-20T04:55:41.1203677Z\\u0022,\\u0022created_by\\u0022:\\u0022\/bin\/sh -c #(nop)  CMD [\\\\u0022bash\\\\u0022]\\u0022,\\u0022empty_layer\\u0022:true},{\\u0022comment\\u0022:\\u0022buildkit.dockerfile.v0\\u0022,\\u0022created\\u0022:\\u00222023-09-20T12:13:34.5265068Z\\u0022,\\u0022created_by\\u0022:\\u0022ENV APP_UID=1654 ASPNETCORE_HTTP_PORTS=8080 DOTNET_RUNNING_IN_CONTAINER=true\\u0022,\\u0022empty_layer\\u0022:true},{\\u0022comment\\u0022:\\u0022buildkit.dockerfile.v0\\u0022,\\u0022created\\u0022:\\u00222023-09-20T12:13:34.5265068Z\\u0022,\\u0022created_by\\u0022:\\u0022RUN \/bin\/sh -c apt-get update     \\\\u0026\\\\u0026 apt-get install -y --no-install-recommends         ca-certificates                 libc6         libgcc-s1         libicu72         libssl3         libstdc\\\\u002B\\\\u002B6         tzdata         zlib1g     \\\\u0026\\\\u0026 rm -rf \/var\/lib\/apt\/lists\/* # buildkit\\u0022},{\\u0022comment\\u0022:\\u0022buildkit.dockerfile.v0\\u0022,\\u0022created\\u0022:\\u00222023-09-20T12:13:34.8536814Z\\u0022,\\u0022created_by\\u0022:\\u0022RUN \/bin\/sh -c groupadd         --gid=$APP_UID         app     \\\\u0026\\\\u0026 useradd -l         --uid=$APP_UID         --gid=$APP_UID         --create-home         app # buildkit\\u0022},{\\u0022comment\\u0022:\\u0022buildkit.dockerfile.v0\\u0022,\\u0022created\\u0022:\\u00222023-09-20T12:13:36.8764982Z\\u0022,\\u0022created_by\\u0022:\\u0022ENV DOTNET_VERSION=8.0.0-rc.1.23419.4\\u0022,\\u0022empty_layer\\u0022:true},{\\u0022comment\\u0022:\\u0022buildkit.dockerfile.v0\\u0022,\\u0022created\\u0022:\\u00222023-09-20T12:13:36.8764982Z\\u0022,\\u0022created_by\\u0022:\\u0022COPY \/dotnet \/usr\/share\/dotnet # buildkit\\u0022},{\\u0022comment\\u0022:\\u0022buildkit.dockerfile.v0\\u0022,\\u0022created\\u0022:\\u00222023-09-20T12:13:37.1287440Z\\u0022,\\u0022created_by\\u0022:\\u0022RUN \/bin\/sh -c ln -s \/usr\/share\/dotnet\/dotnet \/usr\/bin\/dotnet # buildkit\\u0022},{\\u0022comment\\u0022:\\u0022buildkit.dockerfile.v0\\u0022,\\u0022created\\u0022:\\u00222023-09-20T12:13:39.8264990Z\\u0022,\\u0022created_by\\u0022:\\u0022ENV ASPNET_VERSION=8.0.0-rc.1.23421.29\\u0022,\\u0022empty_layer\\u0022:true},{\\u0022comment\\u0022:\\u0022buildkit.dockerfile.v0\\u0022,\\u0022created\\u0022:\\u00222023-09-20T12:13:39.8264990Z\\u0022,\\u0022created_by\\u0022:\\u0022COPY \/shared\/Microsoft.AspNetCore.App \/usr\/share\/dotnet\/shared\/Microsoft.AspNetCore.App # buildkit\\u0022},{\\u0022author\\u0022:\\u0022.NET SDK\\u0022,\\u0022created\\u0022:\\u00222023-10-02T18:20:04.6914069Z\\u0022,\\u0022created_by\\u0022:\\u0022.NET SDK Container Tooling, version 8.0.100-dev\\u0022}]}\"<\/span>\r\n  <span class=\"pun\">}<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<p>\u5728\u8fd9\u91cc\uff0c\u6211\u4eec\u8bf7\u6c42\u4e86\u4e24\u4e2a\u5c5e\u6027\uff0c\u5e76\u6536\u5230\u4e86\u4e00\u4e2a\u5e26\u6709<span style=\"color: #ff0000;\">Properties<\/span> \u5c5e\u6027\u7684JSON \u5bf9\u8c61\uff0c\u5176\u4e2d\u5305\u542b\u6211\u4eec\u8bf7\u6c42\u7684\u4e24\u4e2a\u5c5e\u6027\uff08MSBuild \u5c06\u8fd9\u4e24\u4e2a\u5c5e\u6027\u5b58\u50a8\u4e3a\u5b57\u7b26\u4e32\uff09\u3002\u4ece\u8fd9\u91cc\uff0c\u6211\u4eec\u53ef\u4ee5\u4f7f\u7528CLI \u7684\u4efb\u4f55JSON\u5de5\u5177\u6216\u6211\u4eec\u9009\u62e9\u7684\u7f16\u7a0b\u8bed\u8a00\u6765\u89e3\u6790\u5e76\u4f7f\u7528\u8fd9\u4e9b\u6570\u636e\u3002<\/p>\n<p>\u540c\u6837\u7684\u884c\u4e3a\u4e5f\u9002\u7528\u4e8e MSBuild \u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528 <span style=\"color: #ff0000;\">&#8211;getItem:&lt;ITEMTYPE&gt;<\/span> \u6309\u9879\u76ee\u7c7b\u578b\u8bf7\u6c42\u8be5\u9879\u76ee\u3002MSBuild \u4f1a\u5c06\u8fd9\u4e9b\u4f5c\u4e3a JSON \u5bf9\u8c61\u8fd4\u56de\u5230\u9879\u76ee\u540d\u79f0\u952e\u4e0b\u7684\u6570\u7ec4\u4e2d\uff0c\u6240\u6709\u8fd9\u4e9b\u90fd\u4f4d\u4e8e\u201c<span style=\"color: #ff0000;\">Items<\/span>\u201d\u952e\u4e0b\uff0c\u5c31\u50cf\u5728\u672c\u4f8b\u4e2d\u6211\u4eec\u8bf7\u6c42\u4e3a\u955c\u50cf\u53d1\u5e03\u7684\u6240\u6709\u955c\u50cf\u6807\u7b7e\u4e00\u6837\uff1a<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-shell prettyprinted\"><span class=\"pun\">&gt;<\/span><span class=\"pln\">dotnet publish <\/span><span class=\"pun\">-<\/span><span class=\"pln\">p <\/span><span class=\"typ\">PublishProfile<\/span><span class=\"pun\">=<\/span><span class=\"typ\">DefaultContainer<\/span> <span class=\"pun\">--<\/span><span class=\"pln\">getItem<\/span><span class=\"pun\">:<\/span><span class=\"typ\">ContainerImageTags<\/span>\r\n<span class=\"pun\">{<\/span>\r\n  <span class=\"str\">\"Items\"<\/span><span class=\"pun\">:<\/span> <span class=\"pun\">{<\/span>\r\n    <span class=\"str\">\"ContainerImageTags\"<\/span><span class=\"pun\">:<\/span> <span class=\"pun\">[<\/span>\r\n      <span class=\"pun\">{<\/span>\r\n        <span class=\"str\">\"Identity\"<\/span><span class=\"pun\">:<\/span> <span class=\"str\">\"latest\"<\/span><span class=\"pun\">,<\/span>\r\n        <span class=\"pun\">....<\/span><span class=\"pln\"> other <\/span><span class=\"typ\">MSBuild<\/span> <span class=\"typ\">Item<\/span> <span class=\"typ\">Metadata<\/span><span class=\"pln\"> elided <\/span><span class=\"pun\">....<\/span>\r\n    <span class=\"pun\">]<\/span>\r\n  <span class=\"pun\">}<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<p>\u6700\u540e\uff0c\u6211\u4eec\u8fd8\u652f\u6301\u4f7f\u7528 <span style=\"color: #ff0000;\">&#8211;getTargetResults:&lt;TARGETNAME&gt;<\/span> \u6765\u68c0\u7d22\u5df2\u8fd0\u884c\u7684\u7ed9\u5b9a\u76ee\u6807\u7684\u8f93\u51fa\u3002\u8fd9\u4e9b\u8f93\u51fa\u5728 <span style=\"color: #ff0000;\">TargetResults<\/span> \u5c5e\u6027\u4e0b\u8fd4\u56de\uff0c\u5c31\u50cf\u5728\u672c\u793a\u4f8b\u4e2d\uff0c\u6211\u4eec\u83b7\u5f97\u751f\u6210\u7684 SDK \u5bb9\u5668\u955c\u50cf\u6240\u4f7f\u7528\u7684\u6700\u7ec8\u955c\u50cf\u540d\u79f0\uff1a<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-shell prettyprinted\"><span class=\"pun\">&gt;<\/span><span class=\"pln\">dotnet publish <\/span><span class=\"pun\">-<\/span><span class=\"pln\">p <\/span><span class=\"typ\">PublishProfile<\/span><span class=\"pun\">=<\/span><span class=\"typ\">DefaultContainer<\/span> <span class=\"pun\">--<\/span><span class=\"pln\">getTargetResult<\/span><span class=\"pun\">:<\/span><span class=\"typ\">ComputeContainerBaseImage<\/span>\r\n<span class=\"pun\">{<\/span>\r\n  <span class=\"str\">\"TargetResults\"<\/span><span class=\"pun\">:<\/span> <span class=\"pun\">{<\/span>\r\n    <span class=\"str\">\"ComputeContainerBaseImage\"<\/span><span class=\"pun\">:<\/span> <span class=\"pun\">{<\/span>\r\n      <span class=\"str\">\"Result\"<\/span><span class=\"pun\">:<\/span> <span class=\"str\">\"Success\"<\/span><span class=\"pun\">,<\/span>\r\n      <span class=\"str\">\"Items\"<\/span><span class=\"pun\">:<\/span> <span class=\"pun\">[<\/span>\r\n        <span class=\"pun\">{<\/span>\r\n          <span class=\"str\">\"Identity\"<\/span><span class=\"pun\">:<\/span> <span class=\"str\">\"mcr.microsoft.com\/dotnet\/aspnet:8.0.0-rc.1\"<\/span><span class=\"pun\">,<\/span>\r\n          <span class=\"pun\">....<\/span><span class=\"pln\"> other <\/span><span class=\"typ\">MSBuild<\/span> <span class=\"typ\">Item<\/span> <span class=\"typ\">Metadata<\/span><span class=\"pln\"> elided <\/span><span class=\"pun\">....<\/span>\r\n        <span class=\"pun\">}<\/span>\r\n      <span class=\"pun\">]<\/span>\r\n    <span class=\"pun\">}<\/span>\r\n  <span class=\"pun\">}<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<p>\u6211\u4eec\u8ba4\u4e3a\u8fd9\u4f1a\u8ba9 MSBuild \u66f4\u5bb9\u6613\u96c6\u6210\u5230\u5176\u4ed6\u5de5\u5177\u4e2d\uff0c\u6240\u4ee5\u6211\u4eec\u5f88\u9ad8\u5174\u770b\u5230\u5927\u5bb6\u5f00\u59cb\u4f7f\u7528\u5b83\uff01<\/p>\n<h2><strong>SDK Container Publish<\/strong><strong>\uff1a\u53d1\u5e03\u5230<\/strong><strong>tar.gz<\/strong><strong>\u5b58\u6863<\/strong><\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/dotnet\/sdk-container-builds\/issues\/283\">Issue<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/sdk\/pull\/35151\">PR<\/a><\/li>\n<\/ul>\n<p>SDK \u5df2\u7ecf\u80fd\u591f\u5c06\u5bb9\u5668\u53d1\u5e03\u5230\u672c\u5730\u5bb9\u5668\u5de5\u5177\uff08\u4f8b\u5982 Docker \u548c Podman\uff09\u4ee5\u53ca\u8fdc\u7a0b\u5bb9\u5668\u6ce8\u518c\u8868\uff08\u4f8b\u5982 Azure Container Registry\u3001Amazon\u2019s Elastic Container Registry\u548c Docker Hub\uff09\u6709\u4e00\u6bb5\u65f6\u95f4\u4e86\u3002 \u7136\u800c\uff0c\u5e76\u975e\u6240\u6709\u5de5\u4f5c\u6d41\u7a0b\u90fd\u5982\u6b64\u7b80\u5355\u3002 \u4f8b\u5982\uff0c\u6709\u4e9b\u56e2\u961f\u53ef\u80fd\u66f4\u559c\u6b22\u5728\u63a8\u9001\u955c\u50cf\u4e4b\u524d\u5bf9\u955c\u50cf\u8fd0\u884c\u626b\u63cf\u5de5\u5177\u3002\u4e3a\u4e86\u5e2e\u52a9\u652f\u6301\u8fd9\u4e9b\u5de5\u4f5c\u6d41\u7a0b\uff0c\u793e\u533a\u6210\u5458 @Danielku15 \u4e3a SDK Container Publish \u5de5\u5177\u5b9e\u73b0\u4e86\u4e00\u9879\u5f88\u68d2\u7684\u65b0\u529f\u80fd\u5373\u76f4\u63a5\u4ee5tar.gz\u5f52\u6863\u6587\u4ef6\u7684\u5f62\u5f0f\u521b\u5efa\u5bb9\u5668\u3002\u4e00\u65e6\u5b58\u6863\u5b8c\u6210\uff0c\u5b83\u5c31\u53ef\u4ee5\u6839\u636e\u60a8\u7684\u9700\u6c42\u79fb\u52a8\u3001\u626b\u63cf\u6216\u52a0\u8f7d\u5230\u672c\u5730 Docker \u5de5\u5177\u94fe\u4e2d\u3002 \u6211\u4eec\u6765\u770b\u770b\u5b83\u6709\u591a\u7b80\u5355\uff1a<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-shell prettyprinted\"><span class=\"pun\">&gt;<\/span><span class=\"pln\">dotnet publish <\/span><span class=\"pun\">-<\/span><span class=\"pln\">p <\/span><span class=\"typ\">PublishProfile<\/span><span class=\"pun\">=<\/span><span class=\"typ\">DefaultContainer<\/span> <span class=\"pun\">-<\/span><span class=\"pln\">p <\/span><span class=\"typ\">ContainerArchiveOutputPath<\/span><span class=\"pun\">=.\/<\/span><span class=\"pln\">images<\/span><span class=\"pun\">\/<\/span><span class=\"pln\">sdk<\/span><span class=\"pun\">-<\/span><span class=\"pln\">container<\/span><span class=\"pun\">-<\/span><span class=\"pln\">demo<\/span><span class=\"pun\">.<\/span><span class=\"pln\">tar<\/span><span class=\"pun\">.<\/span><span class=\"pln\">gz\r\n<\/span><span class=\"typ\">MSBuild<\/span><span class=\"pln\"> version <\/span><span class=\"lit\">17.8.0+6cdef4241<\/span> <span class=\"kwd\">for<\/span> <span class=\"pun\">.<\/span><span class=\"pln\">NET\r\n  <\/span><span class=\"typ\">Determining<\/span><span class=\"pln\"> projects to restore<\/span><span class=\"pun\">...<\/span>\r\n  <span class=\"typ\">All<\/span><span class=\"pln\"> projects are up<\/span><span class=\"pun\">-<\/span><span class=\"pln\">to<\/span><span class=\"pun\">-<\/span><span class=\"pln\">date <\/span><span class=\"kwd\">for<\/span><span class=\"pln\"> restore<\/span><span class=\"pun\">.<\/span><span class=\"pln\">\r\nC<\/span><span class=\"pun\">:<\/span><span class=\"pln\">\\Program <\/span><span class=\"typ\">Files<\/span><span class=\"pln\">\\dotnet\\sdk\\8<\/span><span class=\"pun\">.<\/span><span class=\"lit\">0.100<\/span><span class=\"pun\">-<\/span><span class=\"pln\">rc<\/span><span class=\"pun\">.<\/span><span class=\"lit\">2.23477<\/span><span class=\"pun\">.<\/span><span class=\"lit\">19<\/span><span class=\"pln\">\\Sdks\\Microsoft<\/span><span class=\"pun\">.<\/span><span class=\"pln\">NET<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Sdk<\/span><span class=\"pln\">\\targets\\Microsoft<\/span><span class=\"pun\">.<\/span><span class=\"pln\">NET<\/span><span class=\"pun\">.<\/span><span class=\"typ\">RuntimeIdentifierInference<\/span><span class=\"pun\">.<\/span><span class=\"pln\">targets<\/span><span class=\"pun\">(<\/span><span class=\"lit\">311<\/span><span class=\"pun\">,<\/span><span class=\"lit\">5<\/span><span class=\"pun\">):<\/span><span class=\"pln\"> message NETSDK1057<\/span><span class=\"pun\">:<\/span> <span class=\"typ\">You<\/span><span class=\"pln\"> are <\/span><span class=\"kwd\">using<\/span><span class=\"pln\"> a preview version <\/span><span class=\"kwd\">of<\/span> <span class=\"pun\">.<\/span><span class=\"pln\">NET<\/span><span class=\"pun\">.<\/span> <span class=\"typ\">See<\/span><span class=\"pun\">:<\/span><span class=\"pln\"> http\r\ns<\/span><span class=\"pun\">:<\/span><span class=\"com\">\/\/aka.ms\/dotnet-support-policy [D:\\code\\sdk-container-demo\\src\\sdk-container-demo\\sdk-container-demo.csproj]<\/span><span class=\"pln\">\r\n  sdk<\/span><span class=\"pun\">-<\/span><span class=\"pln\">container<\/span><span class=\"pun\">-<\/span><span class=\"pln\">demo <\/span><span class=\"pun\">-&gt;<\/span><span class=\"pln\"> D<\/span><span class=\"pun\">:<\/span><span class=\"pln\">\\code\\sdk<\/span><span class=\"pun\">-<\/span><span class=\"pln\">container<\/span><span class=\"pun\">-<\/span><span class=\"pln\">demo\\src\\sdk<\/span><span class=\"pun\">-<\/span><span class=\"pln\">container<\/span><span class=\"pun\">-<\/span><span class=\"pln\">demo\\b<\/span><span class=\"kwd\">in<\/span><span class=\"pln\">\\Release\\net8<\/span><span class=\"pun\">.<\/span><span class=\"lit\">0<\/span><span class=\"pln\">\\sdk<\/span><span class=\"pun\">-<\/span><span class=\"pln\">container<\/span><span class=\"pun\">-<\/span><span class=\"pln\">demo<\/span><span class=\"pun\">.<\/span><span class=\"pln\">dll\r\n  sdk<\/span><span class=\"pun\">-<\/span><span class=\"pln\">container<\/span><span class=\"pun\">-<\/span><span class=\"pln\">demo <\/span><span class=\"pun\">-&gt;<\/span><span class=\"pln\"> D<\/span><span class=\"pun\">:<\/span><span class=\"pln\">\\code\\sdk<\/span><span class=\"pun\">-<\/span><span class=\"pln\">container<\/span><span class=\"pun\">-<\/span><span class=\"pln\">demo\\src\\sdk<\/span><span class=\"pun\">-<\/span><span class=\"pln\">container<\/span><span class=\"pun\">-<\/span><span class=\"pln\">demo\\b<\/span><span class=\"kwd\">in<\/span><span class=\"pln\">\\Release\\net8<\/span><span class=\"pun\">.<\/span><span class=\"lit\">0<\/span><span class=\"pln\">\\publish\\\r\n  <\/span><span class=\"typ\">Building<\/span><span class=\"pln\"> image <\/span><span class=\"str\">'sdk-container-demo'<\/span> <span class=\"kwd\">with<\/span><span class=\"pln\"> tags <\/span><span class=\"str\">'latest'<\/span><span class=\"pln\"> on top <\/span><span class=\"kwd\">of<\/span> <span class=\"kwd\">base<\/span><span class=\"pln\"> image <\/span><span class=\"str\">'mcr.microsoft.com\/dotnet\/aspnet:8.0.0-rc.1'<\/span><span class=\"pun\">.<\/span>\r\n  <span class=\"typ\">Pushed<\/span><span class=\"pln\"> image <\/span><span class=\"str\">'sdk-container-demo:latest'<\/span><span class=\"pln\"> to <\/span><span class=\"kwd\">local<\/span><span class=\"pln\"> archive at <\/span><span class=\"str\">'D:\\code\\sdk-container-demo\\src\\sdk-container-demo\\images\\sdk-container-demo.tar.gz'<\/span><span class=\"pun\">.<\/span><\/code><\/pre>\n<p>\u8fd9\u91cc\uff0c\u6211\u5728publish\u547d\u4ee4\u4e2d\u6dfb\u52a0\u4e86\u4e00\u4e2a\u65b0\u5c5e\u6027\uff1a<span style=\"color: #ff0000;\">ContainerArchiveOutputPath<\/span>\u3002\u5728\u6307\u5b9a\u6b64\u5c5e\u6027\u540e\uff0c\u5de5\u5177\u4e0d\u4f1a\u5c06\u955c\u50cf\u63a8\u9001\u5230 Docker \u6216\u8fdc\u7a0b\u6ce8\u518c\u8868\uff0c\u800c\u662f\u521b\u5efa\u6211\u9009\u62e9\u7684\u6587\u4ef6\u3002 \u5728\u672c\u4f8b\u4e2d\uff0c\u6211\u660e\u786e\u6307\u5b9a\u4e86\u4e00\u4e2a\u6587\u4ef6\u540d\uff0c\u4f46\u5982\u679c\u60a8\u613f\u610f\uff0c\u4e5f\u53ef\u4ee5\u6307\u5b9a\u4e00\u4e2a\u6587\u4ef6\u5939\u6765\u5c06\u955c\u50cf\u63a8\u9001\u5230\u5176\u4e2d\u3002 \u5982\u679c\u8fd9\u6837\u505a\uff0c\u751f\u6210\u7684 tar.gz \u5c06\u4ee5\u955c\u50cf\u547d\u540d\uff08\u56e0\u6b64\u5728\u672c\u4f8b\u4e2d\u751f\u6210\u7684\u540d\u79f0\u5c06\u4e3a <span style=\"color: #ff0000;\">sdk-container-demo.tar.gz<\/span>\uff09\u3002<\/p>\n<p>\u4e00\u65e6\u60a8\u83b7\u5f97 tar.gz \u540e\uff0c\u60a8\u53ef\u4ee5\u628a\u4ed6\u79fb\u52a8\u5230\u4efb\u4f55\u9700\u8981\u7684\u4f4d\u7f6e\uff0c\u6216\u8005\u7b80\u5355\u5730\u4f7f\u7528 <span style=\"color: #ff0000;\">docker load<\/span> \u5c06\u5176\u52a0\u8f7d\u5230 Docker \u4e2d\uff1a<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-shell prettyprinted\"><span class=\"pun\">&gt;<\/span><span class=\"pln\">docker load <\/span><span class=\"pun\">--<\/span><span class=\"pln\">input <\/span><span class=\"pun\">.<\/span><span class=\"pln\">\\images\\sdk<\/span><span class=\"pun\">-<\/span><span class=\"pln\">container<\/span><span class=\"pun\">-<\/span><span class=\"pln\">demo<\/span><span class=\"pun\">.<\/span><span class=\"pln\">tar<\/span><span class=\"pun\">.<\/span><span class=\"pln\">gz\r\n<\/span><span class=\"lit\">5d6d1d62da4b<\/span><span class=\"pun\">:<\/span> <span class=\"typ\">Loading<\/span><span class=\"pln\"> layer <\/span><span class=\"pun\">[==================================================&gt;]<\/span>  <span class=\"lit\">9.442MB<\/span><span class=\"pun\">\/<\/span><span class=\"lit\">9.442MB<\/span>\r\n<span class=\"typ\">Loaded<\/span><span class=\"pln\"> image<\/span><span class=\"pun\">:<\/span><span class=\"pln\"> sdk<\/span><span class=\"pun\">-<\/span><span class=\"pln\">container<\/span><span class=\"pun\">-<\/span><span class=\"pln\">demo<\/span><span class=\"pun\">:<\/span><span class=\"pln\">latest<\/span><\/code><\/pre>\n<p>\u5c31\u50cf\u6211\u7684\u955c\u50cf\u53ef\u4ee5\u901a\u8fc7 Docker \u8fd0\u884c\u4e00\u6837\u3002\u6211\u4eec\u5e0c\u671b\u8fd9\u9879\u65b0\u529f\u80fd\u80fd\u591f\u4e3a\u66f4\u591a\u56e2\u961f\u5e26\u6765\u65b0\u7684\u5de5\u4f5c\u6d41\u7a0b \u2013 \u8bf7\u5728\u6211<a href=\"https:\/\/github.com\/dotnet\/sdk-container-builds\">\u4eec\u7684\u5b58\u50a8\u5e93<\/a>\u4e2d\u63d0\u51fa\u60a8\u7684\u5efa\u8bae\uff01<\/p>\n<h2><strong>.NET <\/strong><strong>\u7684<\/strong><strong>Tensor Primitives<\/strong><strong>\u7b80\u4ecb<\/strong><\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/89639\">Issue<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/92219\">PR<\/a><\/li>\n<\/ul>\n<p>\u5728\u8fc7\u53bb\u7684\u51e0\u5e74\u4e2d\uff0c.NET \u5bf9\u6570\u5b57\u652f\u6301\u8fdb\u884c\u4e86\u91cd\u5927\u6539\u8fdb\uff0c\u52aa\u529b\u4f18\u5316AI\u548cMachine Learning\u7b49\u6570\u636e\u5bc6\u96c6\u578b\u5de5\u4f5c\u8d1f\u8f7d\u3002<\/p>\n<p>\u4ece .NET Core 3 \u4e2d\u6dfb\u52a0\u786c\u4ef6\u5185\u90e8\u51fd\u6570\u5f00\u59cb\uff0c\u6211\u4eec\u4e3a .NET \u5f00\u53d1\u4eba\u5458\u63d0\u4f9b\u4e86\u8bbf\u95ee\u786c\u4ef6\u7279\u5b9a\u6307\u4ee4\u7684\u6743\u9650\u3002\u8fd9\u4f7f\u5f97 .NET \u5e94\u7528\u7a0b\u5e8f\u80fd\u591f\u5229\u7528\u73b0\u4ee3\u786c\u4ef6\u529f\u80fd\uff0c\u5982\u77e2\u91cf\u6307\u4ee4\uff0c\u8fd9\u5bf9AI\u5de5\u4f5c\u8d1f\u8f7d\u81f3\u5173\u91cd\u8981\u3002<\/p>\n<p>\u8fd9\u9879\u5de5\u4f5c\u7684\u4e0b\u4e00\u6b65\u662f Generic Math\uff0c\u5b83\u5728 .NET 6 \u4e2d\u4f5c\u4e3a\u9884\u89c8\u529f\u80fd\u5f15\u5165\uff0c\u5e76\u5728 .NET 7 \u4e2d\u6807\u8bb0\u4e3a\u7a33\u5b9a\u3002Generic Math \u63d0\u4f9b\u4e86\u66f4\u591a\u7c7b\u578b\u5b89\u5168\u7684\u7b80\u5316\u6570\u5b57\u8fd0\u7b97\u3002\u6b64\u529f\u80fd\u65e0\u9700\u521b\u5efa\u5927\u91cf\u51e0\u4e4e\u76f8\u540c\u7684\u5b9e\u73b0\u6765\u6ee1\u8db3\u4e0d\u540c\u7684\u6570\u5b57\u7c7b\u578b\uff0c\u4ece\u800c\u7b80\u5316\u4e86\u4ee3\u7801\u5e76\u4f7f\u5176\u66f4\u6613\u4e8e\u7ef4\u62a4\u3002<\/p>\n<p>Tensor Primitives \u662f .NET \u4e2d\u57fa\u4e8e\u786c\u4ef6\u5185\u90e8\u51fd\u6570\u548c\u901a\u7528\u6570\u5b66\u6784\u5efa\u7684AI \u6570\u503c\u6f14\u8fdb\u7684\u4e0b\u4e00\u6b65\uff0c\u4ece RC2 \u5f00\u59cb\uff0c\u8fd9\u7ec4\u529f\u80fd\u5c31\u5305\u542b\u5728 .NET 8 \u4e2d\u3002<\/p>\n<p>Tensor Primitives \u662f <span style=\"color: #ff0000;\">System.Numerics.Tensors.TensorPrimitives<\/span> \u7684\u7f29\u5199\uff0c\u662f\u4e00\u7ec4\u65b0\u7684 API\uff0c\u5f15\u5165\u4e86\u5bf9tensor\u8fd0\u7b97\u7684\u652f\u6301\u3002 <span style=\"color: #ff0000;\">TensorPrimitives<\/span> API \u901a\u8fc7\u72ec\u7acb\u7684 <span style=\"color: #ff0000;\">System.Numerics.Tensors<\/span> NuGet \u5305\u63d0\u4f9b\u3002 \u6b64\u5305\u7684\u5185\u5bb9\u53d6\u4ee3\u4e86\u4e4b\u524d\u4ec5\u4f5c\u4e3a\u9884\u89c8\u7248\u63d0\u4f9b\u7684 <span style=\"color: #ff0000;\">System.Numerics.Tensors<\/span> \u5305\u3002\u5728 .NET 8 \u4e2d\uff0c<span style=\"color: #ff0000;\">System.Numerics.Tensors<\/span> \u5c06\u88ab\u6807\u8bb0\u4e3a\u7a33\u5b9a\u3002<\/p>\n<p>\u6709\u5173\u66f4\u591a\u8be6\u7ec6\u4fe1\u606f\uff0c\u8bf7\u53c2\u9605<a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/89639\">\u6570\u5b57\u548cAI\u7684\u672a\u6765\u63d0\u6848<\/a>\u3002<\/p>\n<h3><strong>\u8bed\u4e49\u641c\u7d22\u793a\u4f8b<\/strong><\/h3>\n<p>\u8bed\u4e49\u641c\u7d22\u6216\u68c0\u7d22\u589e\u5f3a\u751f\u6210 (RAG) \u7b49AI\u5de5\u4f5c\u8d1f\u8f7d\u901a\u8fc7\u5c06\u76f8\u5173\u6570\u636e\u5408\u5e76\u5230\u63d0\u793a\u4e2d\uff0c\u589e\u5f3a\u4e86ChatGPT \u7b49\u5927\u578b\u8bed\u8a00\u6a21\u578b\u7684\u81ea\u7136\u8bed\u8a00\u529f\u80fd\u3002 \u5728\u8fd9\u4e9b\u4efb\u52a1\u4e2d\uff0c\u5411\u91cf\u64cd\u4f5c\uff08\u4f8b\u5982\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff09\u5bf9\u4e8e\u8bc6\u522b\u6700\u76f8\u5173\u7684\u6570\u636e\u6765\u56de\u7b54\u95ee\u9898\u81f3\u5173\u91cd\u8981\u3002<\/p>\n<p>\u5047\u8bbe\u60a8\u6709\u4e00\u4e2a\u5305\u542b\u7535\u5f71\u6807\u9898\u548c\u5d4c\u5165\u7684\u7535\u5f71\u6570\u636e\u5e93\u3002 <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/ai-services\/openai\/concepts\/understand-embeddings\">\u5d4c\u5165<\/a>\u4e0d\u5728\u672c\u6587\u7684\u8ba8\u8bba\u8303\u56f4\u5185\uff0c\u4f46\u5b83\u4eec\u662f\u5c06\u8bed\u4e49\u4fe1\u606f\u7f16\u7801\u4e3a\u6570\u5b57\u6570\u7ec4\u7684\u65b9\u6cd5\u3002\u5728\u672c\u4f8b\u4e2d\uff0c\u5b83\u4eec\u4ee3\u8868\u4e86\u8fd9\u4e9b\u7535\u5f71\u60c5\u8282\u7684\u7b80\u8981\u6982\u8981\uff0c\u5e76\u4e14\u5b83\u4eec\u662f\u9884\u5148\u8ba1\u7b97\u8fc7\u7684\u3002\u4f46\u662f\uff0c\u5982\u679c\u60a8\u613f\u610f\uff0c\u53ef\u4ee5\u4f7f\u7528 <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/ai-services\/openai\/how-to\/embeddings?tabs=csharp\">Azure OpenAI \u7b49\u6a21\u578b\u6765\u751f\u6210\u5d4c\u5165<\/a>\u3002<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-csharp prettyprinted\"><span class=\"kwd\">var<\/span><span class=\"pln\"> movies <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span> <span class=\"pun\">[]<\/span> <span class=\"pun\">{<\/span>\r\n    <span class=\"kwd\">new<\/span> <span class=\"pun\">{<\/span><span class=\"typ\">Title<\/span><span class=\"pun\">=<\/span><span class=\"str\">\"The Lion King\"<\/span><span class=\"pun\">,<\/span> <span class=\"typ\">Embedding<\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span> <span class=\"pun\">[]<\/span> <span class=\"pun\">{<\/span><span class=\"lit\">0.10022575f<\/span><span class=\"pun\">,<\/span> <span class=\"pun\">-<\/span><span class=\"lit\">0.23998135f<\/span><span class=\"pun\">}},<\/span>\r\n    <span class=\"kwd\">new<\/span> <span class=\"pun\">{<\/span><span class=\"typ\">Title<\/span><span class=\"pun\">=<\/span><span class=\"str\">\"Inception\"<\/span><span class=\"pun\">,<\/span> <span class=\"typ\">Embedding<\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span> <span class=\"pun\">[]<\/span> <span class=\"pun\">{<\/span><span class=\"lit\">0.10327095f<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">0.2563685f<\/span><span class=\"pun\">}},<\/span>\r\n    <span class=\"kwd\">new<\/span> <span class=\"pun\">{<\/span><span class=\"typ\">Title<\/span><span class=\"pun\">=<\/span><span class=\"str\">\"Toy Story\"<\/span><span class=\"pun\">,<\/span> <span class=\"typ\">Embedding<\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span> <span class=\"pun\">[]<\/span> <span class=\"pun\">{<\/span><span class=\"lit\">0.095857024f<\/span><span class=\"pun\">,<\/span> <span class=\"pun\">-<\/span><span class=\"lit\">0.201278f<\/span><span class=\"pun\">}},<\/span>\r\n    <span class=\"kwd\">new<\/span> <span class=\"pun\">{<\/span><span class=\"typ\">Title<\/span><span class=\"pun\">=<\/span><span class=\"str\">\"Pulp Function\"<\/span><span class=\"pun\">,<\/span> <span class=\"typ\">Embedding<\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span> <span class=\"pun\">[]<\/span> <span class=\"pun\">{<\/span><span class=\"lit\">0.106827796f<\/span><span class=\"pun\">,<\/span> <span class=\"lit\">0.21676421f<\/span><span class=\"pun\">}},<\/span>\r\n    <span class=\"kwd\">new<\/span> <span class=\"pun\">{<\/span><span class=\"typ\">Title<\/span><span class=\"pun\">=<\/span><span class=\"str\">\"Shrek\"<\/span><span class=\"pun\">,<\/span> <span class=\"typ\">Embedding<\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span> <span class=\"pun\">[]<\/span> <span class=\"pun\">{<\/span><span class=\"lit\">0.09568083f<\/span><span class=\"pun\">,<\/span> <span class=\"pun\">-<\/span><span class=\"lit\">0.21177962f<\/span><span class=\"pun\">}}<\/span>\r\n<span class=\"pun\">};<\/span><\/code><\/pre>\n<p>\u5047\u8bbe\u60a8\u60f3\u4f7f\u7528\u641c\u7d22\u8bcd\u201c\u9002\u5408\u5168\u5bb6\u4eba\u4e00\u8d77\u89c2\u770b\u7684\u7535\u5f71\u201d\u6765\u641c\u7d22\u9002\u5408\u5bb6\u5ead\u89c2\u770b\u7684\u7535\u5f71\u3002 \u8be5\u67e5\u8be2\u7684\u5d4c\u5165\u53ef\u80fd\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-csharp prettyprinted\"><span class=\"kwd\">var<\/span><span class=\"pln\"> queryEmbedding <\/span><span class=\"pun\">=<\/span> <span class=\"kwd\">new<\/span><span class=\"pun\">[]<\/span> <span class=\"pun\">{<\/span><span class=\"lit\">0.12217915f<\/span><span class=\"pun\">,<\/span> <span class=\"pun\">-<\/span><span class=\"lit\">0.034832448f<\/span> <span class=\"pun\">};<\/span><\/code><\/pre>\n<p>\u6b64\u65f6\uff0c\u4e3a\u4e86\u67e5\u770b\u6570\u636e\u5e93\u4e2d\u7684\u54ea\u4e9b\u7535\u5f71\u4e0e\u6211\u7684\u67e5\u8be2\u66f4\u5339\u914d\uff0c\u6211\u53ef\u4ee5\u4f7f\u7528\u4f59\u5f26\u76f8\u4f3c\u5ea6\u8fd9\u6837\u7684\u8ddd\u79bb\u51fd\u6570\u6765\u8ba1\u7b97\u8ddd\u79bb\u3002<\/p>\n<h3><strong>Tensor Primitives<\/strong><strong>\u4e4b\u524d<\/strong><\/h3>\n<p>\u5728 <span style=\"color: #ff0000;\">TensorPrimitives<\/span> \u51fa\u73b0\u4e4b\u524d\uff0c\u5982\u679c\u60a8\u9700\u8981\u5bf9tensor\u5f62\u72b6\u7684\u6570\u636e\u5e94\u7528\u4efb\u4f55\u64cd\u4f5c\uff08\u4f8b\u5982\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff09\uff0c\u60a8\u6709\u4e24\u79cd\u9009\u62e9\uff1a<\/p>\n<ol>\n<li>\u4f7f\u7528\u5916\u90e8\u4f9d\u8d56\u9879<\/li>\n<li>\u5b9e\u73b0\u60a8\u81ea\u5df1\u7684\u64cd\u4f5c<\/li>\n<\/ol>\n<h3><strong>\u4f7f\u7528\u5916\u90e8\u4f9d\u8d56\u9879<\/strong><\/h3>\n<p>\u60a8\u4f7f\u7528\u8fd9\u4e9b\u64cd\u4f5c\u7684\u6700\u7b80\u5355\u65b9\u6cd5\u662f\u4f7f\u7528\u73b0\u6709\u5e93\uff0c\u4f8b\u5982 TorchSharp\u3001TensorFlow.NET\u3001Math.NET Numerics\u3001ML.NET \u6216 Semantic Kernel\u3002 \u5982\u679c\u60a8\u6b63\u5728\u6784\u5efa\u7684\u5e94\u7528\u7a0b\u5e8f\u4e25\u91cd\u4f9d\u8d56\u4e8e\u8fd9\u4e9b\u5e93\u63d0\u4f9b\u7684\u529f\u80fd\uff0c\u90a3\u4e48\u5c06\u5b83\u4eec\u6dfb\u52a0\u5230\u60a8\u7684\u9879\u76ee\u4e2d\u662f\u6709\u610f\u4e49\u7684\u3002\u4f46\u662f\uff0c\u5982\u679c\u60a8\u9700\u8981\u7684\u53ea\u662f\u8fd9\u4e9b\u5e93\u4e2d\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u90a3\u4e48\u4f9d\u8d56\u8fd9\u4e9b\u5e93\u4f1a\u5e26\u6765\u989d\u5916\u7684\u5f00\u9500\u3002<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-csharp prettyprinted\"><span class=\"kwd\">using<\/span> <span class=\"typ\">TorchSharp<\/span><span class=\"pun\">;<\/span>\r\n<span class=\"kwd\">using<\/span> <span class=\"kwd\">static<\/span> <span class=\"typ\">TorchSharp<\/span><span class=\"pun\">.<\/span><span class=\"pln\">torch<\/span><span class=\"pun\">.<\/span><span class=\"pln\">nn<\/span><span class=\"pun\">.<\/span><span class=\"pln\">functional<\/span><span class=\"pun\">;<\/span>\r\n\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> top3MoviesTorchSharp <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> \r\n    movies\r\n        <\/span><span class=\"pun\">.<\/span><span class=\"typ\">Select<\/span><span class=\"pun\">(<\/span><span class=\"pln\">movie <\/span><span class=\"pun\">=&gt;<\/span> \r\n            <span class=\"kwd\">new<\/span> <span class=\"pun\">{<\/span>\r\n                <span class=\"typ\">Title<\/span><span class=\"pun\">=<\/span><span class=\"pln\">movie<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Title<\/span><span class=\"pun\">,<\/span> \r\n                <span class=\"typ\">Embedding<\/span><span class=\"pun\">=<\/span><span class=\"pln\">movie<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Embedding<\/span><span class=\"pun\">,<\/span> \r\n                <span class=\"typ\">Similarity<\/span><span class=\"pun\">=<\/span><span class=\"pln\">cosine_similarity<\/span><span class=\"pun\">(<\/span><span class=\"pln\">torch<\/span><span class=\"pun\">.<\/span><span class=\"pln\">tensor<\/span><span class=\"pun\">(<\/span><span class=\"pln\">queryEmbedding<\/span><span class=\"pun\">),<\/span><span class=\"pln\"> torch<\/span><span class=\"pun\">.<\/span><span class=\"pln\">tensor<\/span><span class=\"pun\">(<\/span><span class=\"pln\">movie<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Embedding<\/span><span class=\"pun\">),<\/span> <span class=\"lit\">0L<\/span><span class=\"pun\">).<\/span><span class=\"pln\">item<\/span><span class=\"str\">&lt;float&gt;<\/span><span class=\"pun\">()})<\/span>\r\n        <span class=\"pun\">.<\/span><span class=\"typ\">OrderByDescending<\/span><span class=\"pun\">(<\/span><span class=\"pln\">movies <\/span><span class=\"pun\">=&gt;<\/span><span class=\"pln\"> movies<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Similarity<\/span><span class=\"pun\">)<\/span>\r\n        <span class=\"pun\">.<\/span><span class=\"typ\">Take<\/span><span class=\"pun\">(<\/span><span class=\"lit\">3<\/span><span class=\"pun\">);<\/span><\/code><\/pre>\n<p>\u4ee5\u4e0a\u5c31\u662f\u8861\u91cf\u6211\u7684\u67e5\u8be2\u4e0e\u6211\u7684\u7535\u5f71\u96c6\u5408\u7684\u76f8\u4f3c\u6027\u7684\u4ee3\u7801\u3002\u6309\u6700\u76f8\u4f3c\u5ea6\u6392\u5e8f\uff08\u8d8a\u9ad8\u8d8a\u76f8\u4f3c\uff09\u5e76\u9009\u51fa\u6700\u6709\u53ef\u80fd\u201c\u9002\u5408\u5bb6\u5ead\u89c2\u770b\u201d\u7684\u524d 3 \u90e8\u7535\u5f71\u540e\uff0c\u8f93\u51fa\u5982\u4e0b\uff1a<\/p>\n<table>\n<thead>\n<tr>\n<td><strong>\u6807\u9898<\/strong><\/td>\n<td><strong>\u76f8\u4f3c\u5ea6<\/strong><\/td>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Toy Story<\/td>\n<td>0.66102695<\/td>\n<\/tr>\n<tr>\n<td>Shrek<\/td>\n<td>0.6457999<\/td>\n<\/tr>\n<tr>\n<td>The Lion King<\/td>\n<td>0.62360466<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u6b63\u5982\u4f60\u4ece\u8fd9\u4e2a\u4f8b\u5b50\u4e2d\u770b\u5230\u7684\uff0c\u50cf\u300aPulp Fiction\u300b\u548c\u300aInception\u300b\u8fd9\u6837\u7684\u7535\u5f71\u6ca1\u6709\u51fa\u73b0\u5728\u7ed3\u679c\u4e2d\uff0c\u56e0\u4e3a\u5b83\u4eec\u4e0d\u88ab\u8ba4\u4e3a\u662f\u201c\u9002\u5408\u5bb6\u5ead\u201d\u7684\u7535\u5f71\u3002<\/p>\n<p>\u867d\u7136 TorchSharp \u8ba9\u60a8\u53ef\u4ee5\u8f7b\u677e\u8ba1\u7b97\u4f59\u5f26\u76f8\u4f3c\u5ea6\uff0c\u4f46\u5c06\u5176\u6dfb\u52a0\u4e3a\u8be5\u51fd\u6570\u7684\u4f9d\u8d56\u9879\u53ef\u80fd\u6ca1\u6709\u610f\u4e49\u3002<\/p>\n<h3><strong>\u7f16\u5199\u60a8\u81ea\u5df1\u7684\u5b9e\u73b0<\/strong><\/h3>\n<p>\u5982\u679c\u60a8\u4e0d\u60f3\u4f7f\u7528\u53e6\u4e00\u4e2a\u5916\u90e8\u4f9d\u8d56\u9879\u6765\u4f7f\u7528\u5e94\u7528\u7a0b\u5e8f\u4e2d\u7684\u67d0\u4e9b\u64cd\u4f5c\uff0c\u5219\u53e6\u4e00\u4e2a\u9009\u62e9\u662f\u5b9e\u73b0\u60a8\u81ea\u5df1\u7684\u4f9d\u8d56\u9879\u3002\u8fd9\u5c31\u662f\u524d\u9762\u63d0\u5230\u7684\u67d0\u4e9b\u5e93\u6240\u505a\u7684\u3002 \u867d\u7136\u8fd9\u662f\u4e00\u6761\u53ef\u884c\u7684\u8def\u5f84\uff0c\u53ef\u4ee5\u4e3a\u60a8\u63d0\u4f9b\u5bf9\u4ee3\u7801\u7684\u6700\u5927\u63a7\u5236\u6743\uff0c\u4f46\u8fd9\u610f\u5473\u7740\u60a8\u6b63\u5728\u7f16\u5199\u6846\u67b6\u7ea7\u522b\u7684\u4ee3\u7801\uff0c\u800c\u4e0d\u662f\u4e13\u6ce8\u4e8e\u5e94\u7528\u7a0b\u5e8f\u6216\u4e1a\u52a1\u7684\u7ade\u4e89\u4f18\u52bf\u3002 \u60a8\u7684\u4ee3\u7801\u5f88\u53ef\u80fd\u662f\u8be5\u64cd\u4f5c\u7684\u7b80\u5355\u5b9e\u73b0\uff0c\u6ca1\u6709\u5145\u5206\u5229\u7528\u8fd0\u884c\u65f6\u7684\u786c\u4ef6\u4f18\u5316\u529f\u80fd\u3002<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-csharp prettyprinted\"><span class=\"kwd\">public<\/span> <span class=\"kwd\">float<\/span> <span class=\"typ\">CosineSimilarityCustom<\/span><span class=\"pun\">(<\/span><span class=\"typ\">ReadOnlySpan<\/span><span class=\"str\">&lt;float&gt;<\/span><span class=\"pln\"> vector1<\/span><span class=\"pun\">,<\/span> <span class=\"typ\">ReadOnlySpan<\/span><span class=\"str\">&lt;float&gt;<\/span><span class=\"pln\"> vector2<\/span><span class=\"pun\">)<\/span>\r\n<span class=\"pun\">{<\/span>\r\n    <span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">vector1<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Length<\/span> <span class=\"pun\">!=<\/span><span class=\"pln\"> vector2<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Length<\/span><span class=\"pun\">)<\/span>\r\n        <span class=\"kwd\">throw<\/span> <span class=\"kwd\">new<\/span> <span class=\"typ\">ArgumentException<\/span><span class=\"pun\">(<\/span><span class=\"str\">\"Vectors must have the same length\"<\/span><span class=\"pun\">);<\/span>\r\n\r\n    <span class=\"kwd\">float<\/span><span class=\"pln\"> dotProduct <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">0f<\/span><span class=\"pun\">;<\/span>\r\n    <span class=\"kwd\">float<\/span><span class=\"pln\"> magnitude1 <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">0f<\/span><span class=\"pun\">;<\/span>\r\n    <span class=\"kwd\">float<\/span><span class=\"pln\"> magnitude2 <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">0f<\/span><span class=\"pun\">;<\/span>\r\n\r\n    <span class=\"kwd\">for<\/span> <span class=\"pun\">(<\/span><span class=\"kwd\">int<\/span><span class=\"pln\"> i <\/span><span class=\"pun\">=<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> i <\/span><span class=\"pun\">&lt;<\/span><span class=\"pln\"> vector1<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Length<\/span><span class=\"pun\">;<\/span><span class=\"pln\"> i<\/span><span class=\"pun\">++)<\/span>\r\n    <span class=\"pun\">{<\/span><span class=\"pln\">\r\n        dotProduct <\/span><span class=\"pun\">+=<\/span><span class=\"pln\"> vector1<\/span><span class=\"pun\">[<\/span><span class=\"pln\">i<\/span><span class=\"pun\">]<\/span> <span class=\"pun\">*<\/span><span class=\"pln\"> vector2<\/span><span class=\"pun\">[<\/span><span class=\"pln\">i<\/span><span class=\"pun\">];<\/span><span class=\"pln\">\r\n        magnitude1 <\/span><span class=\"pun\">+=<\/span><span class=\"pln\"> vector1<\/span><span class=\"pun\">[<\/span><span class=\"pln\">i<\/span><span class=\"pun\">]<\/span> <span class=\"pun\">*<\/span><span class=\"pln\"> vector1<\/span><span class=\"pun\">[<\/span><span class=\"pln\">i<\/span><span class=\"pun\">];<\/span><span class=\"pln\">\r\n        magnitude2 <\/span><span class=\"pun\">+=<\/span><span class=\"pln\"> vector2<\/span><span class=\"pun\">[<\/span><span class=\"pln\">i<\/span><span class=\"pun\">]<\/span> <span class=\"pun\">*<\/span><span class=\"pln\"> vector2<\/span><span class=\"pun\">[<\/span><span class=\"pln\">i<\/span><span class=\"pun\">];<\/span>\r\n    <span class=\"pun\">}<\/span><span class=\"pln\">\r\n\r\n    magnitude1 <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">MathF<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Sqrt<\/span><span class=\"pun\">(<\/span><span class=\"pln\">magnitude1<\/span><span class=\"pun\">);<\/span><span class=\"pln\">\r\n    magnitude2 <\/span><span class=\"pun\">=<\/span> <span class=\"typ\">MathF<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Sqrt<\/span><span class=\"pun\">(<\/span><span class=\"pln\">magnitude2<\/span><span class=\"pun\">);<\/span>\r\n\r\n    <span class=\"kwd\">if<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">magnitude1 <\/span><span class=\"pun\">==<\/span> <span class=\"lit\">0<\/span> <span class=\"pun\">||<\/span><span class=\"pln\"> magnitude2 <\/span><span class=\"pun\">==<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">)<\/span>\r\n        <span class=\"kwd\">return<\/span> <span class=\"lit\">0<\/span><span class=\"pun\">;<\/span>  <span class=\"com\">\/\/ handle the case where one or both vectors have zero magnitude<\/span>\r\n\r\n    <span class=\"kwd\">return<\/span><span class=\"pln\"> dotProduct <\/span><span class=\"pun\">\/<\/span> <span class=\"pun\">(<\/span><span class=\"pln\">magnitude1 <\/span><span class=\"pun\">*<\/span><span class=\"pln\"> magnitude2<\/span><span class=\"pun\">);<\/span>\r\n<span class=\"pun\">}<\/span><\/code><\/pre>\n<p>\u8fd9\u5c31\u662f\u4f59\u5f26\u76f8\u4f3c\u5ea6\u7684\u81ea\u5b9a\u4e49\u5b9e\u73b0\u3002\u7136\u540e\u60a8\u53ef\u4ee5\u6309\u5982\u4e0b\u65b9\u5f0f\u4f7f\u7528\u5b83\u3002<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-csharp prettyprinted\"><span class=\"kwd\">var<\/span><span class=\"pln\"> top3MoviesCustom <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> \r\n    movies\r\n        <\/span><span class=\"pun\">.<\/span><span class=\"typ\">Select<\/span><span class=\"pun\">(<\/span><span class=\"pln\">movie <\/span><span class=\"pun\">=&gt;<\/span> \r\n            <span class=\"kwd\">new<\/span> <span class=\"pun\">{<\/span>\r\n                <span class=\"typ\">Title<\/span><span class=\"pun\">=<\/span><span class=\"pln\">movie<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Title<\/span><span class=\"pun\">,<\/span> \r\n                <span class=\"typ\">Embedding<\/span><span class=\"pun\">=<\/span><span class=\"pln\">movie<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Embedding<\/span><span class=\"pun\">,<\/span> \r\n                <span class=\"typ\">Similarity<\/span><span class=\"pun\">=<\/span><span class=\"typ\">CosineSimilarityCustom<\/span><span class=\"pun\">(<\/span><span class=\"pln\">queryEmbedding<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> movie<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Embedding<\/span><span class=\"pun\">)})<\/span>\r\n        <span class=\"pun\">.<\/span><span class=\"typ\">OrderByDescending<\/span><span class=\"pun\">(<\/span><span class=\"pln\">movies <\/span><span class=\"pun\">=&gt;<\/span><span class=\"pln\"> movies<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Similarity<\/span><span class=\"pun\">)<\/span>\r\n        <span class=\"pun\">.<\/span><span class=\"typ\">Take<\/span><span class=\"pun\">(<\/span><span class=\"lit\">3<\/span><span class=\"pun\">);<\/span><\/code><\/pre>\n<p>\u8fd9\u6bb5\u4ee3\u7801\u7684\u7ed3\u679c\u4e0e TorchSharp \u793a\u4f8b\u4e2d\u7684\u7ed3\u679c\u76f8\u540c\u3002\u867d\u7136\u5728\u8fd9\u79cd\u60c5\u51b5\u4e0b\u6ca1\u6709\u5916\u90e8\u4f9d\u8d56\u9879\uff0c\u4f46\u4f59\u5f26\u76f8\u4f3c\u5ea6\u73b0\u5728\u6210\u4e3a\u60a8\u9700\u8981\u7ef4\u62a4\u7684\u4e00\u7ec4\u6846\u67b6\u7ea7\u4ee3\u7801\u3002<\/p>\n<h3><strong>Tensor Primitives<\/strong><strong>\u4e4b\u540e<\/strong><\/h3>\n<p><span style=\"color: #ff0000;\">TensorPrimitives<\/span> \u7b80\u5316\u4e86\u8fd9\u4e9b\u9009\u62e9\u3002\u5982\u679c\u60a8\u53ea\u9700\u8981\u5c11\u91cf\u64cd\u4f5c\uff0c\u90a3\u4e48\u4e0d\u9700\u8981\u5728\u9879\u76ee\u4e2d\u52a0\u5165\u5927\u91cf\u7684\u5916\u90e8\u4f9d\u8d56\u9879\u3002<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-csharp prettyprinted\"><span class=\"kwd\">using<\/span> <span class=\"typ\">System<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Numerics<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Tensors<\/span><span class=\"pun\">;<\/span>\r\n\r\n<span class=\"kwd\">var<\/span><span class=\"pln\"> top3MoviesTensorPrimitives <\/span><span class=\"pun\">=<\/span><span class=\"pln\"> \r\n    movies\r\n        <\/span><span class=\"pun\">.<\/span><span class=\"typ\">Select<\/span><span class=\"pun\">(<\/span><span class=\"pln\">movie <\/span><span class=\"pun\">=&gt;<\/span> \r\n            <span class=\"kwd\">new<\/span> <span class=\"pun\">{<\/span>\r\n                <span class=\"typ\">Title<\/span><span class=\"pun\">=<\/span><span class=\"pln\">movie<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Title<\/span><span class=\"pun\">,<\/span> \r\n                <span class=\"typ\">Embedding<\/span><span class=\"pun\">=<\/span><span class=\"pln\">movie<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Embedding<\/span><span class=\"pun\">,<\/span> \r\n                <span class=\"typ\">Similarity<\/span><span class=\"pun\">=<\/span><span class=\"typ\">TensorPrimitives<\/span><span class=\"pun\">.<\/span><span class=\"typ\">CosineSimilarity<\/span><span class=\"pun\">(<\/span><span class=\"pln\">queryEmbedding<\/span><span class=\"pun\">,<\/span><span class=\"pln\"> movie<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Embedding<\/span><span class=\"pun\">)})<\/span>\r\n        <span class=\"pun\">.<\/span><span class=\"typ\">OrderByDescending<\/span><span class=\"pun\">(<\/span><span class=\"pln\">movies <\/span><span class=\"pun\">=&gt;<\/span><span class=\"pln\"> movies<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Similarity<\/span><span class=\"pun\">)<\/span>\r\n        <span class=\"pun\">.<\/span><span class=\"typ\">Take<\/span><span class=\"pun\">(<\/span><span class=\"lit\">3<\/span><span class=\"pun\">);<\/span><\/code><\/pre>\n<p>\u540c\u6837\uff0c\u5bf9\u4e8e\u4f7f\u7528 Semantic Kernel \u548c ML.NET \u7b49\u64cd\u4f5c\u7684\u5e93\u6765\u8bf4\uff0c\u4ed6\u4eec\u53ef\u4ee5\u7528 <span style=\"color: #ff0000;\">TensorPrimitives<\/span> \u66ff\u6362\u8bb8\u591a\u73b0\u6709\u7684\u5b9e\u73b0\uff0c\u8fd9\u6837\u5b83\u4eec\u5c31\u53ef\u4ee5\u4e13\u6ce8\u4e8e\u81ea\u5df1\u7684\u7ade\u4e89\u4f18\u52bf\u5e76\u66f4\u5feb\u5730\u4ea4\u4ed8\u529f\u80fd\u3002<\/p>\n<h2><strong>\u5f53\u524d\u72b6\u6001<\/strong><\/h2>\n<p>\u76ee\u524d\uff0c<span style=\"color: #ff0000;\">TensorPrimitives<\/span>\u4e3a\u4ee5\u4e0b\u64cd\u4f5c\u63d0\u4f9b\u4e86\u77e2\u91cf\u5316\u5b9e\u73b0\uff1a<\/p>\n<ul>\n<li>CosineSimilarity<\/li>\n<li>SoftMax<\/li>\n<li>Sigmoid<\/li>\n<li>Tanh<\/li>\n<li>Sinh<\/li>\n<li>Norm (L2)<\/li>\n<li>SumOfSquares<\/li>\n<li>ProductOfSums<\/li>\n<\/ul>\n<p>\u6709\u5173\u64cd\u4f5c\u7684\u5b8c\u6574\u5217\u8868\uff0c\u8bf7\u53c2\u9605<a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/92219\">\u8ddf\u8fdb\u4e2d\u7684Tensor Primitives\u5de5\u4f5c\u9879\u95ee\u9898<\/a>\u3002<\/p>\n<h2><strong>\u5efa\u8bae\u7528\u6cd5<\/strong><\/h2>\n<p>\u5728\u6700\u521d\u7684\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u89c2\u5bdf\u5230\u8be5\u5305\u5f15\u5165\u7684\u6027\u80fd\u6548\u7387\u5728\u5177\u6709\u5927\u91cf\u5143\u7d20\u7684tensor\u4e0a\u66f4\u4e3a\u660e\u663e\u3002<\/p>\n<h2><strong>\u4e0b\u4e00\u6b65\u8ba1\u5212\uff1f<\/strong><\/h2>\n<p>\u5728\u63a5\u4e0b\u6765\u7684\u51e0\u4e2a\u6708\u91cc\uff0c\u6211\u4eec\u8ba1\u5212\uff1a<\/p>\n<ul>\n<li>\u63d0\u4f9b\u66f4\u5168\u9762\u7684tensor\u64cd\u4f5c\u8986\u76d6\u3002<\/li>\n<li>\u5c06NET \u548c Semantic Kernel \u7b49\u5e93\u4e2d\u8fd9\u4e9b\u64cd\u4f5c\u7684\u73b0\u6709\u5b9e\u73b0\u66ff\u6362\u4e3aTensor Primitives \u5b9e\u73b0\u3002<\/li>\n<\/ul>\n<h2><strong>\u73b0\u5728\u5c31\u5f00\u59cb\u4f7f\u7528<\/strong><strong>Tensor Primitives<\/strong><\/h2>\n<p>\u5728\u60a8\u7684 .NET \u9879\u76ee\u4e2d\uff0c\u8bf7\u6dfb\u52a0\u5bf9\u6700\u65b0 <span style=\"color: #ff0000;\">System.Numeric.Tensors<\/span> NuGet \u5305\u7684\u5f15\u7528\u3002<\/p>\n<pre class=\" prettyprinted\" tabindex=\"0\"><code class=\"language-dotnet prettyprinted\"><span class=\"pln\">dotnet <\/span><span class=\"kwd\">add<\/span> <span class=\"kwd\">package<\/span> <span class=\"typ\">System<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Numeric<\/span><span class=\"pun\">.<\/span><span class=\"typ\">Tensors<\/span> <span class=\"pun\">--<\/span><span class=\"pln\">prerelease<\/span><\/code><\/pre>\n<p>\u8bf7\u5411\u6211\u4eec\u63d0\u4f9b\u53cd\u9988\u5e76\u5728 <a href=\"https:\/\/github.com\/dotnet\/runtime\">dotnet\/runtime \u5b58\u50a8\u5e93<\/a>\u4e2d\u63d0\u4ea4\u95ee\u9898\u3002<\/p>\n<h2><strong>\u793e\u533a\u8d21\u732e\u8005<\/strong><\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/wp-content\/uploads\/sites\/10\/2023\/10\/community-spotlight.jpg\" alt=\"Florian Verdonck\" \/><\/p>\n<p>\u6211\u662fFlorian Verdonck\uff0c\u4f4f\u5728\u6bd4\u5229\u65f6\u7684\u4f5b\u5170\u5fb7\u65af\u5730\u533a\u3002<\/p>\n<p>\u6211\u7684\u7b2c\u4e00\u6b21\u7f16\u7a0b\u662f\u572818\u5c81\u7684\u65f6\u5019\u3002VB.NET \u662f\u6211\u7684\u7b2c\u4e00\u95e8\u7f16\u7a0b\u8bed\u8a00\uff0c\u5728\u6211\u7684\u9ad8\u7b49\u6559\u80b2\u5373\u5c06\u7ed3\u675f\u65f6\uff0c\u6211\u66f4\u559c\u6b22 C# \u4f5c\u4e3a\u6211\u7684\u9996\u9009\u8bed\u8a00\u3002\u6211\u5f88\u5feb\u5c31\u5bf9 Web \u5f00\u53d1\u4ea7\u751f\u4e86\u5174\u8da3\u4f46\u5e76\u4e0d\u4e13\u95e8\u4ece\u4e8b\u524d\u7aef\u6216\u540e\u7aef\u5f00\u53d1\u3002\u968f\u7740\u6211\u804c\u4e1a\u751f\u6daf\u7684\u53d1\u5c55\uff0c\u6211\u4e00\u76f4\u6e34\u671b\u5b66\u4e60\u65b0\u7684\u8f6f\u4ef6\u548c\u5b9e\u8df5\u3002\u5728\u638c\u63e1\u4e86 C# \u548c\u9762\u5411\u5bf9\u8c61\u7f16\u7a0b\u7684\u7a8d\u95e8\u540e\uff0c\u6211\u5728\u5f53\u5730\u7684\u4e00\u6b21\u805a\u4f1a\u4e0a\u4e86\u89e3\u4e86\u51fd\u6570\u5f0f\u7f16\u7a0b\u5e76\u8fdb\u884c\u4e86\u5c1d\u8bd5\u3002<\/p>\n<p>\u63a2\u7d22\u51fd\u6570\u5f0f\u7f16\u7a0b\u8ba9\u6211\u5927\u5f00\u773c\u754c\u3002\u5b83\u62d3\u5bbd\u4e86\u6211\u5bf9\u8f6f\u4ef6\u884c\u4e1a\u8bb8\u591a\u4e8b\u60c5\u7684\u770b\u6cd5\uff0c\u4f8b\u5982\u4f7f\u7528\u6d41\u884c\u7684\u7f16\u7a0b\u8bed\u8a00\u65f6\u95f4\u8fc7\u957f\u4f1a\u8ba9\u60a8\u5fd8\u8bb0\u5176\u4ed6\u8bed\u8a00\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u65f6\u4e0d\u65f6\u8d70\u51fa\u8212\u9002\u533a\u5f88\u91cd\u8981\u3002<\/p>\n<p>\u63a2\u7d22 F# \u6765\u4e86\u89e3\u51fd\u6570\u5f0f\u7f16\u7a0b\u5bf9\u6211\u6765\u8bf4\u662f\u4e00\u4e2a\u5408\u4e4e\u903b\u8f91\u7684\u6b65\u9aa4\uff0c\u56e0\u4e3a\u6211\u5bf9 .NET \u975e\u5e38\u719f\u6089\u3002 \u6211\u559c\u6b22 F# \u4ee3\u7801\u7684\u7b80\u6d01\u6027\uff0c\u5e76\u4e14\u5b83\u4e0d\u9700\u8981\u4ece\u5934\u5f00\u59cb\u5c31\u53ef\u4ee5\u5b9e\u73b0\u529f\u80fd\uff0c\u60a8\u53ef\u4ee5\u4ece\u60a8\u6240\u77e5\u9053\u7684\u5f00\u59cb\uff0c\u5e76\u5728\u5b66\u4e60\u65b0\u6280\u672f\u65f6\u9010\u6e10\u5e94\u7528\u5b83\u4eec\u3002F# \u8fd8\u62e5\u6709\u4e00\u6b3e\u72ec\u4e00\u65e0\u4e8c\u5177\u6709\u5c0f\u529f\u80fd\u548c\u9690\u85cf\u5b9d\u77f3\u7684\u5b9d\u85cf\u624b\u5957\u3002\u6211\u7231\u4e0a\u4e86F#\u3002<\/p>\n<p>\u7531\u4e8e F# \u662f\u6211\u7684\u7b2c\u4e00\u79cd\u57fa\u4e8e\u7f29\u8fdb\u7684\u7f16\u7a0b\u8bed\u8a00\uff0c\u56e0\u6b64\u6211\u82b1\u4e86\u4e00\u4e9b\u65f6\u95f4\u6765\u9002\u5e94\u5b83\u7684\u8bed\u6cd5\u3002 \u5c31\u50cf\u6211\u5728\u5176\u4ed6\u8bed\u8a00\u4e2d\u6240\u505a\u7684\u90a3\u6837\uff0c\u6709\u4e00\u6837\u4e1c\u897f\u662f\u6211\u6240\u7f3a\u5c11\u7684\uff0c\u90a3\u5c31\u662f\u4ee3\u7801\u683c\u5f0f\u5316\u5668\u3002<\/p>\n<p>\u5f53\u6211\u8981\u5411\u5171\u4eab\u4ee3\u7801\u5e93\u6dfb\u52a0\u65b0\u4ee3\u7801\u65f6\uff0c\u6211\u5f88\u91cd\u89c6\u4ee3\u7801\u98ce\u683c\u7684\u4e00\u81f4\u6027\uff0c\u5e76\u4e14\u603b\u662f\u5c3d\u6211\u6700\u5927\u52aa\u529b\u4e3a\u5176\u4ed6\u4eba\u7740\u60f3\u3002\u5f53\u6211\u5f00\u59cb\u65f6\uff0cF# \u6ca1\u6709\u4efb\u4f55\u5f00\u7bb1\u5373\u7528\u7684\u89e3\u51b3\u65b9\u6848\u6765\u89e3\u51b3\u591a\u4e2a\u534f\u4f5c\u8005\u7684\u95ee\u9898\uff0c\u6709\u65f6\u4ed6\u4eec\u5177\u6709\u81ea\u5df1\u7684\u98ce\u683c\uff0c\u65e0\u6cd5\u5171\u4eab\u4ee3\u7801\uff0c\u56e0\u4e3a\u5b83\u6839\u672c\u6ca1\u6709\u4ee5\u666e\u904d\u7406\u89e3\u7684\u65b9\u5f0f\u683c\u5f0f\u5316\u3002\u8fd9\u5c31\u662f\u6211\u5f00\u59cb\u4e3a <a href=\"https:\/\/fsprojects.github.io\/fantomas\/\">Fantomas \u9879\u76ee<\/a>\u505a\u8d21\u732e\u7684\u539f\u56e0\uff0c\u4f5c\u4e3a <a href=\"https:\/\/fsharp.org\/mentorship\/\">F# \u57fa\u91d1\u4f1a\u6307\u5bfc\u8ba1\u5212<\/a>\u7684\u4e00\u90e8\u5206\u3002\u5728\u8be5\u9879\u76ee\u5931\u53bb\u4e3b\u8981\u7ef4\u62a4\u8005\u540e\uff0c\u6211\u7684\u5bfc\u5e08 <a href=\"https:\/\/anthonylloyd.github.io\/\">Anthony Lloyd<\/a>\u548c\u6211\u91cd\u65b0\u542f\u52a8\u4e86\u8be5\u9879\u76ee\u3002<\/p>\n<p>\u4e3a Fantomas \u505a\u51fa\u8d21\u732e\u5bf9\u6211\u7684\u804c\u4e1a\u751f\u6daf\u5f88\u6709\u5e2e\u52a9\u3002\u5b83\u4e0d\u4ec5\u8ba9\u6211\u83b7\u5f97\u4e86\u4e00\u4e9b\u771f\u5b9e\u7684 F# \u5de5\u4f5c\u7ecf\u9a8c\uff0c\u800c\u4e14\u8fd8\u5f15\u5bfc\u6211\u8ffd\u6c42\u5176\u4ed6\u5174\u8da3\uff0c\u5982\u516c\u5f00\u6f14\u8bb2\u3001\u4ea7\u54c1\u6240\u6709\u6743\u548c\u793e\u533a\u5efa\u8bbe\u3002 \u7ef4\u62a4 Fantomas \u662f\u6211\u5bf9 F# \u751f\u6001\u7cfb\u7edf\u7684\u8d21\u732e\uff0c\u5728\u8fd9\u4e2a\u8fc7\u7a0b\u4e2d\uff0c\u6211\u627e\u5230\u4e86\u4eba\u751f\u610f\u4e49\u548c\u5f52\u5c5e\u611f\u3002<\/p>\n<p>\u6211\u5bf9 Fantomas \u7684\u70ed\u60c5\u6709\u5b9e\u9645\u7684\u4e00\u9762\uff0c\u6211\u548c\u5927\u591a\u6570\u4e2a\u4eba\u5f00\u6e90\u7ef4\u62a4\u8005\u4e00\u6837\u5728\u4e1a\u4f59\u65f6\u95f4\u7814\u7a76\u5b83\uff0c\u4f46\u5728\u5f53\u65f6\u770b\u6765\uff0c\u5b83\u4e0d\u662f\u4e00\u4e2a\u771f\u6b63\u53ef\u9760\u6216\u7a33\u5b9a\u7684\u5de5\u5177\u3002 \u6bcf\u4e2a\u89d2\u843d\u90fd\u9690\u85cf\u7740\u4ee4\u4eba\u6cae\u4e27\u7684\u9519\u8bef\uff0c\u91c7\u7528\u7387\u6709\u9650\uff0c\u5e76\u4e14 F# \u7f16\u8bd1\u5668\u4e2d\u5b58\u5728\u4e0a\u6e38\u77ed\u7f3a\uff08Fantomas \u5728\u5185\u90e8\u4f7f\u7528 F# \u7f16\u8bd1\u5668\u7684\u89e3\u6790\u5668\uff09\u3002<\/p>\n<p>Fantomas \u7684\u5d1b\u8d77\u5f97\u76ca\u4e8e\u4f26\u6566\u91d1\u878d\u79d1\u6280\u516c\u53f8 G-Research \u7684\u652f\u6301\u3002 G-Research \u7684\u5f00\u6e90\u90e8\u95e8\u770b\u5230\u4e86\u8be5\u9879\u76ee\u7684\u6f5c\u529b\uff0c\u5e76\u51b3\u5b9a\u8d44\u52a9\u6211\u5728 Fantomas \u4e0a\u7684\u5de5\u4f5c\u3002\u8fd9\u4f7f\u5f97\u6211\u53ef\u4ee5\u6bcf\u5468\u90fd\u4e3a Fantomas \u6b63\u5f0f\u5de5\u4f5c\u3002<\/p>\n<p>G-Research \u7684\u8d5e\u52a9\u8ba9\u6211\u6709\u65f6\u95f4\u89e3\u51b3\u4ee3\u7801\u5e93\u4e2d\u66f4\u5177\u6311\u6218\u6027\u7684\u95ee\u9898\uff0c\u5e76\u4fc3\u4f7f\u6211\u5f00\u59cb\u4e3a F# \u7f16\u8bd1\u5668\u505a\u51fa\u8d21\u732e\u3002\u5728 Chet Husk \u7684\u5e2e\u52a9\u4e0b\uff0c\u6211\u6210\u529f\u63d0\u4ea4\u4e86\u6211\u7684\u7b2c\u4e00\u4e2a Pull \u8bf7\u6c42\uff0c\u5e76\u89e3\u51b3\u4e86\u89e3\u6790\u540e\u7f3a\u4e4f\u4fe1\u606f\u7684\u95ee\u9898\u3002 \u4e00\u65e6\u514b\u670d\u4e86\u6700\u521d\u4e3a\u7f16\u8bd1\u5668\u505a\u51fa\u8d21\u732e\u7684\u5fc3\u7406\u969c\u788d\uff0c\u6211\u5c31\u5f00\u59cb\u4e00\u6b21\u53c8\u4e00\u6b21\u5730\u505a\u8fd9\u4ef6\u4e8b\u3002F# \u56e2\u961f\u611f\u8c22\u5e76\u5e2e\u52a9\u6211\u505a\u51fa\u7684\u6240\u6709\u8d21\u732e\uff0c\u6211\u9f13\u52b1\u6bcf\u4e2a\u4eba\u90fd\u5c1d\u8bd5\u505a\u51fa\u8d21\u732e\uff01<\/p>\n<p>\u53bb\u5e74\uff0c\u6211\u5168\u804c\u52a0\u5165\u4e86 G-Research \u7684\u5f00\u6e90\u56e2\u961f\u3002\u4e0d\u4ec5\u81f4\u529b\u4e8e Fantomas\uff0c\u8fd8\u89e3\u51b3 F# \u7f16\u8bd1\u5668\u548c\u5de5\u5177\u4e2d\u66f4\u5927\u7684\u95ee\u9898\u3002\u5b83\u662f\u4e00\u5bb6\u613f\u610f\u79ef\u6781\u4e3a\u5176\u4f7f\u7528\u7684\u8f6f\u4ef6\u548c\u5de5\u5177\u505a\u51fa\u8d21\u732e\u7684\u516c\u53f8\u3002\u6211\u975e\u5e38\u5e78\u8fd0\u80fd\u591f\u6709\u5e78\u53c2\u4e0e\u8fd9\u4e9b\u6709\u8da3\u7684\u9879\u76ee\uff0c\u5e76\u6709\u673a\u4f1a\u53c2\u4e0e F# \u751f\u6001\u7cfb\u7edf\u7684\u6838\u5fc3\u5de5\u4f5c\u3002<\/p>\n<h2><strong>\u53cd\u9988\u7684\u91cd\u8981\u6027<\/strong><\/h2>\n<p>\u6700\u540e\uff0c\u6211\u4eec\u60f3\u5f3a\u8c03\u5728 .NET 8 \u9884\u89c8\u7248\u548c RC \u7248\u672c\u4e2d\u83b7\u53d6\u60a8\u7684\u53cd\u9988\u7684\u91cd\u8981\u6027\u3002\u60a8\u7684\u53cd\u9988\u6709\u52a9\u4e8e\u5851\u9020\u65b0\u7684 .NET \u4f53\u9a8c\u3002\u4e0b\u9762\u4e3e\u4e00\u4e9b\u4f8b\u5b50\u6765\u8bf4\u660e\u60a8\u53cd\u9988\u7684\u91cd\u8981\u6027\uff1a<\/p>\n<ul>\n<li><strong>NET Core<\/strong>\u3002 <a href=\"https:\/\/github.com\/dotnet\/aspnetcore\/issues\/50131\">\u91cd\u65b0\u8003\u8651\u5728 .NET 8 \u4e2d\u9ed8\u8ba4\u542f\u7528 HTTP\/3<\/a>\u3002<\/li>\n<li><strong>Blazor<\/strong>\u3002 <a href=\"https:\/\/github.com\/dotnet\/aspnetcore\/issues\/49079\">\u56f4\u7ed5 Blazor WebAssembly \u7684\u9879\u76ee\u7ed3\u6784\u548c TFM\uff0c\u6539\u53d8\u4e86\u4ed6\u4eec\u7684\u6574\u4e2a\u8ba1\u5212\u3002<\/a><\/li>\n<li><strong>Runtime<\/strong>\u3002 <a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/89937\">\u6fc0\u6d3b\u4e86\u8f83\u65b0\u7684 ARM64 \u786c\u4ef6\u529f\u80fd<\/a>\u5e76<a href=\"https:\/\/github.com\/dotnet\/runtime\/issues\/91981\">\u66f4\u65b0\u4e86 QueryInterface<\/a>\u3002<\/li>\n<li><strong>SDK<\/strong>\u3002 <a href=\"https:\/\/devblogs.microsoft.com\/dotnet\/announcing-dotnet-8-preview-4\/#sdk-simplified-output-path-updates\">\u6539\u8fdb\u4e86\u7b80\u5316\u7684\u8f93\u51fa\u8def\u5f84<\/a>\u5e76\u5b8c\u5584\u4e86\u7ec8\u7aef\u8bb0\u5f55\u5668\u3002\n<img decoding=\"async\" src=\"https:\/\/devblogs.microsoft.com\/dotnet\/announcing-dotnet-8-rc2\/modernbuildoutputdiagnostics.gif\" alt=\"Modern Terminal Logger\" \/><\/li>\n<li><strong>NuGet<\/strong>\u3002 <a href=\"https:\/\/github.com\/NuGet\/Home\/pull\/12310\">\u6539\u8fdb\u4e86\u65b0\u5305\u6f0f\u6d1e\u5ba1\u8ba1\u529f\u80fd\u7684\u8bbe\u8ba1<\/a>\u3002<\/li>\n<\/ul>\n<h2><strong>\u603b\u7ed3<\/strong><\/h2>\n<p>\u5728 .NET 8 \u53d1\u5e03\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u5411\u4e16\u754c\u5404\u5730\u6240\u6709\u70ed\u60c5\u7684 .NET \u5f00\u53d1\u4eba\u5458\u8868\u793a\u8877\u5fc3\u7684\u611f\u8c22\uff0c\u611f\u8c22\u4ed6\u4eec\u79ef\u6781\u63a2\u7d22\u548c\u6d4b\u8bd5\u9884\u89c8\u7248\u548c\u5019\u9009\u7248\u672c\u3002\u60a8\u5bf9 .NET \u751f\u6001\u7cfb\u7edf\u7684\u5949\u732e\u662f\u65e0\u4ef7\u7684\uff0c\u60a8\u7684\u53cd\u9988\u5bf9\u4e8e\u786e\u4fdd\u6700\u65b0\u7248\u672c\u7684\u53ef\u9760\u6027\u548c\u7a33\u5065\u6027\u53d1\u6325\u4e86\u5173\u952e\u4f5c\u7528\u3002\u611f\u8c22\u60a8\u6210\u4e3a\u8fd9\u4e00\u6fc0\u52a8\u4eba\u5fc3\u7684\u65c5\u7a0b\u4e2d\u5fc5\u4e0d\u53ef\u5c11\u7684\u4e00\u90e8\u5206\uff0c\u6211\u4eec\u8feb\u4e0d\u53ca\u5f85\u5730\u60f3\u770b\u770b\u60a8\u5f00\u59cb\u4f7f\u7528.NET 8\u3002<\/p>\n<p>\u5982\u679c\u5927\u5bb6\u6709\u4efb\u4f55\u7684\u6280\u672f\u95ee\u9898\uff0c\u6b22\u8fce\u5230\u6211\u4eec\u7684\u5b98\u65b9\u7684<a href=\"https:\/\/learn.microsoft.com\/zh-cn\/answers\/tags\/97\/dotnet\">.NET\u4e2d\u6587\u8bba\u575b<\/a> \u63d0\u95ee\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u7bc7\u7ffb\u8bd1\u4e8eJon Douglas\u7684Announcing .NET 8 Release Candidate 2 .NET 8 RC2 \u73b0\u5df2\u63a8\u51fa\u3002\u8fd9\u662f\u6211\u4eec\u6700\u540e\u4e00\u4e2a\u5019\u9009\u7248\u672c\u3002\u6b64\u7248\u672c\u5305\u542b .NET \u5305\u7684\u65b0 NuGet \u5305\u81ea\u8ff0\u6587\u4ef6\u3001\u9002\u7528\u4e8e MSBuild \u7684\u57fa\u4e8e CLI \u7684\u7b80\u5355\u9879\u76ee\u8bc4\u4f30\u3001\u5c06\u5bb9\u5668\u53d1\u5e03\u5230 tar.gz \u5b58\u6863\u4ee5\u53ca\u9002\u7528\u4e8e .NET \u7684 Tensor Primitives\u7b49\u5185\u5bb9\u3002 .NET Conf 2023\u7684\u65e5\u671f\u5df2\u516c\u5e03\uff01\u8bf7\u4e8e2023 \u5e74 11 \u6708 14 \u65e5\u81f3 16 \u65e5\u540c\u6211\u4eec\u4e00\u8d77\u5e86\u795d.NET 8 \u53d1\u5e03\u4f1a\u7684\u5f00\u5e55\uff01 \u4e0b\u8f7d\u9002\u7528\u4e8e Linux\u3001macOS \u548c Windows \u7684.NET 8 RC2 \u3002 \u5b89\u88c5\u7a0b\u5e8f\u548c\u4e8c\u8fdb\u5236\u6587\u4ef6 \u5bb9\u5668\u955c\u50cf \u53d1\u884c\u8bf4\u660et \u91cd\u5927\u66f4\u6539 \u5df2\u77e5\u7684\u95ee\u9898 GitHub \u95ee\u9898\u8ddf\u8e2a \u26a0\ufe0f\u91cd\u8981\u63d0\u793a: \u7531\u4e8e Razor [&hellip;]<\/p>\n","protected":false},"author":97248,"featured_media":523,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[16,15],"class_list":["post-517","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet-ch","tag-net-8","tag-featured-preview"],"acf":[],"blog_post_summary":"<p>\u672c\u7bc7\u7ffb\u8bd1\u4e8eJon Douglas\u7684Announcing .NET 8 Release Candidate 2 .NET 8 RC2 \u73b0\u5df2\u63a8\u51fa\u3002\u8fd9\u662f\u6211\u4eec\u6700\u540e\u4e00\u4e2a\u5019\u9009\u7248\u672c\u3002\u6b64\u7248\u672c\u5305\u542b .NET \u5305\u7684\u65b0 NuGet \u5305\u81ea\u8ff0\u6587\u4ef6\u3001\u9002\u7528\u4e8e MSBuild \u7684\u57fa\u4e8e CLI \u7684\u7b80\u5355\u9879\u76ee\u8bc4\u4f30\u3001\u5c06\u5bb9\u5668\u53d1\u5e03\u5230 tar.gz \u5b58\u6863\u4ee5\u53ca\u9002\u7528\u4e8e .NET \u7684 Tensor Primitives\u7b49\u5185\u5bb9\u3002 .NET Conf 2023\u7684\u65e5\u671f\u5df2\u516c\u5e03\uff01\u8bf7\u4e8e2023 \u5e74 11 \u6708 14 \u65e5\u81f3 16 \u65e5\u540c\u6211\u4eec\u4e00\u8d77\u5e86\u795d.NET 8 \u53d1\u5e03\u4f1a\u7684\u5f00\u5e55\uff01 \u4e0b\u8f7d\u9002\u7528\u4e8e Linux\u3001macOS \u548c Windows \u7684.NET 8 RC2 \u3002 \u5b89\u88c5\u7a0b\u5e8f\u548c\u4e8c\u8fdb\u5236\u6587\u4ef6 \u5bb9\u5668\u955c\u50cf \u53d1\u884c\u8bf4\u660et \u91cd\u5927\u66f4\u6539 \u5df2\u77e5\u7684\u95ee\u9898 GitHub \u95ee\u9898\u8ddf\u8e2a \u26a0\ufe0f\u91cd\u8981\u63d0\u793a: \u7531\u4e8e Razor [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/wp-json\/wp\/v2\/posts\/517","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/wp-json\/wp\/v2\/users\/97248"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/wp-json\/wp\/v2\/comments?post=517"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/wp-json\/wp\/v2\/posts\/517\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/wp-json\/wp\/v2\/media\/523"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/wp-json\/wp\/v2\/media?parent=517"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/wp-json\/wp\/v2\/categories?post=517"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/dotnet-ch\/wp-json\/wp\/v2\/tags?post=517"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}