夜雨聆风学习资料网

ARTICLE · 1093310

Qt 完美支持 C# 项目编译(一个插件+语言服务)

Qt 完美支持 C# 项目编译(一个插件+语言服务)

TUTORIAL · Qt Creator 20.0.1 · .NET SDK 10 · Windows x64

打通 Qt C++ / C

高级上位机编程—— 让 Qt Creator 同时成为 Qt C++ 与 C# 的开发主场:既能直接编译、运行 WinForms / WPF 项目,又能把 C# 程序集和 Qt C++ 界面工程串在同一个 IDE、同一条构建链路里。

适用平台: Windows 10 / 11 | 配套工程:WinFormsApp1.rar| 实测环境: Qt Creator 20.0.1 (Community) + .NET SDK 10.0.401 + MSVC2022 64bit | 预计耗时: 20-40 分钟
【需要详细PDF+HTML文档,可私信】

目录

先搞清楚一件事:Qt Creator 凭什么能编译 C#

环境准备

打开配套工程 WinFormsApp1.rar

在 Qt Creator 里构建与运行

配置 C# / JSON 代码智能(语言服务器)

Qt C++ 与 C# 混编的上位机架构(打通篇)

故障排查手册

速查附录

01 先搞清楚一件事:Qt Creator 凭什么能编译 C#

Qt Creator 本身不是 C

IDE,但它从 20.x 开始提供了三件互相独立的东西。很多人一开始把它们搅在一起,于是排查问题时处处踩空。先把边界划清楚:

组成
由谁提供
负责什么
缺了会怎样
Dotnet 插件
Qt Creator 官方插件(本文实测 20.0.1)
把 .slnx / .csproj 识别成"工作区项目",给它挂上构建与运行步骤
项目树里无法把 C 工程当工程打开
工作区项目描述文件
工程内 .qtcreator/project.json(可手写)
用 JSON 声明"构建/运行到底执行哪条命令",相当于 C 版的 build/run configuration
只能自己开终端敲 dotnet build
语言服务器
外部程序 csharp-ls / vscode-json-languageserver
只负责编辑器体验:补全、跳转定义、查找引用、实时诊断、悬停提示
照样能编译、能运行
,只是写 C 没有智能提示

关键结论 · 语言服务器与构建完全正交csharp-ls 跟"能不能运行"无关。它只管编辑器里的代码智能。没有它,dotnet build / dotnet run 照常工作;两者是正交的:语言服务器管编辑体验,项目类型管构建运行。

图 6: 语言服务器与构建运行互不相干的说明。记住这条,后面"装不上 csharp-ls"就不会被误判成"Qt Creator 编不了 C#"。
Qt Creator 侧还有一件必须确认的事:Dotnet 插件必须是勾选状态。打开帮助 → 关于插件,搜索do,确认Dotnet前面的复选框被勾上(本文实测已勾选,版本 20.0.1)。
图 5: 已安装的插件对话框。Dotnet已勾选(20.0.1),它是 C 工程类型与语言服务器引导的入口;Docker、To Do (experimental)与本文无关。

02 环境准备

图 7: 本文实测所用的 Qt Creator 20.0.1 (Community)。打开WinFormsApp1.rar里工程的就是它—— 前提是先用解压工具把 rar 解开(见第 3 节)。
开始之前,请确认本机具备以下条件:
项目
本文实测值
说明
Qt Creator
D:\Jay_software\Qt6\Tools\QtCreator\bin\qtcreator.exe
(20.0.1)
必须 ≥ 20.0,C 工作区项目支持来自此版本
.NET SDK
C:\Program Files\dotnet\dotnet.exe
(SDK 10.0.401)
只要 SDK,不要只装运行时
目标框架
net10.0-windows
与 SDK 大版本对应
Node / npm
D:\Jay_software\Nodejs\npm.cmd
仅 JSON 语言服务器需要
Qt Kit
Desktop Qt 6.11.2 MSVC2022 64bit
C 项目本身不用 Qt 库,但会话里可并存 C++ 工程
安全软件
火绒
可能拦截 Qt Creator 派生的子进程,必要时加白名单
Qt Creator 用户配置目录
%APPDATA%\QtProject\qtcreator
语言服务器就装在这里

