C#調用C++的dll兩種實現方式(托管與非托管)
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動態(tài)庫中。
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"http://自添加
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#程序,結果如圖

總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
C#中的靜態(tài)字段double.Epsilon實例詳解
double.Epsilon 是C#中的一個靜態(tài)字段,表示 double 數據類型的最小可表示的正數值,這篇文章主要介紹了C#中的靜態(tài)字段double.Epsilon的相關知識,需要的朋友可以參考下2024-01-01

