1. 程式人生 > >unity呼叫匯出的c++的dll的方法

unity呼叫匯出的c++的dll的方法

一、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中的相同。

執行以上程式碼即可輸出相應的結果。