环境
Qt5.4.2
Visual Studio 2022
Visual Studio 组件
新建C# 库
新建C# 项目
C# Class1.cs 代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ClassLibrary1
{
public static class ClassGlobal
{
public static String Name = "ClassLibrary1";
public static void InitClassGlobal(String name)
{
Name = name;
}
}
public class Class1
{
public double Add(double arg1, double arg2)
{
return arg1 + arg2;
}
public String ReadName()
{
return ClassGlobal.Name;
}
public void WriteName(String name)
{
ClassGlobal.InitClassGlobal(name);
}
}
}
新建CLR类库
新建CLR项目
将C# 库拷贝至CLR项目文件夹下
修改CLR 项目中 ClassLibrary2.h
#pragma once
using namespace System;
#using "./ClassLibrary1.dll"
using namespace ClassLibrary1;
extern "C" _declspec(dllexport) double Add(double arg1, double arg2)
{
Class1 classTest;
return classTest.Add(arg1, arg2);
}
extern "C" _declspec(dllexport) char* ReadName()
{
Class1 classTest;
return (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(classTest.ReadName());
}
extern "C" _declspec(dllexport) void WriteName(char* name)
{
Class1 classTest;
return classTest.WriteName(System::Runtime::InteropServices::Marshal::PtrToStringAnsi((IntPtr)name));
}
新建QT项目
新建QT项目
C#,CLR库拷贝至QT项目中
QT 项目中引用库文件
修改QT 项目中 MainWindow.cpp
#include <QDebug>
extern "C" __declspec(dllexport) double Add(double arg1, double arg2);
extern "C" __declspec(dllexport) char* ReadName();
extern "C" __declspec(dllexport) void WriteName(char* name);
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
qDebug() << Add(15.2,16.8);
qDebug() << QString(ReadName());
WriteName("MainWindow Call");
qDebug() << QString(ReadName());
}
运行效果如下: