遷移 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 文件夾,重新構建即可

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章