Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_windows


????前言


  • 前一篇博客讲了一下​​DLL的基本概念​​​,链接在这:​​Unity与 DLL文件 ☀️| 什么是DLL✨?​
  • 还讲了​​怎样通过 C# 类库 生成一个DLL文件并调用​​!
  • 在上一篇文章中也说了,生成DLL文件的方式有很多种,还有一个是通过VC C++来生成
  • 那本篇文章就对​​怎样通过VC C++ 生成一个DLL文件​​做一个概述
  • 生成之后有两种调用方式,分别是​​在VS中调用​​​和​​在Unity中调用​​,本篇文章都会提到!
  • 一起来看一下怎样生成一个简单的​​DLL​​并进行调用吧!
  • 本篇文章使用的是​​VS2017​​!不同版本可能会有差异,敬请理解!


????通过VC 生成DLL文件

这里再来简单看一下​​DLL​​的定义,方便理解


动态链接库(英语:Dynamic-link library,缩写为DLL)是微软公司在微软视窗操作系统中实现共享函数库概念的一种实现方式。这些库函数的扩展名是.DLL、.OCX(包含ActiveX控制的库)或者.DRV(旧式的系统驱动程序)。所谓动态链接,就是把一些经常会共用的代码(静态链接的OBJ程序库)制作成DLL档,当可执行文件调用到DLL档内的函数时,Windows操作系统才会把DLL档加载存储器内,DLL档本身的结构就是可执行档,当程序有需求时函数才进行链接。透过动态链接方式,存储器浪费的情形将可大幅降低。静态链接库则是直接链接到可执行文件。DLL的文件格式与视窗EXE文件一样——也就是说,等同于32位视窗的可移植执行文件(PE)和16位视窗的New
Executable(NE)。作为EXE格式,DLL可以包括源代码、数据和资源的多种组合。
————维基百科


????在VS中生成DLL文件

????️‍????第一步:新建一个dll项目

打开我们的VS2017,​​文件 -> 新建 -> 项目​

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_c#_02

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_unity_03

然后找到这个​​VC++​​ 里面的 ​​动态链接库(DLL)​​,改好名称和路径,然后点击确定!

(别的文章可能新建项目时 和这里我写的不一样,那可能是VS版本的问题)

????️‍????第二步:新建一个​​.h头文件​​​和​​.cpp源文件​

第一步确定并等待VS新建项目完成之后,我们还需要手动新建两个文件

右键这个​​头文件​​,​​添加 -> 新建项​​,如下所示

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_windows_04

如果没找到这个图中右边这个​​解决方案资源管理器​​,那就点击 ​​菜单栏的视图 -> 解决方案资源管理器​​ ,就可以调出来了!

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_c#_05

选择​​头文件​​,改个名称路径,点击添加

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_windows_06

然后同样的方法 在解决方案管理器 ​​右键源文件 -> 添加 ->新建项​

然后这次选择​​.cpp文件​​,改个名称路径,点击添加

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_unity_07

????️‍????第三步:在​​.h头文件​​​和​​.cpp源文件​​中编写代码

这里代码是​​C++​​语言,就简单写个方法进行调用测试即可!

firstDLLTest.cpp代码

#include "pch.h"
//加载头文件
#include "firstDLLTest.h"
int firstTest(int i, int(*call_back)(int a, int b))
{
int aa;
aa = i * i;
call_back(i, aa);
return 0;
}

firstDLLTest.h代码:

__declspec(dllexport) int firstTest(int i, int(*call_back)(int a, int b));

????️‍????第四步:生成dll和lib文件

​.h和.cpp代码​​编写完毕之后,​​生成 -> 重新生成解决方案​​,如下图所示

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_源文件_08

然后我们到这个项目的路径的​​Debug文件夹​​下就可以找到​​生成的dll和lib文件​​了!

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_unity_09

这样的话对应的​​DLL文件​​就算是生成了!!


????在VS中进行调用DLL文件

现在我们已经拿到刚才的项目生成的dll文件了,所以新建一个项目来进行调用测试!

????第一步:先来新建一个项目

​文件 -> 新建 -> 项目​​,这次是新建一个控制台应用,如下图,别搞错了!

然后改个名字和路径点击添加即可

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_c#_10

????第二步:复制firstDLLTest.dll和firstDLLTest.lib文件和上一个项目的头文件firstDLLTest.h

将刚才生成的firstDLLTest.dll和firstDLLTest.lib文件,还有上一个项目的头文件firstDLLTest.h,全复制到当前项目的文件夹下

