C#調(diào)用C++的dll兩種實(shí)現(xiàn)方式(托管與非托管)
C#調(diào)用C++的方式分為兩種:
(1)非托管的方式進(jìn)行調(diào)用
(2)采用托管的方式進(jìn)行調(diào)用
一、使用非托管類調(diào)用C++的dll
1、首先在vs2010新建項(xiàng)目選擇win32應(yīng)用程序,并設(shè)置為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"外部聲明,表示函數(shù)和變量是按照C語言的方式編譯和鏈接的。
__decspec(dllexport)的目的是為了將對(duì)應(yīng)的函數(shù)放入到DLL動(dòng)態(tài)庫中。
extern "C" _declspec(dllexport)的目的是為了使用DllImport調(diào)用非托管C++的DLL文件。因?yàn)槭褂肈llImport只能調(diào)用由C語言函數(shù)做的DLL。
3、設(shè)置項(xiàng)目MyDLL->屬性->配置屬性->公共語言運(yùn)行時(shí)支持->公共語言運(yùn)行時(shí)支持(、\clr),編譯,將生成的dll(debug目錄下 )。
4、新建C#控制臺(tái)應(yīng)用程序dllConsoleApplication1,添加引用->瀏覽->選擇生成的DLL添加,將上文所生成的DLL拷貝到C#應(yīng)用程序的bin里面然后應(yīng)用如下方式進(jìn)行調(diào)用:
5、在dllConsoleApplication1項(xiàng)目上新建一個(gè)CPPDLL類,編寫以下代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; //必須添加,不然DllImport報(bào)錯(cuò) namespace dllConsoleApplication1 { class CPPDLL { [DllImport("MyDLL.dll", CharSet =CharSet.Ansi)] //引入dll,并設(shè)置字符集 //[DllImport("MyDLL.dll")] //可以替代上一句代碼 public static extern int Show(); } class Program { static void Main(string[] args) { CPPDLL.Show(); Console.ReadLine(); } } }
6、運(yùn)行結(jié)果:
二、采用托管的方式進(jìn)行調(diào)用C++的dll
1、首先在vs2010新建項(xiàng)目選擇win32應(yīng)用程序,并設(shè)置為DLL,如下圖所示
2、在前面的托管DLL項(xiàng)目中添加Functions.h頭文件和Functions.cpp源文件實(shí)現(xiàn)利用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++托管類進(jìn)行封裝。新增clrClass類。并且點(diǎn)擊“解決方案”中的項(xiàng)目托管DLL->屬性->配置屬性->公共語言運(yùn)行時(shí)支持->公共語言運(yùn)行時(shí)支持(、\clr),然后進(jìn)行編譯生成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#調(diào)用C++生成的Dll文件
新建一個(gè)C#控制臺(tái)程序,添加引用->瀏覽->選擇生成的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、運(yùn)行C#程序,結(jié)果如圖
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- C#調(diào)用C++dll方法步驟
- C#通過PInvoke調(diào)用c++函數(shù)的備忘錄的實(shí)例詳解
- vs2019 實(shí)現(xiàn)C#調(diào)用c++的dll兩種方法
- 關(guān)于C#調(diào)用C++dll傳指針釋放內(nèi)存問題
- C#調(diào)用C++動(dòng)態(tài)庫接口函數(shù)和回調(diào)函數(shù)方法
- c#調(diào)用c++的DLL的實(shí)現(xiàn)方法
- C#程序調(diào)用C++動(dòng)態(tài)庫(dll文件)遇到的坑及解決
- 在C#項(xiàng)目中調(diào)用C++編寫的動(dòng)態(tài)庫的三種方式
- C#調(diào)用C++使用C++/CLI的實(shí)現(xiàn)
相關(guān)文章
c# 實(shí)現(xiàn)文件上傳下載功能的實(shí)例代碼
這篇文章主要介紹了如何用c# 實(shí)現(xiàn)文件上傳下載功能,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07c# 連接access數(shù)據(jù)庫config配置
c# 連接access數(shù)據(jù)庫config配置,需要的朋友可以參考一下2013-02-02C#中的靜態(tài)字段double.Epsilon實(shí)例詳解
double.Epsilon 是C#中的一個(gè)靜態(tài)字段,表示 double 數(shù)據(jù)類型的最小可表示的正數(shù)值,這篇文章主要介紹了C#中的靜態(tài)字段double.Epsilon的相關(guān)知識(shí),需要的朋友可以參考下2024-01-01如何用C#實(shí)現(xiàn)SAGA分布式事務(wù)
大家好,本篇文章主要講的是如何用C#實(shí)現(xiàn)SAGA分布式事務(wù),感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01