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

 更新时间:2023年08月14日 10:45:51   作者:阳光下的Smiles  
这篇文章主要介绍了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动态库中。

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#程序,结果如图

 

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 使用Spire.Barcode程序库生成二维码的实例解析

    使用Spire.Barcode程序库生成二维码的实例解析

    这篇文章主要介绍了使用Spire.Barcode程序库生成二维码的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-12-12
  • C# 如何调用python脚本

    C# 如何调用python脚本

    这篇文章主要介绍了C# 如何调用python脚本,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • mvc开启gzip压缩示例分享

    mvc开启gzip压缩示例分享

    这篇文章主要介绍了mvc开启gzip压缩示例,需要的朋友可以参考下
    2014-03-03
  • 使用快捷键在Unity中快速锁定和解锁Inspector右上角的锁功能

    使用快捷键在Unity中快速锁定和解锁Inspector右上角的锁功能

    这篇文章主要为大家介绍了使用快捷键在Unity中快速锁定和解锁Inspector右上角的锁功能详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 算法证明每一位都相同十进制数不是完全平方数

    算法证明每一位都相同十进制数不是完全平方数

    这篇文章主要为大家介绍了算法证明每一位都相同十进制数不是完全平方数的过程论述,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C#Button窗体常用属性及事件详解

    C#Button窗体常用属性及事件详解

    在本篇文章里小编给各位分享的是关于C#Button窗体常用属性及事件详解,需要的朋友们可以参考下。
    2020-03-03
  • 在C#项目中如何使用NHibernate详解

    在C#项目中如何使用NHibernate详解

    NHibernate的设计思想和Hibernate的设计思想基本相同,都是为了避免频繁的编写sql脚本,使用面向对象的方式使用hql语句进行查询。下面这篇文章主要给大家介绍了关于在C#项目中如何使用NHibernate的相关资料,需要的朋友可以参考借鉴,下面来一起学习学习吧。
    2018-04-04
  • Unity实现截屏以及根据相机画面截图

    Unity实现截屏以及根据相机画面截图

    这篇文章主要为大家详细介绍了Unity实现截屏以及根据相机画面截图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • C#使用Winform编写一个图片预览器管理

    C#使用Winform编写一个图片预览器管理

    这篇文章主要为大家详细介绍了C#如何使用Winform编写一个通用图片预览器管理,包含滚轮放大缩小,剪切,下一页,方向变化等,需要的可以参考下
    2024-02-02
  • C#使用foreach语句遍历堆栈(Stack)的方法

    C#使用foreach语句遍历堆栈(Stack)的方法

    这篇文章主要介绍了C#使用foreach语句遍历堆栈(Stack)的方法,涉及C#操作foreach实现遍历堆栈的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04

最新评论