提示 · 本机有两套 dotnetC:\Program Files\dotnet(完整,带 sdk 目录)与 C:\Program Files (x86)\dotnet(只有运行时,无 sdk 目录)。一旦命令解析到 x86 那套,就会报 No .NET SDKs were found.。规避办法:把运行/构建命令的可执行文件写成绝对路径 C:\Program Files\dotnet\dotnet.exe。

03 打开配套工程 WinFormsApp1.rar

本节回答"这个 rar 用什么打开、解压到哪、怎么进 Qt Creator"。

3.1 用什么打开它

WinFormsApp1.rar是RAR 压缩包,不是工程文件,不能直接拖进 Qt Creator。需要先解压:
方式
操作
说明
WinRAR(本文环境已安装)
右键 WinFormsApp1.rar → 解压到 WinFormsApp1\
推荐,最省事
7-Zip
右键 → 7-Zip → 解压到当前位置
若未装 7-Zip 则用上一条
命令行(WinRAR 自带)
"C:\Program Files\WinRAR\UnRAR.exe" x WinFormsApp1.rar
适合脚本化批量还原

注意 · PowerShell 的 Expand-Archive 不能解 rarExpand-Archive 只支持 .zip。遇到 .rar 会直接报错,别在这里浪费时间。

解压后,用 Qt Creator 20.0.1(图 7 的图标)打开工程—— 这就是"打开这个文件的那套工具"的完整链路:WinRAR 解压 → Qt Creator 打开.slnx。

3.2 解压到哪里

包内的.qtcreator\project.json.user与.vs缓存里记录了绝对路径,所以:
方案 A(最省事,推荐)
:解压到E:\Jay_Pro_Test\C

zhishi</span>,得到E:\Jay_Pro_Test\C# zhishi\WinFormsApp1</span>,与包内记录的路径完全一致,打开即用。

方案 B(想放到别处)
:解压到任意目录后,先删掉.vs、.qtcreator、bin、obj四个目录,让 Qt Creator / MSBuild 按新路径重新生成配置与中间产物。

建议 · 不要把 bin / obj / .vs 带进版本库或压缩包 本次压缩包里就带了 .stale 残留文件和 .vs 缓存(见第 7.3 节的一次真实事故)。干净的分发包应只保留源码与配置文件:*.cs、*.csproj、*.slnx、*.resx、.qtcreator\project.json。

3.3 解压后的目录长相

图 8: 解压后的WinFormsApp1目录。.qtcreator、.vs、bin、obj是四类"生成物目录",WinFormsApp1.csproj才是工程本体。
条目
类型
作用
WinFormsApp1.csproj
工程文件
SDK 风格 C 工程,声明目标框架与 WinForms
WinFormsApp1.slnx
解决方案文件
新版 XML 解决方案,Qt Creator 与 Visual Studio 都用它
Form1.cs
/ Form1.Designer.cs / Form1.resx
源码
窗体逻辑、设计器生成代码、窗体资源
Program.cs
源码
程序入口,含控制台调试开关
.qtcreator\project.json
Qt Creator 关键文件
声明 dotnet build / dotnet run 步骤,是整个方案的核心
.qtcreator\project.json.user
生成物
Qt Creator 写回的构建/运行配置缓存,可删
.vs
/ bin / obj
生成物
Visual Studio 缓存与编译产物,可删

3.4 工程源文件内容

