DLL的基本概念
,链接在这:Unity与 DLL文件 ☀️| 什么是DLL✨?怎样通过VC C++ 生成一个DLL文件
做一个概述在VS中调用
和在Unity中调用
,本篇文章都会提到!DLL
并进行调用吧!VS2017
!不同版本可能会有差异,敬请理解!这里再来简单看一下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可以包括源代码、数据和资源的多种组合。
————维基百科
打开我们的VS2017,文件 -> 新建 -> 项目
VC++
里面的 动态链接库(DLL)
,改好名称和路径,然后点击确定!
(别的文章可能新建项目时 和这里我写的不一样,那可能是VS版本的问题)
.h头文件
和.cpp源文件
第一步确定并等待VS新建项目完成之后,我们还需要手动新建两个文件
右键这个头文件
,添加 -> 新建项
,如下所示
解决方案资源管理器
,那就点击 菜单栏的视图 -> 解决方案资源管理器
,就可以调出来了!选择头文件
,改个名称和路径,点击添加
右键源文件 -> 添加 ->新建项
然后这次选择.cpp文件
,改个名称和路径,点击添加
.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));
.h和.cpp代码
编写完毕之后,生成 -> 重新生成解决方案
,如下图所示
Debug文件夹
下就可以找到生成的dll和lib文件
了!DLL文件
就算是生成了!!
现在我们已经拿到刚才的项目生成的dll文件了,所以新建一个项目来进行调用测试!
文件 -> 新建 -> 项目
,这次是新建一个控制台应用,如下图,别搞错了!
然后改个名字和路径点击添加即可
将刚才生成的firstDLLTest.dll和firstDLLTest.lib文件,还有上一个项目的头文件firstDLLTest.h,全复制到当前项目的文件夹下
复制dll和lib文件
将上一步的三个文件都复制到当前项目后,开始写代码进行调用,如下
#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);
}
将这两个文件添加到当前项目
上述操作都做完了之后点击重新生成解决方案,然后运行项目即可!
110
是我们在main方法中将p的值传给了DLL文件
中的方法firstTset
,在firstTest
方法中进行了相乘操作
使我们调用firstTest_call_back
方法时,a和b的值变成了10和100,所以在方法中相加输出了110
而test则直接返回了firstTest中的0!
好了,这就是一个完整的生成DLL文件并在VS中进行调用的方法!
上面讲的是在VS中直接调用生成的这个DLL文件
,那接下来就讲一下怎样生成一个DLL文件给Unity进行调用
!
两种方法其实相差不大,就是对应的代码会有些差别,那我还是从头将所有过程都写一下方便学习!
文件 -> 新建 -> 项目
,简单改个名字和路径即可
这一步其实跟第一种方法都是一样的,简单说一下!
#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编译器编译
需要注意的只有一个地方,就是下图中这里要改成x64
,最好前边也改成Release
x86的DLL文件
了我们新建一个Unity工程后,在Assets
下新建一个Plugins
文件夹
然后将上面生成的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文件中的方法
本文对如何生成一个DLL文件
和在 VS 和 Unity中 进行调用
分别将全过程介绍出来了,整体而言并不是很难
因为我们的C++
代码写的很简单,但那是在真正的项目中就是会麻烦很多了
但是我们只要学会了这个方法,那一切都可以融会贯通了!
那本篇文章就到此结束了,如果觉得文章有用就给一波点赞收藏关注
吧!谢谢啦~
🚀 优质专栏分享 🚀 |
联系客服