QQ:287919932
QT和C#现在是两大应用方向,将QT现有的功能植入C#,能够免去重复开发的工作。
个人将整个反复尝试了一段时间,得出最佳实践,包括两种方法:DLL和ACTIVE的方式。
以DLL方式,详细描述,因为这种方式效率高,实现其实比ACTIVE要简单。
包括三步:
1 编译QT应用成库;
2 将QT封装进.net cli库;
3 在.net应用中导入cli库。
下面以具体案例进行演示。
1 QT提供功能库,带UI的,通过export导出:
#ifndef BUILD_STATIC
# if defined(Pipe3D2_EXPORTS)
# define PIPELIBRARY_EXPORT __declspec(dllexport)
# else
# define PIPELIBRARY_EXPORT __declspec(dllimport)
# endif
#else
# define PIPELIBRARY_EXPORT
#endif
#include <string>
#include <vector>
class PIPELIBRARY_EXPORT PipeLibrary
{
public:
PipeLibrary();
2 CLI项目作为封装,提供C#和C++库之间的桥梁:
#pragma once
#include "PipeLibrary.h"
public ref class PipeSharpAdapter
{
public:
PipeSharpAdapter();
void createQWidget(void* hwnd);
3 C# .NET FRAMEWORK应用中,添加引用即可:
相对于ACTIVEX,这种方式实现简单,设计UI,效率也比较高。
但是第二步,如何将QT库植入WINDOWS中WIN32窗口显示,是一个难题。
网上都是采用QMFCWIDGET/QWINWIDGET,通过SETHOOK的方式注入,会造成执行效率大幅下降,这个地方我做了特殊的优化,最终效果可以达到原生态。
优化细节这里不公开。