C++ 封装 DLL 供 Unity 调用

2024-09-05 19:28
文章标签 c++ dll 封装 调用 unity

本文主要是介绍C++ 封装 DLL 供 Unity 调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一:封装DLL

       开发工具最好使用 Visual Studio 20XX 来制作,因为VS Code 需要配置很多东西,环境搭建过程比较复杂。

        a、我安装的是 Visual Studio 2022,安装的时候,【工作负荷】记得勾选 【使用C++的桌面开发】和【使用C++的移动开发】。

        b、安装 Windows SDK。在这里下载。

1.创建工程

        a.创建文件夹CPP到桌面(PS:你可以选择你认为合适的位置和合适的文件夹名称)

        b.打开Visual Studio

        c.新建工程选择 【动态链接库(DLL)】

        d.命名后选择工程文件夹地址

        e.创建后会自动生成一些文件

 2.修改代码

        a.dllmain.cpp 中是方法实现的脚本,实现自己的方法,完整代码如下:

#include "pch.h" int SumTo(int a, int b) {return a + b;
}

        注意:方法名称尽量不要写的太简单,比如 add,minus等,因为可能和引用的库函数同名,这样的化,就会造成Unity调用不到的问题,这个稍后再说。

        b.pch.h 是预编译标头文件,定义一些宏 以及在 dllmain.cpp 中需要导出的方法的声明,实现如下:

#ifndef PCH_H
#define PCH_H// 添加要在此处预编译的标头
#include "framework.h"// 设置宏定义
#define EXPORT_DLL extern "C" __declspec(dllimport)// 导出函数
EXPORT_DLL int SumTo(int a, int b);#endif // PCH_H

        其中我在网上找到过一些宏定义的写法跟我现在写的不一样,这样会导致和上边提到的相同的问题,稍后再说。

3.生成DLL

        选项栏里选择【生成】--【生成解决方案】,等待一会儿,下方输出窗口会显示生成成功,并指明DLL所在位置,这里DLL 的名称就是你当初命名的工程名称。不过可以在VS 的【资源管理器窗口】中的【解决方案】下边的项目名称上右键【重命名】。

        现在DLL就生成成功了。

二.Unity 调用

        a.新建Unity工程,将DLL复制到Plugin文件夹下,新建脚本 MyDLL.cs ,代码如下:

using System.Runtime.InteropServices;
using UnityEngine;public class MyDLL : MonoBehaviour
{[DllImport("DLL1")]public static extern int SumTo(int a, int b);// Start is called before the first frame updatevoid Start(){Debug.Log(SumTo(1254, 20246));}
}

        挂在任何一个物体下,运行之后控制台打印如下:

        测试成功! 

下边说一下上边提到的问题:

  

        其实【DllImport】还有一个 EntryPoint 参数,这个EntryPoint就是入口点。也就是说C++在编译的时候,给每一个方法都生成了唯一一个入口点标志。如果使用了另一种方式定义宏,或者方法名称起的太过泛化,就会导致C++在生成EntryPoint的时候,会额外加一些其他字母,这时,在C#部分就要加入EntryPoint参数指定方法的位置,但是具体这个参数值是不是和你的方法名称保持一致,就只能使用 Developer Command Prompt 【安卓vs时附带的工具】使用命令来查找了。

命令如下

          dumpbin /exports dll文件地址(建议使用unity plugins的地址)

这篇关于C++ 封装 DLL 供 Unity 调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1139844

相关文章

SpringBoot中封装Cors自动配置方式

《SpringBoot中封装Cors自动配置方式》:本文主要介绍SpringBoot中封装Cors自动配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot封装Cors自动配置背景实现步骤1. 创建 GlobalCorsProperties

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较

电脑win32spl.dll文件丢失咋办? win32spl.dll丢失无法连接打印机修复技巧

《电脑win32spl.dll文件丢失咋办?win32spl.dll丢失无法连接打印机修复技巧》电脑突然提示win32spl.dll文件丢失,打印机死活连不上,今天就来给大家详细讲解一下这个问题的解... 不知道大家在使用电脑的时候是否遇到过关于win32spl.dll文件丢失的问题,win32spl.dl

SpringCloud之LoadBalancer负载均衡服务调用过程

《SpringCloud之LoadBalancer负载均衡服务调用过程》:本文主要介绍SpringCloud之LoadBalancer负载均衡服务调用过程,具有很好的参考价值,希望对大家有所帮助,... 目录前言一、LoadBalancer是什么?二、使用步骤1、启动consul2、客户端加入依赖3、以服务

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa