如何使用CMake构建C#单元测试项目?VS2017编译.NET引用报错如何解决
问题根因
你碰到的报错是Visual Studio 2017处理CMake导入的外部SDK风格C#项目时的兼容性问题:include_external_msproject默认会按照传统.NET Framework项目的逻辑识别框架版本,你配置的.NET Core 2.1目标框架没有被正确识别,MSBuild就默认要求引用.NET Framework 4.0。
现有方案修复步骤
- 第一步:修改
dotnet_xunit_template.csproj.in,补充兼容的目标框架标识,关闭默认编译项自动包含逻辑,避免文件重复报错,PropertyGroup块修改为如下内容:
<PropertyGroup> <ProjectName>@PROJECT_NAME@</ProjectName> <!-- 同时声明.NET Core和兼容的.NET Framework版本,适配VS2017的识别逻辑 --> <TargetFrameworks>netcoreapp2.1;net461</TargetFrameworks> <IsPackable>false</IsPackable> <!-- 禁用默认编译项,和你手动拼接的Compile节点适配 --> <EnableDefaultCompileItems>false</EnableDefaultCompileItems> </PropertyGroup>
- 第二步:修改
CMakeLists.txt,给include_external_msproject补充指定项目语言,避免默认识别错误:
include_external_msproject( ${PROJECT_NAME} ${PROJECT_NAME}.csproj TYPE CSharp )
- 第三步:清理缓存后重新构建:关闭VS,删除生成的
.vs文件夹、CMake缓存的build文件夹,重新打开项目执行CMake生成,再运行NuGet还原后构建即可。
其他可行实现方案
- 方案1:用CMake 3.18+内置的C#原生支持直接构建项目,不需要模板生成csproj,示例写法如下:
cmake_minimum_required(VERSION 3.18) # 直接指定CSharp语言,启用内置C#支持 project(xunitproject LANGUAGES CSharp) add_library(${PROJECT_NAME} SHARED UnitTest1.cs ) set_property(TARGET ${PROJECT_NAME} PROPERTY DOTNET_SDK "Microsoft.NET.Sdk" ) set_property(TARGET ${PROJECT_NAME} PROPERTY DOTNET_TARGET_FRAMEWORK "netcoreapp2.1" ) # 直接声明NuGet依赖 set_property(TARGET ${PROJECT_NAME} PROPERTY VS_PACKAGE_REFERENCES "Microsoft.NET.Test.Sdk_15.9.0" "xunit_2.4.0" "xunit.runner.visualstudio_2.4.0" )
- 方案2:跳过CMake对C#项目的直接管理,用自定义命令调用dotnet CLI构建,不需要处理csproj兼容问题,示例写法:
# 生成csproj的原有逻辑保留 configure_file(dotnet_xunit_template.csproj.in ${PROJECT_NAME}.csproj @ONLY) # 自定义构建目标调用dotnet命令 add_custom_target(${PROJECT_NAME} ALL COMMAND dotnet build ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.csproj -c Release DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.csproj WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} ) # 可配套添加测试执行目标 add_custom_target(test_${PROJECT_NAME} COMMAND dotnet test ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.csproj -c Release WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} )
- 方案3:升级到Visual Studio 2022+和CMake 3.20+,高版本已经修复了SDK风格C#项目的导入识别问题,不需要额外修改兼容配置。
内容的提问来源于stack exchange,提问作者geodoer
相关产品推荐
相关产品推荐

