参考链接:
https://www.jianshu.com/p/65bb18513f19
https://www.cnblogs.com/0kk470/p/10607544.html
1.在vs中新建一个c++空项目
TestCPlus.h
#pragma once #define _DllExport _declspec(dllexport) //_declspec(dllexport)用于将该函数标记为导出函数 extern "C" //让该区域的代码作为C语言来编译,避免C++编译时因函数重载令函数名改变而导致C#调用的时候找不到该函数 { _DllExport int CPlus_Add(int a, int b); }
TestCPlus.cpp
#include "TestCPlus.h" extern "C" { int CPlus_Add(int a, int b) { return a + b; } }
2.生成dll后,放到Assets\Plugins\x86_64下
a.运行时可能会提示需要64位dll
在生成dll时选择64位即可
b.生成dll时可能会报错
解决方法为,设置配置类型为dll
3.编写脚本进行测试
TestCPlusDLL.cs
1 using System.Runtime.InteropServices; 2 using UnityEngine; 3 4 public class TestCPlusDLL : MonoBehaviour 5 { 6 [DllImport("TestCPlus")] 7 private static extern int CPlus_Add(int a, int b); 8 9 [DllImport("TestCPlus", EntryPoint = "CPlus_Add")] 10 private static extern int Add(int a, int b); 11 12 void Start() 13 { 14 int a = 5; 15 int b = 6; 16 Debug.Log(CPlus_Add(a, b)); 17 Debug.Log(Add(a, b)); 18 } 19 }
输出如下。这2个extern修饰的方法对应dll中的CPlus_Add方法,两者的区别在于,是否指定了EntryPoint。EntryPoint参数指明了从dll中调用的方法名,如果未指明,则会调用同名的方法。本例中,两者调用的都是c++中的CPlus_Add
如果去掉EntryPoint参数,会报EntryPointNotFoundException异常: