C#调用C++的dll两种方法(托管与非托管)

C#调用C++的dll两种方法(托管与非托管)
函数


C#调用C++的方式分为两种:1非托管的方式进行调用;2采用托管的方式进行调用。ui

1、使用非托管类调用C++dllspa

1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,以下图所示.net

 

二、添加MyDLL.cpp源文件,其中代码:debug

#include <cv.h>blog

#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动态库中。get

extern "C" _declspec(dllexport)的目的是为了使用DllImport调用非托管C++的DLL文件。由于使用DllImport只能调用由C语言函数作的DLL。string

三、设置项目MyDLL->属性->配置属性->公共语言运行时支持->公共语言运行时支持(、\clr)编译,将生成的dll(debug目录下 )it

 

 

四、新建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();
        }
    }
}

六、运行结果:

 

 

 

 

 

 

 


 

2、采用托管的方式进行调用C++dll

1、首先在vs2010新建项目选择win32应用程序,并设置为DLL,以下图所示

 

二、在前面的托管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);
}

三、使用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();
}

 

 

 

 

四、C#调用C++生成的Dll文件

新建一个C#控制台程序,添加引用->浏览->选择生成的DLL添加。

 

五、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();
        }
    }
}

六、运行C#程序,结果如图