复制dll和lib文件

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_源文件_11

复制.h头文件

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_头文件_12

????第三步:在新项目里面添加C++代码

将上一步的三个文件都复制到当前项目后,开始写代码进行调用,如下

#include <stdio.h>
#include "firstDLLTest.h"
int firstTest_call_back(int a, int b)
{
int c;
c = a + b;
printf("输出:%d\n", c);
return 11;
}
void main()
{
int p = 10;
int test;
test = firstTest(p, firstTest_call_back);
printf("输出2:%d\n", test);
}

????第四步:添加头文件firstDLLTest.h和firstDLLTest.lib文件

将这两个文件添加到当前项目

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_windows_13

添加完之后,效果如下图所示

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_unity_14

????第五步:点击重新生成解决方案

上述操作都做完了之后点击重新生成解决方案,然后运行项目即可!

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_源文件_15

运行效果如下:

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_c#_16

这个​​110​​是我们在main方法中将p的值传给了​​DLL文件​​中的方法​​firstTset​​,在​​firstTest​​方法中进行了相乘操作

使我们调用​​firstTest_call_back​​​方法时,a和b的值变成了10和100,所以在方法中相加输出了​​110​

test则直接返回了firstTest中的0

好了,这就是一个完整的生成DLL文件并在VS中进行调用的方法!


????在Unity中调用这个DLL文件

上面讲的是​​在VS中直接调用生成的这个DLL文件​​​,那接下来就讲一下​​怎样生成一个DLL文件给Unity进行调用​​!

两种方法其实相差不大,就是对应的代码会有些差别,那我还是从头将所有过程都写一下方便学习!

????第一步:新建一个项目

​文件 -> 新建 -> 项目​​,简单改个名字路径即可

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_头文件_17

????第二步:新建一个.h头文件和.cpp源文件

这一步其实跟第一种方法都是一样的,简单说一下!

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_头文件_18

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_c#_19

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_unity_20

Dll2.h代码

#ifndef __NativeCode_H__
#define __NativeCode_H__
#ifndef EXPORT_DLL
#define EXPORT_DLL __declspec(dllexport) //导出dll声明
#endif
extern "C"
{
EXPORT_DLL int MyAddFunc(int _a, int _b);
}
#endif

Dll2.cpp代码

#include "pch.h"
#include "Dll2.h"
#define _DLLExport extern "C" _declspec(dllexport)
_DLLExport int MyAddFunc(int _a, int _b)
{
return _a + _b;
}


extern “C”:指定c编译器编译


????第三步:生成DLL文件

需要注意的只有一个地方,就是下图中这里要改成​​x64​​,最好前边也改成​​Release​

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_c#_21

然后生成即可

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_windows_22

然后我们就可以在这个项目的文件夹下找到对应生成的​​x86的DLL文件​​了

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_c#_23

????第四步:新建一个Unity工程,并新建一个文件夹Plugins

我们新建一个Unity工程后,在​​Assets​​​下新建一个​​Plugins​​文件夹

然后将上面生成的​​DLL文件​​放到这个文件夹下!

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_源文件_24

????第五步:新建一个脚本写代码调用DLL文件

新建一个脚本,脚本内容如下:

using UnityEngine;
using System.Runtime.InteropServices; //调用c++中dll文件需要引入
public class Test : MonoBehaviour
{
[DllImport("Dll2")]
static extern int MyAddFunc(int a, int b);
void Start()
{
int i = MyAddFunc(10, 20);
Debug.Log("数值:" + i);
}
}

这里再简单说一下,在Unity中调用DLL文件和so都是一样的方法

代码中的​​[DllImport("DLLName")]​​是调用 DLL文件so文件 的 固定调用方法,前边调用so文件的时候也提到过!

????第六步:将脚本挂载到场景中一个物体上

将这个脚本挂载到场景中一个物体上,然后启动运行Unity

打印结果如下,成功调用了DLL文件中的方法

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_源文件_25


????总结

本文对​​如何生成一个DLL文件​​​和​​在 VS 和 Unity中 进行调用​

分别将全过程介绍出来了,整体而言并不是很难

因为我们的​​C++​​代码写的很简单,但那是在真正的项目中就是会麻烦很多了

但是我们只要学会了这个方法,那一切都可以融会贯通了!

那本篇文章就到此结束了,如果觉得文章有用就给一波​​点赞收藏关注​​吧!谢谢啦~

Unity与 DLL文件 ☀️| 怎样使用VC++生成一个DLL文件并调用!(包括 在VS 中调用 和 在Unity中调用)_unity_26