最近对 ASP.NET Core (.NET 6.0) API 应用程序的 Visual Studio 解决方案进行的更改导致需要
"Microsoft.WindowsDesktop.App"
,框架条目被添加到 .runtimeconfig.json
文件中,但我不明白为什么。这是服务器部署的问题。
更改的重要部分是添加一个新的类库,在主 Web 应用程序项目中引用和使用。
新的
.runtimeconfig.json
:
{
"runtimeOptions": {
"tfm": "net6.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "6.0.0"
},
{
"name": "Microsoft.WindowsDesktop.App",
"version": "6.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "6.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Reflection.NullabilityInfoContext.IsSupported": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}
网络应用程序
.csproj
:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0-windows</TargetFramework>
...
</PropertyGroup>
<ItemGroup>
<PackageReference Include="*" Version="*" />
...
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\DataStuff.SqlData\DataStuff.SqlData.csproj" />
...
</ItemGroup>
</Project>
新的类库
DataStuff.SqlData.csproj
:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
...
</PropertyGroup>
<ItemGroup>
<None Remove="Scripts\*.sql" />
...
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Scripts\*.sql" />
...
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.1.5" />
</ItemGroup>
</Project>
新班级:
using Microsoft.Data.SqlClient;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace DataStuff.SqlData
{
public class SqlSetup
{
public SqlSetup(string stringVal)
{ //...
}
public async Task RunSetup()
{ //...
}
}
}
SqlSetup
已在 Web 应用程序服务集合中注册,并在 IHostedService
中被称为 “启动任务”
public async Task StartAsync(CancellationToken cancellationToken)
{ // ...
await sqlSetup.RunSetup();
}
与
SqlSetup.cs
一样,DataStuff.SqlData
项目还包含一些带有 SQL 脚本的嵌入式文本文件。 SqlSetup.RunSetup
使用 SqlCommand
来运行这些脚本。
调查:
Microsoft.WindowsDesktop.App
不存在构建输出(也不存在构建服务器上的最新构建,在最新版本之前 - 它所在的位置)。DataStuff.SqlData
类库并在应用程序中使用时,果然,Microsoft.WindowsDesktop.App
再次出现。Microsoft.WindowsDesktop.App
Dependencies
> Analyzers
下的网络应用程序项目中的分析器:
System.Windows.Forms.Analyzers
System.Windows.Forms.Analyzers.CSharp
我不确定分析器是否直接影响构建输出。似乎没有办法删除它们 - 至少在 VS 中很容易。我怀疑它们在那里,因为由于项目 TFM 的 windows
部分,它们
潜在可能有用,尽管目标始终是
net6.0-windows
- 因为这是一个重要包的支持目标 - 并且这在过去从未导致过 Microsoft.WindowsDesktop.App
要求。
任何解决此问题的帮助将不胜感激。这可能只是清楚地跟踪目标和依赖项所需的运行时的指导。
谢谢。
今天我在 App.runtimeconfig.json 中也遇到了额外的 Microsoft.WindowsDesktop.App 要求。事实证明,这是在我将 Microsoft.EntityFrameworkCore.SqlServer 更新到几天前发布的 7.0.16 后发生的。将版本恢复到 7.0.15 使 Microsoft.WindowsDesktop.App 要求消失。
看起来 Microsoft.EntityFrameworkCore.SqlServer 7.0.16 引入了一些 7.0.15 没有的新软件包。依赖项是:
Microsoft.EntityFrameworkCore.SqlServer 7.0.16
> Microsoft.Data.SqlClient 5.1.4
>> Microsoft.Identity.Client 4.56.0
>>> Microsoft.Identity.Client.NativeInterop 0.13.8 [new]
>>> Microsoft.Web.WebView2 1.0.864.35 [new]
> Azure.Identity 1.10.3
>> Microsoft.Identity.Client.Extensions.Msal 4.56.0
>>> System.IO.FIleSystem.AccessControl 5.0.0 [new]
特别有趣的是,Microsoft.Identity.Client 4.56.0的依赖项是:
碰巧我也使用net6.0-windows作为目标框架。所以我猜测 Microsoft.Identity.Client.NativeInterop 或 Microsoft.Web.WebView2 一定是添加 Microsoft.WindowsDesktop.App 要求的 nuget,尽管我不知道如何确定。