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

如何在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风格函数,示例代码:
    #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);
    }
    
    编译该项目得到中转.dll和对应的.lib文件。
  • 第三步:Qt项目配置与调用
    在Qt的.pro文件中添加中转库的链接配置:
    LIBS += -L"中转库输出文件夹路径" -l中转库名称
    INCLUDEPATH += 中转库头文件目录(如果单独声明了函数头文件)
    
    在Qt C++代码中直接声明导入函数即可调用:
    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文件中添加如下配置:
    <PropertyGroup>
      <RegisterForComInterop>True</RegisterForComInterop>
      <ComVisible>True</ComVisible>
    </PropertyGroup>
    
    给需要对外暴露的C#类添加[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文件中添加如下配置:
    <PropertyGroup>
      <PublishAot>true</PublishAot>
      <NativeLib>Shared</NativeLib>
    </PropertyGroup>
    
    给需要暴露的C#方法添加[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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:54:03