C# 中使用C++导出的DLL文件
来源:互联网 发布:淘宝数据包怎么做 编辑:程序博客网 时间:2024/05/18 13:27
摘要
本篇博客主要介绍使用C++生成DLL库,并在C#工程之中进行调用。本技术可以用于Unity开发中,可以将一些复杂计算量较大的工作使用C++编写,生成DLL文件后在Unity中使用C#脚本进行调用。
本演示实例中会对涉及到的部分提出详细的解释说明。本工程使用的编程工具为
Microsoft Visual Studio Community 2015 Version 14.0.25431.01 Update 3
C++生成DLL库文件
新建工程
首先让我们新建一个C++的DLL工程,新建过程如下图:
- 选择
Visual C++
Win32工程,设置好工程名和路径。 - 选择应用类型为
DLL
,并且新建空工程。
添加代码文件
这里展示普通的C++ 函数,和C++ 类的静态函数。
新建一个类Add
具体代码文件如下所示。
其中
__stdcall
关键字 是Microsoft
专用的。__stdcall
调用约定用于调用 Win32 API 函数。 被调用方将清理堆栈,以便让编译器生成 vararg 函数__cdecl
。 使用此调用约定的函数需要一个函数原型。
__stdcall
是生命DLL文件导出函数的一种语法,需要结合.def
文件使用。
函数语法
return-type __stdcall function-name[(argument-list)]
// Add.h#pragma onceclass Add{public: Add(); ~Add(); static double __stdcall add(double a, double b); // 将要导出的静态函数};
// Add.cpp#include "Add.h"Add::Add(){}Add::~Add(){}double Add::add(double a, double b){ return a + b;}
增加一个需要导出的普通函数。新建一个文件 multiple.h
。
// multiple.h#pragma oncedouble __stdcall mult(double a, double b);
// multiple.cpp#include "multiple.h"double mult(double a, double b){ return a * b;}
新建def文件
模块定义 (.def) 文件为链接器提供有关被链接程序的导出、特性及其他方面的信息。 生成 DLL 时,
.def
文件最有用。 由于存在可代替模块定义语句使用的链接器选项,通常不需要.def
文件。 也可以将__declspec(dllexport)
用作指定导出函数的手段。
这里我们新建一个简单的def文件,将刚才的两个静态函数导出。
文件内容如下:
LIBRARY CPP_DLLEXPORTSmult @1add @2
关于DEF文件中的细节语法,请看参考链接。
其中 LIBRARY
后紧跟导出的DLL文件的名称 EXPORTS
是确认导出的函数的关键字。EXPORTS语法介绍
C# 管理工程
我们还可用C#将C++的DLL库再封装一次,然后便可以更加方便的其他的C# 文件中使用。
新建工程
我们直接在该工程中新建一个C# Class Library工程,名称设置为 Dll_test
。
新建一个CS文件, plus.cs
内容如下:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Runtime.InteropServices; // 加载DLL函数需要namespace Dll_test{ public class Plus { [DllImport("CPP_DLL")] private static extern double add(double a, double b); // 从DLL文件中寻找到add 函数 [DllImport("DPP_DLL")] private static extern double mult(double a, double b); public double plus(double a, double b) { return add(a, b); } public double multiple(double a,double b) { return mult(a, b); } }}
测试DLL文件
我们可以在每个工程的输出路径下找到各自的dll文件。
在这里
CPP_DLL :project\x64\Release\CPP_DLL.dllDll_test.dll: project\Dll_test\bin\Release\Dll_test.dll
如果我们需要在新的工程中使用,那么将这两个文件拷贝到新的工程的根路径下。
我们新建一个C#的控制台程序来测试是否能够使用这两个文件。
右键工程 add->References,选择浏览,找到Plus.dll
。然后勾选改文件。
参考链接
- DLL中.def文件的使用
- MSDN DEF文件
- __stdcall介绍
- vs2010中c#中类库dll制作和引用方法
- C# 中使用C++导出的DLL文件
- 如何生成DLL文件并导出函数及如何在C++或C#中调用DLL中导出的函数
- 使用C#调用C编译的DLL文件示例
- 导出GAC中Assessbly的DLL文件
- 在C#中使用C/C++写的DLL
- 在C#中使用C/C++写的DLL
- 如何在C#中使用C/C++写的DLL。
- 在C#中使用C/C++写的DLL
- 编程c++dll , DLL 的编写,导出函数 ,使用函数
- C#中使用DllImport调用C++dll
- 在C#中使用DLL文件
- 用DEF文件从DLL中导出C编程++类
- 用DEF文件从DLL中导出C编程++类
- 使用 DEF 文件导出 DLL
- 使用 DEF 文件导出 DLL
- 使用Def文件导出dll
- C# 使用 dll文件
- [DLL]使用def文件从dll导出
- Raspberry 3B+: UART调试树莓派
- linux下的多线程/多进程同步/通信机制
- 使用VideoToolBox对获取到的视频进行编码
- 代码审计:php://filter在php漏洞中的利用
- java基础篇
- C# 中使用C++导出的DLL文件
- PAT a1022题解
- VS2017 Windows10 MFC rcdll.dll
- Java密码学
- PAT a1023题解
- DP练习,九度1453Greedy Tino
- Hadoop分布式集群搭建
- Java学习笔记--(含与c++比较的一些个人理解)
- mysqli 打开与php版本有关,尤其是php7以后不支持mysqli链接,只有pdo方式