C#调用C++的dll两种实现方式(托管与非托管)
作者:阳光下的Smiles
C#调用C++的方式分为两种:
(1)非托管的方式进行调用
(2)采用托管的方式进行调用
一、使用非托管类调用C++的dll
1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,如下图所示
2、添加MyDLL.cpp源文件,其中代码:
#include <cv.h> #include <highgui.h> extern "C" _ _declspec(dllexport)void Show() { IplImage *img = cvLoadImage("E:\\图库\\abc.jpg"); cvNamedWindow("Image:",1); cvShowImage("Image:",img); cvWaitKey(); cvDestroyWindow("Image:"); cvReleaseImage(&img); return ; }
extern "C"外部声明,表示函数和变量是按照C语言的方式编译和链接的。
__decspec(dllexport)的目的是为了将对应的函数放入到DLL动态库中。
extern "C" _declspec(dllexport)的目的是为了使用DllImport调用非托管C++的DLL文件。因为使用DllImport只能调用由C语言函数做的DLL。
3、设置项目MyDLL->属性->配置属性->公共语言运行时支持->公共语言运行时支持(、\clr),编译,将生成的dll(debug目录下 )。
4、新建C#控制台应用程序dllConsoleApplication1,添加引用->浏览->选择生成的DLL添加,将上文所生成的DLL拷贝到C#应用程序的bin里面然后应用如下方式进行调用:
5、在dllConsoleApplication1项目上新建一个CPPDLL类,编写以下代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; //必须添加,不然DllImport报错 namespace dllConsoleApplication1 { class CPPDLL { [DllImport("MyDLL.dll", CharSet =CharSet.Ansi)] //引入dll,并设置字符集 //[DllImport("MyDLL.dll")] //可以替代上一句代码 public static extern int Show(); } class Program { static void Main(string[] args) { CPPDLL.Show(); Console.ReadLine(); } } }
6、运行结果:
二、采用托管的方式进行调用C++的dll
1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,如下图所示
2、在前面的托管DLL项目中添加Functions.h头文件和Functions.cpp源文件实现利用OpenCV库输出显示图片。
在Functions.h中:
void show();
在Functions.cpp中:
#include "Functions.h" #include <opencv2/opencv.hpp> using namespace cv; void show() { Mat img = imread("E:\\图库\\abc.jpg"); imshow("src",img); waitKey(0); }
3、使用C++托管类进行封装。新增clrClass类。并且点击“解决方案”中的项目托管DLL->属性->配置属性->公共语言运行时支持->公共语言运行时支持(、\clr),然后进行编译生成DLL。
在clrClass.h中有如下代码:
#pragma once public ref class clrClass { public: clrClass(void); ~clrClass(void); int member;//自添加 void showImage();//自添加 };
在clrClass.cpp中有如下代码:
#include "clrClass.h" #include "Functions.h"//自添加 clrClass::clrClass(void) { } clrClass::~clrClass(void) { } void clrClass::showImage()//自添加 { show(); }
4、C#调用C++生成的Dll文件
新建一个C#控制台程序,添加引用->浏览->选择生成的DLL添加。
5、在program.cs添加代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test_托管DLL { class Program { static void Main(string[] args) { clrClass ClrCLass =new clrClass(); ClrCLass.showImage(); } } }
6、运行C#程序,结果如图
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。