C#调用C++类(内含OpenCV代码)
C++工程通过托管代码生成dll供C#工程调用,即便C++工程中的类用到了其他依赖库也没关系。下例中C++工程用OpenCV读取图片并在窗口中显示,C#工程引用C++工程生成的dll,也可以做到读取图片并在窗口中显示。
C++工程
新建C++工程,配置中设置输出类型为动态库(.dll),公共语言运行时支持设置为“公共语言运行支持(/clr)”。
首先新建fatory类: factory.h
#ifndef FACTORY_H
#define FACTORY_H
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
class factory
{
public:
void show();
};
#endif
factory.cpp
#include "factory.h"
#include <opencv2\opencv.hpp>
using namespace cv;
void factory::show()
{
Mat img = imread("1.jpg");
imshow("src",img);
waitKey(0);
}
然后新建托管类clrClass: clrClass.h
#pragma once
#include "factory.h"
public ref class clrClass //一定记得加public ref
{
public:
clrClass(void);
~clrClass(void);
int member;
void showImage();
private:
factory *clrFac;
};
clrClass.cpp
#include "clrClass.h"
#include "factory.h"
clrClass::clrClass(void)
{
clrFac = new factory();
}
clrClass::~clrClass(void)
{
}
void clrClass::showImage()
{
clrFac->show();
}
然后编译生成,在你的工程的debug/release目录下就会生成相应的dll文件。
C#工程
新建C#工程,在引用中添加刚刚生成的dll,在program.cs中添加如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace refDll
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());
clrClass clr = new clrClass(); //新建一个托管类对象
clr.showImage(); //调用托管类函数
}
}
}
运行: