迁移 dotnet 6 提示必须将目标平台设置为 Windows 平台


我在迁移一个古老的项目为 .NET 6 框架,但是 VS 提示 error NETSDK1136 如果使用 Windows 窗体或 WPF,或者引用使用 Windows 窗体或 WPF 的项目或包,则必须将目标平台设置为 Windows 平台。但是我不想让此项目绑定到 Windows 平台上,不在 TargetFramework 上修改为 net6.0-windows 框架

此提示是在 .NET 的 SDK 的 Microsoft.NET.Sdk.DefaultItems.targets 文件开启的,代码如下

  <Target Name="_CheckForInvalidWindowsDesktopTargetingConfiguration"
        BeforeTargets="_CheckForInvalidConfigurationAndPlatform"
        Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp' and $([MSBuild]::VersionGreaterThanOrEquals($(_TargetFrameworkVersionWithoutV), '5.0')) and ('$(UseWindowsForms)' == 'true' or '$(UseWPF)' == 'true')">
    <NETSdkError Condition="'$(TargetPlatformIdentifier)' != 'Windows'"
                 ResourceName="WindowsDesktopTargetPlatformMustBeWindows" />
  </Target>

或者定义在 Microsoft.NET.Sdk.DefaultItems.Shared.targets 代码

  <Target Name="_CheckForTransitiveWindowsDesktopDependencies"
          AfterTargets="ResolvePackageAssets"
          Condition="'$(TargetFrameworkIdentifier)' == '.NETCoreApp' and $([MSBuild]::VersionGreaterThanOrEquals($(_TargetFrameworkVersionWithoutV), '5.0')) and '$(TargetPlatformIdentifier)' != 'Windows' and '@(TransitiveFrameworkReference)' != ''">
    <ItemGroup>
      <_WindowsDesktopTransitiveFrameworkReference Include="@(TransitiveFrameworkReference)"
                                                   Condition="'%(Identity)' == 'Microsoft.WindowsDesktop.App' Or
                                                              '%(Identity)' == 'Microsoft.WindowsDesktop.App.WPF' Or
                                                              '%(Identity)' == 'Microsoft.WindowsDesktop.App.WindowsForms'" />
    </ItemGroup>
    <NetSdkError Condition="'@(_WindowsDesktopTransitiveFrameworkReference)' != ''"
                 ResourceName="WindowsDesktopTargetPlatformMustBeWindows" />
  </Target>

也就是说在 .NET 5.0 和以上的版本,判断到有使用 Windows Forms 或 WPF 就提示需要加上 Windows 平台

这里的判断是包括项目本身和项目所依赖的所有项目和库,只要有一个用到了,将会提示需要加上 Windows 平台

在设置加上 Windows 平台,就自然引用了 Windows Forms 或 WPF 的负载。而我的项目不期望绑定到 Windows 上,就需要去寻找是哪些依赖的项目或库使用到了 Windows Forms 或 WPF 项目

这里必须说明的是 WPF 和 Windows Forms 在啥都不做的情况下,包括 MONO 等都不使用的情况下,是可以有限的支持在 Linux 和 MAC 环境下运行的。什么是有限的支持?只要不碰 Windows 相关平台的逻辑,包括 PInvoke 调用等,那么将可以很好运行

例如只是用到了 WPF 的一些结构体定义,如 Rect 和 Size 等。或者用到了枚举定义,或者用到某些工具方法等等

而我当前的项目刚好就是存在某些依赖库,引用了 WPF 只是为了用到 Size 等定义而已。为了干掉依赖,我换成了 https://github.com/dotnet-campus/dotnetCampus.WPFType 开源库代替引用 WPF 项目。这个开源库拷贝了 WPF 的一些类型定义,基于 MIT 协议

但是在逐步干掉所有的依赖,依然提示如下

C:\Program Files\dotnet\sdk\6.0.100\Sdks\Microsoft.NET.Sdk\targets\Microsoft.NET.Sdk.DefaultItems.Shared.targets(250,5): error NETSDK1136: 如果使用 Windows 窗体或 WPF,或者引用使用 Windows 窗体或 WPF 的项目或包,则必须将目标平台设置 为 Windows (通常通过在 TargetFramework 属性中添加 "-windows")。

实际上原因是在 obj 文件夹里面有缓存,只需要删除 obj 文件夹,重新构建即可

引用来源:https://www.cnblogs.com/lindexi/archive/2022/01/26/15845376.html

版权声明:本文为YES开发框架网发布内容,转载请附上原文出处连接
管理员
上一篇:dotnet C# 根据椭圆长度和宽度和旋转角计算出椭圆中心点的方法
下一篇:一劳永逸,解决.NET发布云服务器的时区问题
评论列表

发表评论

评论内容
昵称:
关联文章

迁移 dotnet 6 提示必须目标平台设置 Windows 平台
dotnet 自动代码格式化机器人带入团队 GitLab 平台
.net-winform多平台编译设置 csproj配置
探索 dotnet core 何在 Windows7 系统需要补丁的原因
Asp.NetCore3.1开源项目升级.Net6.0
03.设置设备连接路由器
.NET各平台 版本号:TargetFramework
Windows 文件夹设置了Everyone权限后无法删除
dotnet OpenXML 聊聊文本段落对齐方式
网站迁移纪实:从Web Form 到 Asp.Net Core (Abp vNext 自定义开发)
windows平台的分布式微服务解决方案(6)--IUtility工具介绍
JOC快速开发平台添加了水印设置
VS制作C#程序windows安装程序
《步步入门》 .NET 6 部署到Linux
windows Redis配置
JQueryform表单转换json,并提交后台处理
windows Service 读取app.config AppSettings
必须使用适当的属性或方法修改referer标头
纸壳CMS v3.5升级.Net 6免费下载
WPF DataGrid 如何被选中行带到视野中

联系我们
联系电话:15090125178(微信同号)
电子邮箱:garson_zhang@163.com
站长微信二维码
微信二维码