You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:06:06