之前用C#开发了一个WPF的前端项目,想要实现后端逻辑的代码,但是项目算法代码是用C++写的。所以需要把C++函数打包成Dll库,再在WPF中调用dll实现运算。
软件版本:VS 2022 + Opencv4.5.1 + WPF net6.0-Windows
tip:C++程序还使用了Opencv外部库,所以还需要额外操作,下面讲。
首先生成C++程序的dll:
1.定义导出宏
MYAPI_EXPORTS
2.定义导出的函数如下,这里的testWPF()就是自定义的C++函数
//导出dll宏
#ifdef MYAPI_EXPORTS
#define MYAPI __declspec(dllexport)
#else
#define MYAPI __declspec(dllimport)
#endif
extern "C" {
MYAPI void testWPF();
}
3.项目属性->配置属性->常规->配置类型->动态库.dll,注意是Debug-X64平台,与后面WPF项目的平台一定要对应
4.运行程序,生成Dll文件(SIM_Test02.dll),dll文件一般在你的项目路径\x64\Debug,这个目录里
5.把刚刚导出的SIM_Test02.dll和opencv_world451d.dll放入WPF的目录
WPF目录:你的WPF项目目录\bin\x64\Debug\net6.0-windows
opencv_world451d.dll位置:你的Opencv目录\OpenCV4.5.1\opencv\build\x64\vc15\bin
SIM_Test02.dll位置:你的C++项目路径\x64\Debug
tip:
这里C++和WPF都是Debug-X64版本,所以要用opencv_world451d.dll而不是opencv_world451.dll,一定要注意
6.在WPF中引入dll并声明dll中的函数
//这WPF中.cs文件中调用dll中testWPF函数所需要的代码
using System.Runtime.InteropServices;
namespace SIM.ViewModels
{
public class MainViewModel : INotifyPropertyChanged
{
//"SIM_Test02.dll"s是导出dll文件名,"testWPF"是C++中定义的函数名字
[DllImport("SIM_Test02.dll", EntryPoint = "testWPF", CallingConvention = CallingConvention.Cdecl)]
public static extern void testWPF();
}
}
这里贴出引入的代码,后面在此文件里就可以直接使用testWPF()这个函数了