Unity C++ Plugins 导入导出

本文详细介绍了在Windows平台上如何通过__declspec(dllexport)和__declspec(dllimport)来正确地导出和导入DLL中的函数与类。对于不同场景下是否需要添加这些标记进行了探讨,并给出了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#ifndef _DLL_H_
#define _DLL_H_//防重复定义

#if BUILDING_DLL //定义为导出DLL 那么需要加上 导出标记
# define DLLIMPORT __declspec (dllexport)
#else            //当是引用DLL 头文件,表明有这个函数时,最好是加上 该函数是导入
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

//0.所有讨论的这些,都只是win上需要,其他平台 不需要这个标记
//1. 当一个函数在其他dll 中时,有可能直接使用该dll的头文件,所以同一个头文件,可能是用于导出函数,也可能是用于导入DLL 时为了表示有这个函数
//2. 其实,如果函数在其他dll中,那么你使用的这个头文件,声明的函数,__declspec (dllimport)是可选的,不是一定要加上的,加上编译器生成的代码更好
//3. 如果是dLL 导出给其他函数使用的,那么在函数前一定要加上__declspec (dllexport)


DLLIMPORT void HelloWorld (void);


#endif /* _DLL_H_ */

当导出一个函数

__declspec(dllexport) void Function1(void);

当导出一个类

class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };

当需要的函数在Unity中使用,因为需要通过函数名字找到,所有需要这个

extern "C"
{
DLLIMPORT void HelloWorld (void);
}
### 如何在 Unity 2018 中正确导入和使用 C++ 编写的 DLL 文件 要在 Unity 2018 中成功导入并使用由 C++ 编写的功能性 DLL 文件,需遵循一系列特定的操作流程。以下是详细的说明: #### 1. 创建 C++ 动态库 (DLL) 创建一个标准的 C++ 动态链接库 (DLL),其中包含希望暴露给外部程序(如 Unity)使用的函数。这些函数通常通过 `extern "C"` 和 `__declspec(dllexport)` 进行导出[^3]。 ```cpp // MyLibrary.h #ifdef MYLIBRARY_EXPORTS #define MYLIBRARY_API __declspec(dllexport) #else #define MYLIBRARY_API __declspec(dllimport) #endif extern "C" { MYLIBRARY_API int Add(int a, int b); } ``` ```cpp // MyLibrary.cpp #include "MyLibrary.h" MYLIBRARY_API int Add(int a, int b) { return a + b; } ``` #### 2. 编译生成 DLL 文件 设置 Visual Studio 或其他支持工具来构建上述代码,并确保目标平台与 Unity 的运行环境一致(通常是 x86/x64 架构)。完成后会得到 `.dll` 文件。 #### 3. 将 DLL 放入 Unity 工程中 将生成好的 DLL 文件放置到 Unity 项目的 **Assets/Plugins/** 目录下。如果需要区分同架构,则可以进一步细分至子文件夹,例如: - Windows 平台下的 x86 版本应放入 **Assets/Plugins/x86/** - 对于 x64 则是 **Assets/Plugins/x86_64/** 这样可以让 Unity 自动识别适合当前系统的插件版本[^4]。 #### 4. 使用 PInvoke 调用 DLL 函数 借助 C# 提供的 Platform Invocation Services (P/Invoke), 可以轻松调用已准备好的原生方法。下面是一个简单的例子展示如何从脚本层面访问之前定义过的加法运算功能: ```csharp using UnityEngine; public class Test : MonoBehaviour { void Start() { Sum_My(3, 4); } [DllImport("MyLibrary")] private static extern int Add(int a, int b); public void Sum_My(int a, int b) { Debug.Log($"调用C++代码计算a+b的结果为{Add(a,b)}"); } } ``` 注意这里 `[DllImport("MyLibrary")]` 行中的字符串参数应当匹配实际 dll 名称(带扩展名),并且大小写敏感度取决于操作系统特性。 #### 5. 测试验证 最后一步是在编辑器模式或者打包后的应用内执行测试案例,确认预期行为正常运作无误之后即可投入正式开发阶段。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值