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

简介: 📢前言🎬通过VC 生成DLL文件🎥在VS中生成DLL文件🏳️‍🌈第一步:新建一个dll项目🏳️‍🌈第二步:新建一个`.h头文件`和`.cpp源文件`🏳️‍🌈第三步:在`.h头文件`和`.cpp源文件`中编写代码🏳️‍🌈第四步:生成dll和lib文件🎥在VS中进行调用DLL文件🚩第一步:先来新建一个项目🚩第二步:复制firstDLLTest.dll和firstDLLTest.lib文件和上一个项目的头文件firstDLLTest.h🚩第三步:在新项目里面添加C++代码🚩第四步:添加头文件firstDLLTest.h和firstDLLTest.

📢前言

前一篇博客讲了一下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,文件 -> 新建 -> 项目

image.png

image.png

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


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


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

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

image.png

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


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

image.png


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

image.png

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


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

image.png


🏳️‍🌈第三步:在.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代码编写完毕之后,生成 -> 重新生成解决方案,如下图所示

image.png

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

image.png

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


🎥在VS中进行调用DLL文件

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


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

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


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

image.png


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

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

复制dll和lib文件

image.png

复制.h头文件

image.png


🚩第三步:在新项目里面添加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文件

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

image.png

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

image.png


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

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

image.png

运行效果如下:

image.png

这个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进行调用!


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


🏁第一步:新建一个项目

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

image.png


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

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

image.png

image.png

image.png

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

image.png

然后生成即可

image.png

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

image.png


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

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


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

image.png


🏁第五步:新建一个脚本写代码调用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文件中的方法

image.png


👥总结

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


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


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


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


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


相关文章
|
1月前
|
C++
C/C++给文件加crc校验
C/C++给文件加crc校验
44 1
|
1月前
|
C++ 数据格式
LabVIEW传递接收C/C++DLL指针
LabVIEW传递接收C/C++DLL指针
41 1
|
2天前
|
C++
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
2 0
C++职工管理系统(类继承、文件、指针操作、中文乱码解决)
|
4天前
|
C++ iOS开发 开发者
C++一分钟之-文件输入输出(I/O)操作
【6月更文挑战第24天】C++的文件I/O涉及`ifstream`, `ofstream`和`fstream`类,用于读写操作。常见问题包括未检查文件打开状态、忘记关闭文件、写入模式覆盖文件及字符编码不匹配。避免这些问题的方法有:检查`is_open()`、显式关闭文件或使用RAII、选择适当打开模式(如追加`ios::app`)以及处理字符编码。示例代码展示了读文件和追加写入文件的实践。理解这些要点能帮助编写更健壮的代码。
14 2
|
21天前
|
编译器 C语言 C++
C++中.h和.hpp文件有什么区别?
C++中.h和.hpp文件有什么区别?
|
22小时前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
1月前
|
C++ 数据格式
【C++】C++中的【文件IO流】使用指南 [手把手代码演示] & [小白秒懂]
【C++】C++中的【文件IO流】使用指南 [手把手代码演示] & [小白秒懂]
【C++】C++中的【文件IO流】使用指南 [手把手代码演示] & [小白秒懂]
|
20天前
|
Java API Android开发
Java通过JNI调用C++的DLL库
Java通过JNI调用C++的DLL库
12 0
|
21天前
|
Linux C++
Linux C/C++目录和文件的更多操作
Linux C/C++目录和文件的更多操作
|
21天前
|
NoSQL Linux C++
Linux C/C++ gdb调试core文件
Linux C/C++ gdb调试core文件