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工程,新建过程如下图:
这里写图片描述
这里写图片描述

  1. 选择Visual C++ Win32工程,设置好工程名和路径。
  2. 选择应用类型为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。然后勾选改文件。

参考链接

  1. DLL中.def文件的使用
  2. MSDN DEF文件
  3. __stdcall介绍
  4. vs2010中c#中类库dll制作和引用方法
原创粉丝点击