unity呼叫匯出的c++的dll的方法
阿新 • • 發佈:2019-01-31
一、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中的相同。
執行以上程式碼即可輸出相應的結果。