如何在Windows系统的QT项目中使用C#类库?
可行性说明
在Windows平台的Qt(C++)项目中完全可以引入并调用C#类库,核心实现逻辑是通过中间层将C#托管代码暴露为C++可直接调用的非托管接口,无需修改Qt本身的编译链路,目前主流有三种实现方案。
方案1:C++/CLI中转层(最常用,适配全版本.NET Framework/.NET Core 3.0+)
适用场景
- 仅内部项目使用,不需要对外发布通用组件
- 兼容旧版.NET Framework类库
配置与调用步骤
- 第一步:编译C#类库
正常编写C#业务代码,设置项目输出类型为类库(.dll),.NET Core/.NET 5+版本无需特殊配置,.NET Framework直接编译即可。 - 第二步:新建C++/CLI中转层项目(VS中创建CLR类库模板)
该项目作为C#和C++的中间适配层,首先引用第一步编译好的C#类库,再将需要调用的C#方法包装为非托管导出的C风格函数,示例代码:
编译该项目得到中转.dll和对应的.lib文件。#using "MyCSharpLib.dll" using namespace System; using namespace MyCSharpLib; extern "C" __declspec(dllexport) int CallCSharpAdd(int a, int b) { auto csharpInstance = gcnew CSharpBusinessClass(); return csharpInstance->Add(a, b); } - 第三步:Qt项目配置与调用
在Qt的.pro文件中添加中转库的链接配置:
在Qt C++代码中直接声明导入函数即可调用:LIBS += -L"中转库输出文件夹路径" -l中转库名称 INCLUDEPATH += 中转库头文件目录(如果单独声明了函数头文件)extern "C" __declspec(dllimport) int CallCSharpAdd(int a, int b); // 业务调用逻辑 int result = CallCSharpAdd(1, 2);
注意事项
- 运行时需将C#类库.dll、C++/CLI中转.dll都放到Qt程序的同级运行目录下
- 三者目标架构必须统一:C#类库、C++/CLI中转层、Qt项目必须同为x86或者同为x64,不能混编
方案2:C#类库编译为COM组件(适合兼容旧系统场景)
配置与调用步骤
- 第一步:C#类库开启COM可见
在C#项目的.csproj文件中添加如下配置:
给需要对外暴露的C#类添加<PropertyGroup> <RegisterForComInterop>True</RegisterForComInterop> <ComVisible>True</ComVisible> </PropertyGroup>[ComVisible(true)]和[Guid("自定义生成的GUID")]特性。 - 第二步:编译C#类库,会同时输出.dll文件和.tlb类型库文件
- 第三步:Qt项目调用COM组件
首先在.pro文件中引入Qt的ActiveQt模块:
调用代码示例:QT += axcontainer#include <QAxObject> QAxObject *comInstance = new QAxObject(); // 入参填C#类对应的ProgID或者CLSID comInstance->setControl("MyCSharpLib.CSharpBusinessClass"); QVariant result = comInstance->dynamicCall("Add(int, int)", 1, 2); int res = result.toInt(); delete comInstance;
注意事项
- 部署时需要用regasm工具注册C# COM组件:
regasm 你的C#类库.dll /codebase,注册操作需要管理员权限 - 仅支持Windows平台
方案3:.NET 7+ Native AOT编译(无额外依赖,性能最优)
适用场景
- C#类库基于.NET 7及以上版本开发
- 不想额外部署.NET运行时环境
配置与调用步骤
- 第一步:C#类库开启Native AOT编译并暴露非托管函数
在.csproj文件中添加如下配置:
给需要暴露的C#方法添加<PropertyGroup> <PublishAot>true</PublishAot> <NativeLib>Shared</NativeLib> </PropertyGroup>[UnmanagedCallersOnly]特性:[UnmanagedCallersOnly(EntryPoint = "CSharpAdd")] public static int Add(int a, int b) { return a + b; } - 第二步:发布C#类库,得到原生.dll文件,该文件没有任何.NET运行时依赖
- 第三步:Qt项目直接链接该.dll,和调用普通C语言编写的动态库逻辑完全一致,无需额外中间层
内容的提问来源于stack exchange,提问作者mohammad.z
相关产品推荐
相关产品推荐

