Unity3d 调用 C++ DLL之 DLL回调Unity3d (C++ DLL回调 C#函数)

时间:2022-02-16 18:59:37

上篇   Unity3d 调用C++ DLL (Win平台)  介绍了简单的 Unity3d 调用 C++ DLL的方法,但是这样是不够的,这里再讲下通过函数指针让 C++ DLL中回调 Unity3d 的方式。

转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

创建DLL 以及在 Unity3d 中调用 DLL 中函数在上篇中介绍了。


首先,在C#中是没有函数指针的,我们使用 Delegate 。

转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

我们来创建 DLL

在上篇的工程中修改。


Calculate.h

# define _DLLExport __declspec (dllexport) //标记为导出函数;
//定义函数指针;
typedef void (__stdcall *CPPCallback)(int tick);

extern "C" void _DLLExport SetCallback(CPPCallback callback);

extern "C" long long _DLLExport dlltest();

Calculate.cpp

#include "Calculate.h"long long dlltest(){long long a = 1;int b = 0;while(b<1000000000){a=a+b;b++;}return a;}void SetCallback(CPPCallback callback){int tick=1223;callback(tick);}

在DLL中定义函数SetCallback() 来设置回调函数。

转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

在Unity3d 中使用DLL

using UnityEngine;using System.Collections;using System.Runtime.InteropServices;public class NewBehaviourScript : MonoBehaviour {[DllImport ("TestDLL")]private static extern long dlltest();[DllImport ("TestDLL")]private static extern void SetCallback(CSCallback callback);public delegate void CSCallback(int tick);static CSCallback callback;// Use this for initializationvoid Start () {callback = CSCallbackFuction;}static void CSCallbackFuction(int tick){Debug.Log ("CSCallbackFuction "+tick.ToString());}void OnGUI(){if(GUI.Button(new Rect(100,100,200,200),"Test DLL")){long before=System.DateTime.Now.Ticks;Debug.Log("dlltest="+ dlltest());Debug.Log("take "+(System.DateTime.Now.Ticks-before));}if(GUI.Button(new Rect(100,300,200,200),"SetCallback")){long before=System.DateTime.Now.Ticks;SetCallback(callback);Debug.Log("take "+(System.DateTime.Now.Ticks-before));}if(GUI.Button(new Rect(300,300,200,200),"Test Mono")){long before=System.DateTime.Now.Ticks;Debug.Log("monotest="+ monotest());Debug.Log("take "+(System.DateTime.Now.Ticks-before));}}// Update is called once per framevoid Update () {}long monotest(){long a = 1;int b = 0;while(b<1000000000){a=a+b;b++;}return a;}}
转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

运行成功

Unity3d 调用 C++ DLL之 DLL回调Unity3d (C++ DLL回调 C#函数)

转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn

示例工程下载:

http://pan.baidu.com/s/1jG499HW


转自http://blog.csdn.net/huutu 星环游戏 http://www.thisisgame.com.cn