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

CMake构建C++宿主调用.NET 6 CoreCLR时Visual Studio调试器不匹配问题

CMake生成的C++宿主项目在Visual Studio中调试CoreCLR报错问题

场景说明

我正在开发一个小型项目,需要通过C++宿主程序运行.NET 6.0托管代码。
我参照了MSDN官方托管教程,使用了官方GitHub示例项目作为参考。
示例项目可正常运行,但我将其迁移为CMake项目后,Visual Studio调试器出现异常。

问题现象

当前遇到的问题是Visual Studio启动调试会话时调用了错误的调试器:
启动调试时默认使用Desktop CLR (.NET Framework)托管调试器,但目标进程加载的是CoreCLR运行时,需要使用「Managed (CoreCLR)」调试器,因此Visual Studio抛出如下错误:

A fatal error has occurred and debugging needs to be terminated.
The debugger was configured to use the Desktop CLR (.NET Framework) Managed debugger,
but the target process loaded the CoreCLR (.NET Core) runtime.
To debug this project, configure it to use the 'Managed (CoreCLR)' debugger.

该问题仅在Visual Studio内启动调试时出现,不附加调试器直接运行程序无任何异常。

咨询问题

我想咨询两个问题:

  1. 是否可以直接在CMakeLists.txt中指定Visual Studio使用的调试器类型,若可以该如何配置?
  2. 若不支持通过CMake配置,在Visual Studio中打开CMake项目时该如何手动切换激活的调试器?

参考配置

当前项目的CMakeLists.txt配置如下:

根目录CMakeLists.txt

# File generated by the CMakeHelper vscode extension
cmake_minimum_required(VERSION 3.16.0)
# Project
project("dotnet-scripting" VERSION 1.0.0.0 LANGUAGES C CXX)
# Project version variable
set(DOTNET_SCRIPTING_VERSION "${dotnet-scripting_VERSION}")
# Set C standard
set(CMAKE_C_STANDARD_REQUIRED true)
set(CMAKE_C_STANDARD 11)
# Set CXX standard
set(CMAKE_CXX_STANDARD_REQUIRED true)
set(CMAKE_CXX_STANDARD 11)
# Set binary output directory
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_SOURCE_DIR}/bin/${CMAKE_BUILD_TYPE}")
# Add child projects
add_subdirectory("dotnet-scripting")

可执行文件子项目CMakeLists.txt

# File generated by the CMakeHelper vscode extension
cmake_minimum_required(VERSION 3.16.0)
# Project
project("dotnet-scripting" VERSION 1.0.0 LANGUAGES C CXX)
# Project version variable
set(DOTNET_SCRIPTING_VERSION "${dotnet-scripting_VERSION}" PARENT_SCOPE)
# Set C standard
set(CMAKE_C_STANDARD_REQUIRED true)
set(CMAKE_C_STANDARD 11)
# Set CXX standard
set(CMAKE_CXX_STANDARD_REQUIRED true)
set(CMAKE_CXX_STANDARD 17)
# Source files
Set(DOTNET_SCRIPTING_SOURCE_FILES
    "src/main.cpp"
    "src/coreclr_delegates.h"
    "src/hostfxr.h"
    "src/nethost.h"
)
# Set Target
if(WIN32)
    message("Buidling dotnet-scripting on WIN32")
    add_executable("dotnet-scripting" "${DOTNET_SCRIPTING_SOURCE_FILES}")
    # Set binary name
    set_target_properties("dotnet-scripting" PROPERTIES OUTPUT_NAME "dotnet-scripting")
    set_target_properties("dotnet-scripting" PROPERTIES COMMON_LANGUAGE_RUNTIME "")
endif()
# Global include directories
list(APPEND "DOTNET_SCRIPTING_INCLUDE_DIR_LIST" "${PROJECT_SOURCE_DIR}/include")
# Set target include directories
target_include_directories("dotnet-scripting" PUBLIC "${DOTNET_SCRIPTING_INCLUDE_DIR_LIST}")

注意
项目源码内容与官方示例完全一致,仅将示例中的nativehost.cpp重命名为main.cpp。

项目目录结构

Root
|-bin/Debug
|   |- dotnet-scripting.exe
|   |- dotnet-scripting.ilk
|   |- dotnet-scripting.pdb
|   |- DotNetLib.dll
|   |- DotNetLib.runtimeconfig.json
|   |- hostfxr.dll
|-dotnet-scripting
|   |-src
|      |-coreclr_delegates.h
|      |-hostfxr.h
|      |-main.cpp
|      |-nethost.h
|   |-CMakeLists.txt <-- 可执行文件子项目配置
|-CMakeLists.txt <-- 根项目配置

解决方案

方法1:通过CMakeLists.txt直接配置调试器类型

CMake原生支持通过目标属性指定Visual Studio调试器类型,你只需要在可执行文件子项目的Windows平台配置段,添加一行VS_GLOBAL_DEBUGGER_TYPE属性配置即可,CoreCLR调试器对应的属性值为ManagedCore:

if(WIN32)
    message("Buidling dotnet-scripting on WIN32")
    add_executable("dotnet-scripting" "${DOTNET_SCRIPTING_SOURCE_FILES}")
    # Set binary name
    set_target_properties("dotnet-scripting" PROPERTIES OUTPUT_NAME "dotnet-scripting")
    set_target_properties("dotnet-scripting" PROPERTIES COMMON_LANGUAGE_RUNTIME "")
    # 新增以下行指定CoreCLR调试器
    set_target_properties("dotnet-scripting" PROPERTIES VS_GLOBAL_DEBUGGER_TYPE "ManagedCore")
endif()

修改后重新生成CMake缓存,Visual Studio会自动使用Managed (CoreCLR)调试器启动项目。

方法2:Visual Studio中手动切换调试器

如果不想修改CMake配置,也可以通过调试启动配置手动调整:

  1. 打开CMake项目后,在顶部工具栏的调试目标下拉框中选择「调试和启动设置」
  2. 在弹出的launch.vs.json配置文件中,找到你的可执行文件对应的配置项,添加"debuggerType": "coreclr"字段,示例配置如下:
{
  "version": "0.2.1",
  "defaults": {},
  "configurations": [
    {
      "type": "default",
      "project": "CMakeLists.txt",
      "projectTarget": "dotnet-scripting.exe",
      "name": "dotnet-scripting.exe",
      "debuggerType": "coreclr"
    }
  ]
}
  1. 保存配置后重启调试即可正常运行。

内容的提问来源于stack exchange,提问作者Joris Eijmberts

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 21:45:03