UE(虚幻)学习(三) UnrealSharp插件中调用非托管DLL
上一篇文章中我使用UnrealSharp成功使用了我的一个C#控制台程序中的网络模块,这个程序是基于KCP网络了,其中调用了Cmake 编译的一个C++的DLL,在虚幻中DLL需要放在Binaries目录中才可以。Unity中只要放在任意Plugins目录中就可以。
但是Binaries目录版本控制一般不提交,我们可以改一下,改成按照路径加载。
修改前的脚本
using System.Runtime.InteropServices;//脚本修改自//https://github.com/a11s/kcp_warppernamespace NetLibrary
{public unsafe class KCP{const string LIBNAME = "libikcp.dll";//---------------------------------------------------------------------// interface//---------------------------------------------------------------------/// <summary>/// create a new kcp control object, 'conv' must equal in two endpoint/// from the same connection. 'user' will be passed to the output callback/// output callback can be setup like this: 'kcp->output = my_udp_output'/// </summary>/// <param name="conv"></param>/// <param name="user"></param>/// <returns></returns>[DllImport(LIBNAME, EntryPoint = "ikcp_create", CallingConvention = CallingConvention.Cdecl)]public static extern IKCPCB* ikcp_create(uint conv, void* user);/// <summary>/// release kcp control object/// </summary>/// <param name="kcp"></param>[DllImport(LIBNAME, EntryPoint = "ikcp_release", CallingConvention = CallingConvention.Cdecl)]public static extern void ikcp_release(IKCPCB* kcp);/// <summary>/// set output callback, which will be invoked by kcp///public static extern void ikcp_setoutput(IKCPCB* kcp, int (* output)(byte* buf, int len, ikcpcb *kcp, void* user));/// </summary>/// <param name="kcp"></param>/// <param name="d_output"></param>[DllImport(LIBNAME, EntryPoint = "ikcp_setoutput", CallingConvention = CallingConvention.Cdecl)]public static extern void ikcp_setoutput(IKCPCB* kcp, System.IntPtr d_output);
篇幅太大没有必要,只展示部分代码片段。
可以看到之前是通过DllImport 载入LIBNAME变量来载入DLL的。
改为动态路径
先放上所有改动
// 动态获取库路径
private static string GetLibraryPath()
{string baseDirectory = AppDomain.CurrentDomain.BaseDirectory;//动态库的路径被拼接到 Binaries\Managed\Third\libikcp.dll,而你的实际库文件存放在 E:\myproject\Third\libikcp.dll,这说明 AppDomain.CurrentDomain.BaseDirectory 返回的路径是 Binaries\Managed。baseDirectory = Path.Combine(baseDirectory, "../../");string relativePath;// 根据平台选择库路径if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)){relativePath = "ThirdParty/Kcp/Win64/libikcp.dll";}else if (RuntimeInformation.IsOSPlatform(OSPlatform.Create("ANDROID"))){relativePath = "ThirdParty/Kcp/Android/arm64-v8a/libikcp.so";}else{throw new PlatformNotSupportedException("Unsupported platform");}return Path.Combine(baseDirectory, relativePath);
}// DllImport 使用动态路径
private const string LIBNAME = "PLACEHOLDER"; // 占位符
private static bool _isResolverSet = false;
// 添加初始化方法以动态设置路径
public static void Initialize()
{if (_isResolverSet){Loger.Debug($"BSserver DLL: 已经加载过了 .");return;}try{string libraryPath = GetLibraryPath();//Loger.Error($"BSserver DLL:{libraryPath}");NativeLibrary.SetDllImportResolver(typeof(KCP).Assembly, (name, assembly, path) =>{if (name == LIBNAME){return NativeLibrary.Load(libraryPath);}return IntPtr.Zero;});_isResolverSet = true;}catch(Exception e) {//AClientMain.inst.PrintString("C# : DLL:" + libraryPath);Console.WriteLine($"Loaded library 加载错误 ."+e.Message);Loger.Error($"BSserver DLL 加载错误 : " + e.Message);}}
//const string LIBNAME = "libikcp.dll";
//---------------------------------------------------------------------
// interface
//---------------------------------------------------------------------/// <summary>
/// create a new kcp control object, 'conv' must equal in two endpoint
/// from the same connection. 'user' will be passed to the output callback
/// output callback can be setup like this: 'kcp->output = my_udp_output'
/// </summary>
/// <param name="conv"></param>
/// <param name="user"></param>
/// <returns></returns>
[DllImport(LIBNAME, EntryPoint = "ikcp_create", CallingConvention = CallingConvention.Cdecl)]
public static extern IKCPCB* ikcp_create(uint conv, void* user);/// <summary>
/// release kcp control object
/// </summary>
/// <param name="kcp"></param>
[DllImport(LIBNAME, EntryPoint = "ikcp_release", CallingConvention = CallingConvention.Cdecl)]
public static extern void ikcp_release(IKCPCB* kcp);
使用方法:
我们在UE的工程下创建目录ThirdParty,按照代码里的路径,把DLL放进去,按照不同平台。
在加载DLL之前,我们需要调用Initialize方法初始化动态设置路径就可以了。
这些代码是ChatGPT帮忙写的,经过几次修改有了这段代码。
小技巧
以前是内事不决问baidu,外事不决问google,现在是内事问豆包,外事问ChatGPT。 :)
但是小心AI一本正经的胡说八道。 :P
相关文章:
UE(虚幻)学习(三) UnrealSharp插件中调用非托管DLL
上一篇文章中我使用UnrealSharp成功使用了我的一个C#控制台程序中的网络模块,这个程序是基于KCP网络了,其中调用了Cmake 编译的一个C的DLL,在虚幻中DLL需要放在Binaries目录中才可以。Unity中只要放在任意Plugins目录中就可以。 但是Binaries…...
leetcode 3219. 切蛋糕的最小总开销 II
题目:3219. 切蛋糕的最小总开销 II - 力扣(LeetCode) 排序贪心。 开销越大的越早切。 注意m或n为1的情况。 class Solution { public:long long minimumCost(int m, int n, vector<int>& horizontalCut, vector<int>&…...
vant 地址记录
vant ui 的官网地址记录 vant 4 Vant 4 - A lightweight, customizable Vue UI library for mobile web apps. vant2 https://vant-ui.github.io/vant/v2/ vant3 Vant 3 - Lightweight Mobile UI Components built on Vue...
Lua语言入门 - Lua常量
在Lua中,虽然没有直接的常量关键字(如C中的const),但你可以通过一些编程技巧和约定来实现类似常量的行为。以下是几种常见的方法: 1. 使用全局变量并命名规范 你可以定义一个全局变量,并通过命名约定来表示…...
在Microsoft Windows上安装MySQL
MySQL仅适用于Microsoft Windows 64位操作系统,在Microsoft Windows上安装MySQL有不同的方法:MSI、包含您解压缩的所有必要文件的标准二进制版本(打包为压缩文件)以及自己编译MySQL源文件。 注意:MySQL8.4服务器需要在…...
windows下vscode使用msvc编译器出现中文乱码
文章目录 [toc]1、概述2、修改已创建文件编码3、修改vscode默认编码 更多精彩内容👉内容导航 👈👉C 👈👉开发工具 👈 1、概述 在使用MSVC编译器时,出现中文报错的问题可能与编码格式有关。UTF-…...
Git 解决 everything up-to-date
首先使用git log查看历史提交,找到最新一次提交,比如: PS D:\Unity Projects\CoffeeHouse\CoffeeHouse_BurstDebugInformation_DoNotShip> git log commit a1b54c309ade7c07c3981d3ed748b0ffac2759a3 (HEAD -> master, origin/master)…...
Windows配置cuda,并安装配置Pytorch-GPU版本
文章目录 1. CUDA Toolkit安装2. 安装cuDNN3. 添加环境变量配置Pytorch GPU版本 博主的电脑是Windows11,在安装cuda之前,请先查看pytorch支持的版本,cuda可以向下兼容,但是pytorch不行,请先进入:https://py…...
Neo4j 图数据库安装与操作指南(以mac为例)
目录 一、安装前提条件 1.1 Java环境 1.2 Homebrew(可选) 二、下载并安装Neo4j 2.1 从官方网站下载 2.1.1 访问Neo4j的官方网站 2.1.2 使用Homebrew安装 三、配置Neo4j 3.1 设置环境变量(可选) 3.2 打开配置文件(bash_profile) 3.2.1 打开终端…...
2024年12月个人工作生活总结
本文为 2024年12月工作生活总结。 研发编码 Golang语言byte数组赋值 假定有如下变量: var strCode string var bCode [9]byte现需将string类型转换成byte类型,如下: bCode []byte(strCode)无法转换,提示: cannot…...
PHP:IntelliJ IDEA 配置 PHP 开发环境及导入PHP项目
在创建PHP项目之前我们需要安装PHP插件,安装步骤如下:Windows:IntelliJ IDEA Ultimate 安装 PHP 插件-CSDN博客 1、导入已有PHP项目,导入之后选择,File > Setting 选择对应CLL Interpreter,如果没有操作…...
【嵌入式C语言】指针数组结构体
指针与数组 指针与数组指针数组数组指针 多维数组数组名的保存 结构体定义结构体定义结构体变量使用typedef简化结构体声明访问结构体成员结构体内存分配字节对齐位域定义位域位域的限制示例 指针与数组 指针数组和数组指针是两个不同的概念,它们涉及到指针和数组的…...
国产数据库TiDB从入门到放弃教程
国家层面战略,安全的角度,硬件、软件国产化是趋势,鸿蒙电脑操作系统、鸿蒙手机操作系统…数据库也会慢慢国产化,国产数据库TiDB用起来比OceanBase丝滑,本身没有那么重。 从入门到放弃 1. 介绍1.1 TiDB 的主要特点1.2 T…...
深入解析 Spring 属性:spring.codec.max-in-memory-size
在现代 Web 应用开发中,数据传输的大小和效率直接影响到系统的性能和稳定性。Spring WebFlux 作为一种响应式编程框架,提供了强大的数据流处理能力。在使用 WebFlux 时,spring.codec.max-in-memory-size 是一个关键配置,用于定义应…...
在K8S中,如何查看Pod状态的详情?事件显示cpu不足如何处理?
在Kubernetes中,查看Pod状态的详细通常设计使用kubectl命令行工具,这是kubernetes提供的一个强大的管理工具。以下是如何查看Pod状态详情的步骤: 1. 查看Pod状态详情 列出所有Pod: 使用kubectl get pods命令可以查看集群所有Po…...
ArcGIS教程(009):ArcGIS制作校园3D展示图
文章目录 数据下载校园3D展示图制作创建要素类矢量化【楼】要素矢量化【绿地】矢量化【范围】矢量化处理打开ArcScene添加动画数据下载 https://download.csdn.net/download/WwLK123/90189025校园3D展示图制作 创建要素类 添加底图: 新建【文件地理数据库】,并修改名称为【…...
REDIS2.0
string list hash set 无序集合 声明一个key,键里面的值是元素,元素的类型是string 元素的值是唯一的,不能重复 多个集合类型之间可以进行并集,交集,集查的运算 sadd test1 a b c c d :添加5个元素&am…...
算法练习——模拟题
前言:模拟题的特点在于没有什么固定的技巧,完全考验自己的代码能力,因此有助于提升自己的代码水平。如果说一定有什么技巧的话,那就是有的模拟题能够通过找规律来简化算法。 一:替换所有问号 题目要求: 解…...
京东供应链创新与实践:应用数据驱动的库存选品和调拨算法提升履约效率
2024 年度总结系列 2024 年 10 月,京东零售供应链技术团队凭借其在库存选品与调拨技术上的创新与实践,荣获运筹与管理学领域的国际顶级奖项 Daniel H. Wagner Prize。本文为您介绍获奖背后的供应链技术创新和落地应用。 00 摘要 在电商行业中&#x…...
pytorch张量的fill_方法介绍
在 PyTorch 中,fill_ 是一个张量的原地操作方法,用于将张量中的所有元素填充为指定的值。 方法签名 Tensor.fill_(value)参数 value (float or int): 要填充到张量中的值。 返回值 返回调用该方法的张量本身,且是经过修改后的张量。 特…...
全面解锁《鸣潮》游戏潜力:WaveTools工具箱新手使用指南
全面解锁《鸣潮》游戏潜力:WaveTools工具箱新手使用指南 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 想要在《鸣潮》中获得更流畅的游戏体验和更精细的画质控制吗?WaveTools鸣潮…...
如何让经典游戏在Windows 10/11上完美运行:DDrawCompat终极解决方案指南
如何让经典游戏在Windows 10/11上完美运行:DDrawCompat终极解决方案指南 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_…...
3大优势!Scarab模组管理工具使用技巧:从新手到高手的进阶指南
3大优势!Scarab模组管理工具使用技巧:从新手到高手的进阶指南 【免费下载链接】Scarab An installer for Hollow Knight mods written in Avalonia. 项目地址: https://gitcode.com/gh_mirrors/sc/Scarab 你是否在安装空洞骑士模组时遇到过文件路…...
Zotero Reference:重新定义学术文献管理效率的开源工具
Zotero Reference:重新定义学术文献管理效率的开源工具 【免费下载链接】zotero-reference PDF references add-on for Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-reference 一、5大核心价值:为什么Zotero Reference是研究者的…...
3步极速焕新Windows!零基础用Win11Debloat让系统快如闪电
3步极速焕新Windows!零基础用Win11Debloat让系统快如闪电 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and…...
番茄小说下载器:全能解析引擎驱动的一站式数字阅读解决方案
番茄小说下载器:全能解析引擎驱动的一站式数字阅读解决方案 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 在数字阅读日益普及的今天,读者们常面临三大…...
从理论到实践:剖析快速排序比较次数的优化边界
1. 快速排序的核心原理与比较次数 快速排序之所以被称为"快速",核心在于它的分治策略。想象一下你正在整理一堆杂乱无章的书籍,最有效的方法可能是先选一个基准书(比如按书名首字母),然后把其他书分成"…...
一键隐藏桌面图标任务栏的实用工具
软件介绍 AutoDesktop是一个专门管理桌面图标显示与隐藏的小工具。它的作用很简单:一键把桌面上乱七八糟的图标和底部的任务栏全都藏起来,还你一个干干净净的桌面。 体积小巧运行轻量 整个软件才40K大小,真的非常小。双击运行后会自动关闭…...
猫抓扩展完整配置指南:从零开始掌握浏览器资源嗅探
猫抓扩展完整配置指南:从零开始掌握浏览器资源嗅探 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为网页上的视频无法下载而烦恼吗…...
Realtek 8922AE WiFi 7网卡驱动固件版本不匹配实战指南:从问题诊断到长效维护
Realtek 8922AE WiFi 7网卡驱动固件版本不匹配实战指南:从问题诊断到长效维护 【免费下载链接】rtw89 Driver for Realtek 8852AE, an 802.11ax device 项目地址: https://gitcode.com/gh_mirrors/rt/rtw89 在Linux系统中,网卡驱动是连接网络的核…...
