lyh916

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

参考链接:

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异常:

posted on 2021-12-12 23:43  艰苦奋斗中  阅读(732)  评论(0编辑  收藏  举报