619:docker安装,故障排查;toolkit源生成器报错:风格迁移

docker安装

弹窗核心提示:Virtualization support not detected(未检测到硬件虚拟化)

Docker Desktop 依赖 CPU 硬件虚拟化(WSL2/Hyper-V),没开启就无法启动引擎,左下角 Engine stopped 也印证服务未运行,登录按钮完全解决不了该问题。

The MVVM Toolkit source generators might not be loaded correctly... Source generators require PackageReference to be used

Mvvmtoolkit源生成器报错

怎么理解SDK 风格迁移 SDK 风格项目,意思是我的框架过老吗?不能使用新版的MVVMTooklet

风格迁移

怎么理解SDK 风格迁移 SDK 风格项目,意思是我的框架过老吗?不能使用新版的MVVMTooklet

不是框架过老!先给你吃颗定心丸:

.NET Framework 4.7.2 完全能用新版 CommunityToolkit.Mvvm 8.4.2。你的问题不是框架版本,而是 .csproj 项目文件的格式。

  1. 什么是旧式 .csproj 和 SDK 风格 .csproj?
    看你现在这个文件的开头:
XML 复制代码
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

这种就是旧式项目文件,特点:

每个 .cs 文件都要手工写

包引用、资源、配置都混在一起

源生成器(Source Generator)支持不完善

而 SDK 风格 长这样:

xml 复制代码
<Project Sdk="Microsoft.NET.Sdk">
  <<PropertyGroup>
    <<TargetFramework>net472</TargetFramework>
    <<OutputType>WinExe</OutputType>
    <<UseWPF>true</UseWPF>
  </PropertyGroup>
</Project>

特点:

一行 Sdk="Microsoft.NET.Sdk" 搞定大量默认行为

自动识别 .cs、.xaml 文件,不用逐个写

对 Source Generator 支持更好

包引用更简洁

  1. SDK 风格 ≠ 只能跑 .NET 6/7/8
    很多人误会 SDK 风格项目只能 targeting .NET Core / .NET 5+,其实不是。
    你可以写:
xml 复制代码
<TargetFramework>net472</TargetFramework>

这样项目还是 .NET Framework 4.7.2,WPF 也能继续跑,但 项目文件格式升级了,能享受新工具链的好处。

3.为什么你的 ObservableProperty 不生效?

CommunityToolkit.Mvvm 的 ObservableProperty 依赖 Roslyn Source Generator(编译时自动生成 Records 这些属性)。

旧式 .csproj 对 Source Generator 的支持比较弱,经常会出现:

清理重建后第一次报错

属性生成不出来

需要重启 VS 才能识别

SDK 风格项目里这些问题就少很多。

  1. 迁移是什么意思?

不是重写程序,也不是升级 .NET Framework 版本。只是把 .csproj 文件从旧格式改成新格式。

迁移后:

MainWindow.xaml、App.xaml、所有 .cs 文件可以保留

引用的 CommunityToolkit.Mvvm、MySql.Data 等 NuGet 包保留

目标框架还是 net472

但 .csproj 变得干净很多

  1. 迁移难吗?
    对于你这种项目,不难。大致流程:

备份原 .csproj

把 .csproj 改成 SDK 风格

删除所有 <Compile Include="..."><Page Include="..."> 等手工列出的文件

保留 <PackageReference> 和特殊引用(如 halcondotnet)

重新加载项目,编译测试

  1. 你现在不用迁移也能继续跑
    如果你觉得迁移麻烦,完全可以不改,只要手动把 ObservableProperty 改成普通属性就行,这是最快见效的。
    .NET Framework 4.7.2
    运行时框架,不落后
    CommunityToolkit.Mvvm
    可以在 .NET Framework 4.7.2 上跑
    旧式 .csproj
    项目文件格式老,Source Generator 支持差
    SDK 风格 .csproj
    项目文件格式新,自动包含文件,Source Generator 支持好
    迁移
    只改项目文件格式,不改代码框架

为什么我的.csproj会是老的格式

这是由项目创建时用的 Visual Studio 版本和项目模板决定的

ToolsVersion="15.0" 对应的是 MSBuild 15,也就是 Visual Studio 2017。所以这个项目大概率是用 VS 2017 或更早版本创建的,或者用的是那时候的 WPF 模板。

  1. 微软是什么时候开始换 SDK 风格的?

    2016 年之前:所有 .NET Framework 项目都是旧式 .csproj

    2016 年:SDK 风格项目随 .NET Core 一起推出

    2017-2019 年:.NET Core / .NET 5+ 项目默认走 SDK 风格,但 .NET Framework WPF/WinForms 项目仍然默认旧式

    2020 年左右:VS 2019 16.3+ 开始支持 .NET Core 3 的 WPF/WinForms,这时候才有 SDK 风格 WPF 模板

    现在(VS 2022):新建 .NET Framework WPF 项目默认还是旧式,除非手动选 .NET 6/7/8/9 的 WPF 模板

  2. 为什么 .NET Framework WPF 不默认 SDK 风格?

    因为微软的策略是:

SDK 风格 = 新 .NET(Core/5+)默认项目格式

旧式 .csproj = 兼容历史 .NET Framework 项目

.NET Framework 本身已经停止大版本更新,所以微软没有去改它的默认模板。你在 VS 2022 里新建一个 .NET Framework 4.7.2 WPF 应用,它给你的仍然是旧式 .csproj。