一、DLL文件的导出
1.新建win32项目,选择DLL empty Project
2.头文件
// 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 UNITYCALL_EXPORTS // 符号编译的。在使用此 DLL 的 // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将 // UNITYCALL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的 // 符号视为是被导出的。 #ifdef UNITYCALL_EXPORTS #define UNITYCALL_API __declspec(dllexport)//宏定义方便书写 #else #define UNITYCALL_API __declspec(dllimport) #endif // 此类是从 UnityCall.dll 导出的 class UNITYCALL_API CUnityCall { public: CUnityCall(void); // TODO: 在此添加您的方法。 }; extern UNITYCALL_API int nUnityCall; extern"C" UNITYCALL_API int fnUnityCall(void); extern"C" UNITYCALL_API void Fun(int* a);
此处定义了宏定义UNITYCALL_API,为了方便书写(因为__declspec(dllexport)容易打错字)。
特别注意:方法要加上extern"C",不然导出后的dll被调用时会找不到指定的方法报错。
3.源文件给出相应方法的实现
// UnityCall.cpp : 定义 DLL 应用程序的导出函数。 // #include "stdafx.h" #include "UnityCall.h" // 这是导出变量的一个示例 UNITYCALL_API int nUnityCall=42; // 这是导出函数的一个示例。 UNITYCALL_API int fnUnityCall(void) { return nUnityCall; } UNITYCALL_API void Fun(int* a) { *a = 60; } // 这是已导出类的构造函数。 // 有关类定义的信息,请参阅 UnityCall.h CUnityCall::CUnityCall() { return; }
4.导出DLL,选择release,根据项目需要导出X86还是X64,然后将导出的dll文件放到unity的plugins文件夹下,点击dll文件可以看到dll import settings面板如下:
需要注意:如果unity编辑器是64位的,而导入的dll是32位的,在编辑器中是无法识别dll的会报错,需要重新导出64的dll,如果项目是X86的,在buildsetting面板可以看到:
则需要对dll设置,在dll import settings面板中将32位的dll的build选项勾选x86,将64位的dll的build选项取消勾选即可。
5.unity创建代码来调用dll方法:
using UnityEngine; using System.Collections; using System.Runtime.InteropServices; public class DLLTest : MonoBehaviour { private int a = 0; [DllImport("UnityCall")] public static extern void Fun(ref int a); [DllImport("UnityCall")] public static extern int fnUnityCall(); // Use this for initialization void Start() { //Fun(ref a); a = fnUnityCall(); print(a); } }
需要注意定义的方法名称要和dll中的相同。
运行以上代码即可输出相应的结果。