.net-winform多平台编译设置 csproj配置
在JocPlanTaskTools计划任务管理项目中,管理工具采用了多平台设置:同时支持net45、net5.0-windows和net6.0-windows
现在想不同平台编译后的exe文件名做个区分,
配置如下:
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFrameworks>net45;net5.0-windows;net6.0-windows;</TargetFrameworks>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ApplicationIcon>_logo01.ico</ApplicationIcon>
<LangVersion>8.0</LangVersion>
<AssemblyName Condition="'$(TargetFramework)' == 'net45'">JocPlanTaskTools-net45</AssemblyName>
<AssemblyName Condition="'$(TargetFramework)' == 'net5.0-windows'">JocPlanTaskTools-net5</AssemblyName>
<AssemblyName Condition="'$(TargetFramework)' == 'net6.0-windows'">JocPlanTaskTools-net6</AssemblyName>
<Version>1.2022.1106.001</Version>
</PropertyGroup>
编译报错:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 NETSDK1005 资产文件“D:\GZProject\JocPlanTask\JocPlanTaskToolsCore\obj\project.assets.json”没有“net6.0-windows”的目标。确保已运行还原,且“net6.0-windows”已包含在项目的 TargetFrameworks 中。 JocPlanTaskTools C:\Program Files\dotnet\sdk\6.0.300\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets 267
错误 NETSDK1005 资产文件“D:\GZProject\JocPlanTask\JocPlanTaskToolsCore\obj\project.assets.json”没有“net5.0-windows”的目标。确保已运行还原,且“net5.0-windows”已包含在项目的 TargetFrameworks 中。 JocPlanTaskTools C:\Program Files\dotnet\sdk\6.0.300\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets 267
错误 NETSDK1005 资产文件“D:\GZProject\JocPlanTask\JocPlanTaskToolsCore\obj\project.assets.json”没有“net45”的目标。确保已运行还原,且“net45”已包含在项目的 TargetFrameworks 中。 JocPlanTaskTools C:\Program Files\dotnet\sdk\6.0.300\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets 267
查看obj\project.assets.json文件内容如下:
{
"version": 3,
"targets": {},
"libraries": {},
"projectFileDependencyGroups": {},
"packageFolders": {
"C:\\Users\\Garson\\.nuget\\packages\\": {}
},
"project": {
"restore": {
"projectUniqueName": "D:\\GZProject\\JocPlanTask\\JocPlanTaskToolsCore\\JocPlanTaskTools.csproj",
"projectPath": "D:\\GZProject\\JocPlanTask\\JocPlanTaskToolsCore\\JocPlanTaskTools.csproj",
"packagesPath": "C:\\Users\\Garson\\.nuget\\packages\\",
"outputPath": "D:\\GZProject\\JocPlanTask\\JocPlanTaskToolsCore\\obj\\",
"projectStyle": "PackageReference",
"configFilePaths": [
"C:\\Users\\Garson\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"D:\\OneDrive\\NugetTest": {},
"https://api.nuget.org/v3/index.json": {}
}
}
},
"logs": [
{
"code": "NU1105",
"level": "Error",
"message": "无法读取“JocPlanTaskTools”的项目信息: 序列包含一个以上的元素"
}
]
}
原因分析
经过大量的尝试,得出一个结论:
在PropertyGroup节点中,条件使用 Condition="'$(TargetFramework)' == 'net45'"
这样的,编辑就会报错,
但是如果把 net45
改成一个不存在的,比如net45_0001
这样就不会报错了,很奇怪,具体为什么这样,不知道,得出结论就是这样,
解决
既然不能直接用==,那我们可以用IndexOf这样的条件,
如下:
<PropertyGroup>
<MyAssemblyName>$(MSBuildProjectName)</MyAssemblyName>
<MyAssemblyName Condition="$(TargetFramework.IndexOf('.net45')) == 0">$(MSBuildProjectName)-net45</MyAssemblyName>
<MyAssemblyName Condition="$(TargetFramework.IndexOf('.net5.0-windows')) == 0">$(MSBuildProjectName)-net5</MyAssemblyName>
<MyAssemblyName Condition="$(TargetFramework.IndexOf('.net6.0-windows')) == 0">$(MSBuildProjectName)-net6</MyAssemblyName>
</PropertyGroup>
<PropertyGroup>
<AssemblyName>$(MyAssemblyName)</AssemblyName>
</PropertyGroup>
csproj文件完整内容如下:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFrameworks>net45;net5.0-windows;net6.0-windows;</TargetFrameworks>
<Nullable>enable</Nullable>
<UseWindowsForms>true</UseWindowsForms>
<ApplicationIcon>_logo01.ico</ApplicationIcon>
<LangVersion>8.0</LangVersion>
<Version>1.2022.1106.001</Version>
</PropertyGroup>
<PropertyGroup>
<MyAssemblyName>$(MSBuildProjectName)</MyAssemblyName>
<MyAssemblyName Condition="$(TargetFramework.IndexOf('.net45')) == 0">$(MSBuildProjectName)-net45</MyAssemblyName>
<MyAssemblyName Condition="$(TargetFramework.IndexOf('.net5.0-windows')) == 0">$(MSBuildProjectName)-net5</MyAssemblyName>
<MyAssemblyName Condition="$(TargetFramework.IndexOf('.net6.0-windows')) == 0">$(MSBuildProjectName)-net6</MyAssemblyName>
</PropertyGroup>
<PropertyGroup>
<AssemblyName>$(MyAssemblyName)</AssemblyName>
</PropertyGroup>
<ItemGroup>
<Content Include="_logo01.ico" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\JocPlanTaskCore\JocPlanTaskCore.csproj" />
</ItemGroup>
</Project>