lyh916

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  201 随笔 :: 0 文章 :: 12 评论 :: 21万 阅读

参考链接:

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   艰苦奋斗中  阅读(777)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示