//新建项目-window桌面向导,建立一个C++ DLL库文件空项目,
#ifndef _CPP_Test_H_
#define _CPP_Test_H_
#include <string>
#ifdef _WIN32
//_declspec(dllexport)只在windows下使用
#define EXPORT_DLL _declspec(dllexport)
#else
#define EXPORT_DLL
#endif
extern "C"
{
int ai = 0;
typedef char*(*CallBack)(const char* str);
CallBack FunA;
EXPORT_DLL void SetIntA(int a)
{
ai = a;
}
EXPORT_DLL int GetIntA()
{
return ai;
}
EXPORT_DLL int addNumber(int a, int b) {
return a + b;
}
EXPORT_DLL void SetCallBack(CallBack a)
{
FunA = a;
}
//EXPORT_DLL const char* CallFun(const char* ch)
//{
// return FunA(ch);
//}
EXPORT_DLL const char* CallFun( const char* ch )
{
char *buff1 = FunA(ch);
std::string str = "CPPInner ";
str += buff1;
return str.c_str(); //FunA(ch);
}
EXPORT_DLL const char* SayHelloWorld() {
return "hello world";
}
};
#endif
//根据电脑平台,x64还是x84 ,生成 dll文件,然后导入uniyt的plugins/x64文件下。
using AOT;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
using System.Text;
public class CallTest : MonoBehaviour {
[DllImport("ExportToUnity1")]
private extern static int addNumber(int a, int b);
[DllImport("ExportToUnity1")]
private extern static void SetIntA(int a);
[DllImport("ExportToUnity1")]
private extern static int GetIntA();
//--------------
//C++ 调用C#
public delegate string CallBack(string s);
[DllImport("ExportToUnity1")]
private extern static string SetCallBack(CallBack a);
[DllImport("ExportToUnity1")]
private extern static IntPtr CallFun(string a);
//-------------
[DllImport("ExportToUnity1")]
public static extern IntPtr SayHelloWorld();
// Use this for initialization
void Start () {
print(addNumber(1, 2));
SetIntA(10);
print(GetIntA());
SetCallBack(CallBackFun1);
print("-----------");
IntPtr ret0 = CallFun("abc");
string str0 = Marshal.PtrToStringAnsi(ret0);
print(str0);
print("-----------");
IntPtr ret = SayHelloWorld();
string str = Marshal.PtrToStringAnsi(ret);
print(str);
}
//回调函数
[MonoPInvokeCallback(typeof(CallBack))]
public string CallBackFun1(string s) //加static 可以兼容所有模式
{
Debug.Log("debug:"+s);
s += " Csharp";
return s;
}
}