该文介绍如何利用qtwinmigrate库将Qt窗口封装成动态链接库(DLL),以便在C#应用中嵌入和使用。通过QWinWidget和QMfcApp类,实现DLL的初始化和销毁,并展示了C#调用这些DLL接口的例子。 摘要生成于 ,由 DeepSeek-R1 满血版支持,

需求:将Qt 窗口 封装成dll ,供c#嵌入

一,利用第三方库 将qt 窗口封装成dll,详见 qtwinmigrate\examples\qtdll 例子

https://github.com/qtproject/qt-solutions

#include "widget.h"
#include <qmfcapp.h>
#include <qwinwidget.h>
#include <windows.h>
#include <QApplication>
BOOL WINAPI DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReserved*/ )
    static bool ownApplication = FALSE;
    if ( dwReason == DLL_PROCESS_ATTACH )
    ownApplication = QMfcApp::pluginInstance( hInstance );
    if ( dwReason == DLL_PROCESS_DETACH && ownApplication )
    delete qApp;
    return TRUE;
QWinWidget *win=nullptr;
extern "C" __declspec(dllexport) bool initWindow( HWND parent )
    win = new QWinWidget(parent);
    Widget *widget = new Widget(win);
    widget->show();
    win->move(0,0);
    win->show();
    return TRUE;
extern "C" __declspec(dllexport) bool destroyWindow( HWND parent )
    if(win!=0){
        delete win;
    return TRUE;

二,c# 直接引用 dll 并执行接口

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WinFormsApp
    public partial class Form1 : Form
        [DllImport("VTKWindow.dll", EntryPoint = "initWindow", CharSet = CharSet.Ansi)]
        public extern static bool initWindow(IntPtr parent);
        [DllImport("VTKWindow.dll", EntryPoint = "destroyWindow", CharSet = CharSet.Ansi)]
        public extern static bool destroyWindow();
        public Form1()
            InitializeComponent();
            initWindow(this.Handle);

参考:C# 调用Qt编写的控件_zuoyefeng1990的博客-CSDN博客

C#有两种写界面的框架,winFrom和WPF,这二者写的界面可以相互调用,但C#编写的界面组件在非托管C++虽然理论上可以,但是这种类似反射的机制使用其他来说特别不舒服。而对于编写组件式SDK而言,核心的界面组件可以在C++、C#、JAVA中使用而无需修改太多的代码是我们的终级目标。 ocx 编写难度太大 使用MFC编写的OCX控件可以嵌套在各种高级语言甚至浏览器中,但对于新时代的开发人员而言,会MFC开发的越
本资源包括4个文件夹,myQtMainWindowDll文件夹里面是qt的工程文件;build-qtdll-Desktop_Qt_5_12_2_MSVC2015_64bit-Release文件夹是qt编译生成的文件夹;QtReleaseDll文件夹里面是最重要的qtdialog.dll以及他所依赖的所有的库;CsharpUseQtDll文件夹里面是c#工程。 具体使用细节参见我的博客:https://blog.csdn.net/weixin_43935474/article/details/105531814
C#调用Qt编写的带界面的dllQt编写带界面的dllC#调用实现结果 Qt编写带界面的dll Qt编写的带界面的dll程序,由于Qt必须调用QApplication的exec方法才能运行,所以在普通windows程序中是不能调用的,Qt提供了解决方案qtwinmigrate。 开发环境 操作系统:win10 Qt Create版本:qt-creator-opensource-windows-x...
因公司大部分底层库使用的Qt 开发,本人比较擅长C# ,且领导计划应用层用C# 而算法层用C++或者Qt,这就出现了混合编程的方式,现对C#的平台调用做一下总结。 公共语音运行库提供了一系列能够使托管代码与非托管代码进行交互的解决方案 主要包含三类互操作技术: 1. 平台调用(P/Invoke):主要用于处理在托管代码中调用C库函数以及Win32 API 函数等非托管函数情形。 2.C++ Interop:适用在托管代码与C++ 类库、核心算法库之间进行高效、灵活的互操作过程。 3.COM Int
C#Qt 混合编程,开发软件。 Qt编写功能模块给C#调用。 Qt带界面的控件给C#调用的常见的办法有两种: 如果不带界面的就很简单,这篇文章是介绍带界面的Qt组件给C#调用。 (1)Qt封装成COM组件方式给C#调用。 (2)Qt直接编译成DLL,导出接口给C#调用。 COM组件方式在之前的好几篇文章都有详细讲解。这篇文章介绍Qt直接编译成DLL,导出接口给C#调用。
在我的例子中一共有2个工程: 一个qt的工程:qtdll.pro,用来生成dll,该工程放在 F:\QTCode\TestCode\TestQtDll4CSharp\myQtMainWindowDll文件夹下; 一个c#的...