如何对包含UWP与.NET Core/.NET 6测试项目的解决方案执行dotnet test?
问题根因
你遇到的报错属于dotnet CLI的原生设计限制,并非配置遗漏:
- dotnet CLI 自带的是跨平台版本的MSBuild,仅包含.NET Core/.NET 5+/NET Standard相关的构建目标文件,不包含UWP项目依赖的
Microsoft.Windows.UI.Xaml.CSharp.targets这类Windows平台专属的构建组件 - UWP的构建目标仅随Visual Studio的「通用Windows平台开发」工作负载安装,存放在Visual Studio的安装目录下,dotnet CLI执行时只会在自身的SDK目录下查找构建目标,因此会抛出MSB4019错误。
统一构建测试的可行方案
方案1:全流程使用MSBuild + VSTest.Console(推荐)
全功能版MSBuild(随Visual Studio安装,可通过Developer Command Prompt for VS直接调用)兼容所有项目类型,不需要拆分命令:
- 还原解决方案所有项目依赖:
msbuild 你的解决方案.sln /t:Restore /p:Configuration=Release /p:Platform=x64
注意:UWP项目不支持AnyCPU架构,必须明确指定x86/x64/ARM等具体架构参数
- 构建所有项目:
msbuild 你的解决方案.sln /t:Build /p:Configuration=Release /p:Platform=x64 /p:AppxPackageSigningEnabled=false
不需要对UWP项目做应用包签名的场景可添加
AppxPackageSigningEnabled=false参数,避免签名报错
- 统一执行所有测试:
vstest.console.exe **\*Test.dll **\*Test.appx /Platform:x64 /InIsolation
该命令可同时识别.NET 单元测试dll和UWP测试包appx,一次跑完所有测试用例
方案2:配置UWP项目自动跳过dotnet CLI构建
如果需要保留dotnet CLI处理非UWP项目的流程,可以在所有UWP项目的.csproj文件中添加运行时判断逻辑,让dotnet CLI执行时自动跳过UWP项目:
在UWP项目文件的首行PropertyGroup节点下添加如下配置:
<PropertyGroup> <!-- dotnet CLI运行时MSBuildRuntimeType为Core,此时标记当前项目不参与测试、不编译 --> <IsTestProject Condition="'$(MSBuildRuntimeType)' == 'Core'">false</IsTestProject> <EnableDefaultCompileItems Condition="'$(MSBuildRuntimeType)' == 'Core'">false</EnableDefaultCompileItems> </PropertyGroup> <!-- 仅在非dotnet CLI运行时导入UWP专属构建目标 --> <Import Project="$(MicrosoftWindowsXamlSdkPath)Microsoft.Windows.UI.Xaml.CSharp.targets" Condition="'$(MSBuildRuntimeType)' != 'Core'" />
配置完成后执行dotnet build/dotnet test只会处理.NET Standard/.NET Core/.NET 6的项目,不会触发UWP项目的构建报错,UWP项目的构建测试单独用MSBuild和VSTest.Console执行即可。
内容的提问来源于stack exchange,提问作者Aron
相关产品推荐
相关产品推荐

