我正在使用这个命令:
dotnet publish -f net6.0 <project-name> -o <output-directory> -c "Release" /p:Platform="Any CPU"
以下是 .NET Core SDK 版本详细信息:
dotnet --version
7.0.203
dotnet --list-sdks
6.0.310 [C:\Program Files\dotnet\sdk]
6.0.311 [C:\Program Files\dotnet\sdk]
6.0.317 [C:\Program Files\dotnet\sdk]
7.0.203 [C:\Program Files\dotnet\sdk]
我正在尝试构建一个依赖于框架的“非独立”.NET 6.0 控制台应用程序,我可以在 Windows 和 Linux 上使用
dotnet <dllname>
运行该应用程序,但是当针对 net6.0
时,构建过程会生成一个非常错误的runtimeconfig.json
导致项目无法在Linux上运行:
{
"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.Reflection.Metadata.MetadataUpdater.IsSupported": false
}
}
}
我尝试添加一个
runtimeconfig.template.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"
}
],
"tfm": "net6.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "6.0.0"
}
],
"configProperties": {
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false
}
}
}
这是我的
.csproj
文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net6.0;net6.0-windows</TargetFrameworks>
<ApplicationIcon />
<OutputType>Exe</OutputType>
<StartupObject />
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'net6.0'">
<DefineConstants>NETCORE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(TargetFramework)' == 'net6.0-windows'">
<ApplicationManifest>app.manifest</ApplicationManifest>
<PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
<DefineConstants>NETFULL</DefineConstants>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\ErpSoftLeader.Api\ErpSoftLeader.Api.csproj" />
</ItemGroup>
</Project>
此项目针对一个目标构建于
net6.0-windows
中,针对另一目标构建于 net6.0
中。 Windows 构建按预期工作,多平台构建则不然。
为什么在构建中添加
Microsoft.WindowsDesktop.App
,而不是请求它,我如何控制 runtimeconfig.json
的输出,以便我的 Net6.0
构建不请求 Microsoft.WindowsDesktop.App
?
我必须补充一点,还有另一个项目使用相同的项目引用,它不会在runtimeconfig.json上犯这个错误,但是这个另一个项目在SDK属性中使用
Microsoft.NET.Sdk.Web
作为它的csproj,这有什么相关吗?
我明白了这里发生了什么,我的管道在构建该行之前有一个构建 net6.0-windows,因此之前的构建生成了 runtimeconfig.json 并将其保留在中间输出目录中,然后是 net6.0-windows。 0 构建过程会跳过生成此文件并仅将其复制到输出位置,删除此中间目录会导致 net6.0 构建过程实际生成此文件,并且正确而不是跳过它。 看来该项目正在将两个框架目标构建到同一中间目录,然后将其复制到输出位置,该中间目录未在解决方案中的任何配置文件中定义,并且不会使用
dotnet clean
命令清除,我我假设这是来自 -o
命令行选项的奇怪行为