WinFormsApp1.csproj—— 标准 SDK 工程,WinExe表示无控制台的 Windows 程序:
<ProjectSdk="Microsoft.NET.Sdk">  <PropertyGroup>    <OutputType>WinExe</OutputType>    <TargetFramework>net10.0-windows</TargetFramework>    <Nullable>enable</Nullable>    <UseWindowsForms>true</UseWindowsForms>    <ImplicitUsings>enable</ImplicitUsings>  </PropertyGroup></Project>
WinFormsApp1.slnx——注意Configurations段,这是消除MSB4126的关键(详见 7.2):
<Solution>  <Configurations>    <PlatformName="Any CPU" />    <PlatformName="x64" />  </Configurations>  <ProjectPath="WinFormsApp1.csproj" /></Solution>
Program.cs—— 入口文件,AllocConsole被整段注释掉(原因见 7.4):
using System.Runtime.InteropServices; // 支持调用外部 DLLnamespace WinFormsApp1{    internal static class Program    {        // [DllImport("kernel32.dll")]        // private static extern bool AllocConsole();        ///<summary>        ///  The main entry point for the application.        ///</summary>        [STAThread]        staticvoidMain()        {            // 从 Qt Creator 运行时不需要 AllocConsole:            // dotnet run 已经把 stdout/stderr 接给了"应用程序输出"面板            ApplicationConfiguration.Initialize();            Application.Run(new Form1());        }    }}
Form1.cs—— 窗体逻辑,按钮里做了一轮 255 字节的填充演示:
namespace WinFormsApp1{    public partial class Form1 : Form    {        publicForm1()        {            InitializeComponent();        }        ///<summary>        /// 测试:填充 0~254 的字节序列        ///</summary>        privatevoidbutton1_Click(object sender, EventArgs e)        {            byte[] a = new byte[255];            for (int i = 0; i < 255; i++)            {                a[i] = (byte)i;            }            // hex 格式打印(依赖控制台窗口,默认注释)            // Console.WriteLine("a:" + BitConverter.ToString(a));        }    }}

3.5 Qt Creator 侧的项目描述文件

.qtcreator\project.json是本方案的核心:它用一段 JSON 把dotnet变成 Qt Creator 的一等公民(构建步骤 + 运行目标 + 文件排除规则)。
图 9: 左上是.qtcreator\project.json的内容,右下是 Qt Creator 里点"运行"后弹出的 Form1 窗体 —— 从"JSON 声明"到"窗口跑起来"的完整闭环。
{    "dll = "E:\Jay_Pro_Test\C# zhishi\WinFormsApp1\bin\x64\Debug\net10.0-windows\WinFormsApp1.dll"$s = [Text.Encoding]::UTF8.GetString([IO.File]::ReadAllBytes($dll))if ($s -match 'AlloConsole') { '仍是旧编译' } else { '已是修复后编译' }

8.4 上线检查清单

Dotnet 插件已勾选(帮助 → 关于插件搜索do)

WinFormsApp1.slnx

已声明Any CPU/x64平台 →MSB4126消除

Program.cs

无AlloConsole拼写错误

csharp-ls

与vscode-json-languageserver已装到 Qt Creator 期望的路径

Preferences → Language Client

两个条目已添加且左侧勾选框已勾上

.qtcreator/project.json

的构建/运行步骤指向正确的 dotnet
已取消qtcreator.exe的"以管理员身份运行 + Windows 8 兼容模式"
火绒已排除%APPDATA%\QtProject\qtcreator、项目目录与bin目录
构建前确认没有残留的WinFormsApp1.exe进程

8.5 当前状态

已解决:  [x] csharp-ls 已安装并可运行(0.28.0)  [x] vscode-json-languageserver 已装到 Qt Creator 期望的位置(含 .bin shim)  [x] WinFormsApp1.slnx 已声明 Any CPU / x64 平台  →  MSB4126 消除  [x] Program.cs 的 AlloConsole 拼写错误已修正(→ AllocConsole,随后改为注释)  [x] 构建通过:0 警告 0 错误;Qt Creator 内点运行可弹出窗体待办:  [ ] 重启 Qt Creator 或重启机器后,删除 bin 下的 *.stale 文件  [ ] 建议取消 qtcreator.exe 的"以管理员身份运行 + Windows 8 兼容模式"  [ ] 若仍出现 No .NET SDKs were found.,把运行目标改成绝对路径的 dotnet.exe

一句话总结 Qt Creator 编译 C#,靠的是 Dotnet 插件(认得工程)+ project.json(定义构建与运行);csharp-ls 只负责写代码时的智能提示,跟能不能编译无关。把这两条分开看, 再记住"崩溃 → 残留进程 → 文件锁 → 构建失败"这条因果链,Qt Creator 就真正成为了 Qt C++ 与 C  

上位机开发的统一主场。

故我在

点击下方卡片 关注我

↓↓↓

好看,请点击

收藏

点赞

在看

+1

❤❤❤

相关学习资料