ILRuntime热更的小技巧

news2025/2/23 18:04:07

文章目录

        • 前因
        • 后果

前因

  • 因为ILRuntime热更项目直接打包出来的DLL不能放置到AssetBundle里面打包
  • 所以我看网上的代码都是读取DLL的bytes然后放置到一个text文件里面后缀是bytes
public class DefaultPath
{
	public static string ProjectRootPath = Environment.CurrentDirectory;
	/// <summary>
	/// 可读
	/// </summary>
	public static string ReadOnlyStreamingPath = Application.streamingAssetsPath;
	/// <summary>
	/// 可读可写全平台通用
	/// </summary>
	public static string ReadAndWritePath = Application.persistentDataPath;

	/// <summary>
	/// <项目路径>/Assets 仅在编辑器使用 属于unity工程目录下
	/// </summary>
	public static string AssetFolderPath = Application.dataPath;
	//输出路径						
	public static string OutputPath = DefaultPath.AssetFolderPath + "/AddressableFiles/TransformDLL";
	public static string LoadDllPath = OutputPath + "/HotFix_Project_DLL.bytes";
	public static string LoadPDBPath = OutputPath + "/HotFix_Project_PDB.bytes";

	static DefaultPath()
	{
		Debug.Log($"ProjectRootPath_{ProjectRootPath}\n{nameof(ReadOnlyStreamingPath)}_{ReadOnlyStreamingPath}\n{nameof(ReadAndWritePath)}_{ReadAndWritePath}\n{nameof(AssetFolderPath)}_{AssetFolderPath}");
	}



}

public class ILRuntimeHelper
{
	const string srcKey = "SrcDLLPath";
	public static string TargetDll => PathUtility.GetRootPath(srcKey) + "/HotFix_Project.dll";
	public static string TargetPDB => PathUtility.GetRootPath(srcKey) + "/HotFix_Project.pdb";
	public static string OutputPath => DefaultPath.OutputPath;
	public static string LoadDllPath => DefaultPath.LoadDllPath;
	public static string LoadPDBPath => DefaultPath.LoadPDBPath;

	public const string Symbol = "TestRemoteLoadCode";

	[MenuItem("Tools/指定加載DLL的文件夾")]
	private static void SetDLLPath()
	{
		PathUtility.SetRootPath(srcKey);
	}



	[MenuItem("Tools/DllToByte")]
	private static void DLLToBytes()
	{
		if (!File.Exists(OutputPath))
		{
			Directory.CreateDirectory(OutputPath);
		}

		void CheckFileValid(string path, string loadPath)
		{
			if (!File.Exists(path))
			{
				throw new Exception($"不存在指定文件{path}");
			}
			File.WriteAllBytes(loadPath, File.ReadAllBytes(path));
		}

		CheckFileValid(TargetDll, LoadDllPath);
		CheckFileValid(TargetPDB, LoadPDBPath);

		AssetDatabase.Refresh();
	}

}

后果

  • 但是这样就很麻烦,因为每次我要先点击热更项目的生成,在生成后再回到Unity里面点击DLLToByte按钮。
  • 所以我在热更项目的生成事件里面加入了一个bat命令脚本,当热更项目生成后会自动执行这个命令,这个命令会执行一个程序自动把DLL转换为byte文件放置到Unity对应文件夹里

在这里插入图片描述

在这里插入图片描述

  • call 就是调用的意思,projectDir是内置宏,就是热更项目所在的文件夹
  • 在这里插入图片描述
  • bat命令和转换的代码
  • bat文件的读取和输出文件夹需要自己改成需要的
::切换到bat文件所在的文件夹
cd /d %~dp0
::%NAME%可以引用变量
::set 可以设置变量
set PROJECTNAME=HotFix_Project
set OUTDLLNAME=%PROJECTNAME%_DLL.bytes
set OUTPDBNAME=%PROJECTNAME%_PDB.bytes
set FROMDLLNAME=%PROJECTNAME%.pdb
set FROMPDBNAME=%PROJECTNAME%.dll

set curdir=%cd%
set EXENAME=%curdir%\TransformHotfixDLL.exe

set DLLPATH=%curdir%\bin\%FROMDLLNAME%
set PDBPATH=%curdir%\bin\%FROMPDBNAME%

cd ..
set curdir=%cd%
set OUTDLLPATH=%curdir%\Assets\AddressableFiles\TransformDLL\%OUTDLLNAME%
set OUTPDBPATH=%curdir%\Assets\AddressableFiles\TransformDLL\%OUTPDBNAME%
set OUTPUTPATH=%curdir%\Assets\AddressableFiles\TransformDLL
::start是启动程序 后面的字符串是输入程序的参数
start %EXENAME% "%DLLPATH%|%PDBPATH%|%OUTPUTPATH%|%OUTDLLPATH%|%OUTPDBPATH%" 
  • exe文件
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace TransformHotfixDLL
{
	internal class Program
	{
		static void Main(string[] args)
		{
			var paths = args[0].Split('|');
			var fromDLLPath = paths[0];
			var fromPDBPath = paths[1];
			var targetPath = paths[2];
			var LoadPDBPath = paths[3];
			var LoadDllPath = paths[4];

			if (!File.Exists(targetPath))
			{
				Directory.CreateDirectory(targetPath);
			}

			void CheckFileValid(string path, string loadPath)
			{
				if (!File.Exists(path))
				{
					throw new Exception($"不存在指定文件{path}");
				}
				File.WriteAllBytes(loadPath, File.ReadAllBytes(path));
			}

			CheckFileValid(fromDLLPath, LoadDllPath);
			CheckFileValid(fromPDBPath, LoadPDBPath);


		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28829.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超市便利店微信小程序引流拉新_分享超市便利店微信小程序开发的作用

作为消费主力的年轻人&#xff0c;习惯用手机。习惯在手机下单&#xff0c;享受足不出户的方便快捷。 再加上疫情反复&#xff0c;线上购物&#xff0c;无接触配送显得更安全卫生。 再这样的市场环境下&#xff0c;做一个线上的超市小程序&#xff0c;就能解决很多问题&…

SpringCloud学习笔记(三)

文章目录SpringCloud学习笔记(一)1.Ribbon 概述2.负载均衡3.Ribbon 快速入门3.1 本次调用设计图3.2 项目搭建3.3 创建 provider-1和provider-23.4 编写 provider-1 和 provider-23.5 创建 consumer3.6 编写 consumer 的启动类3.7 编写 consumer 的 ConsumerController3.8 启动测…

83.Django项目中使用验证码

1. 概述 ​ 验证码&#xff08;CAPTCHA&#xff09;是“Completely Automated Public Turing test to tell Computers and Humans Apart”&#xff08;全自动区分计算机和人类的图灵测试&#xff09;的缩写&#xff0c;是一种区分用户是计算机还是人的公共全自动程序。可以防止…

分布式节能聚类算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

MySQL隔离级别的底层理解(MVCC+锁)

MySQL事务的隔离级别和并发的关系 mysql是一个C/S架构的软件, 也就意味着, 同一个mysql服务器可能同时存在很多的clients集合来访问. 此时最重要的是什么? 并发性. 并发时候的安全. 并发和数据库安全性本来就是相互矛盾的。要保证更好的安全性最好的方式是什么? 完全舍弃并…

云原生系列 四【轻松入门容器基础操作】

✅作者简介&#xff1a; CSDN内容合伙人&#xff0c;全栈领域新星创作者&#xff0c;阿里云专家博主&#xff0c;华为云云 享专家博主&#xff0c;掘金后端评审团成员 &#x1f495;前言&#xff1a; 最近云原生领域热火朝天&#xff0c;那么云原生是什么&#xff1f;何为云原生…

最详细的Keycloak教程:Keycloak实现手机号、验证码登陆——(一)Keycloak的下载与使用

目录一、 简介二、Keycloak下载与启动三、配置国际化内容一、 简介 接触keycloak已经半个多月了&#xff0c;主要是为了用来集成现已有的项目&#xff0c;也是弄得头大&#xff0c;代码不负脱发人&#xff0c;也是有点小成果了&#xff0c;在这里把自己的这点小小经验分享给大…

CMOS IC功耗类型及其影响因素

目录 概述 开关功耗&#xff08;Switch Power&#xff09; 内部功耗&#xff08;Internal Power&#xff09; 漏电功耗&#xff08;Leakage Power&#xff09; 工艺库相关 开关功率相关信息 内部功耗相关信息 漏电功耗相关信息 例子 概述 该部分对IC功耗的类型进行介绍 先总体来…

安装黑苹果常见问题总结

黑苹果字体模糊&#xff1f; 由于macOS使用了HiDPi技术以达到更高的每英寸像素率&#xff0c;即缩放&#xff0c;因此普通显示器只要不是4k分辨率&#xff0c;安装黑苹果后一定会遇到字体模糊的问题&#xff0c;解决方法可以阅读我往期发布的文章。 为什么用iStat Menus无法检…

期末前端web大作业:用DIV+CSS技术设计的动漫网站——火影忍者6页 带报告

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 网页设计作业 | 动漫网页设计 | 动漫网页设计成品 | 动漫网页设计成品模板 | 简单漫画网页设计成品 | HTML期末大学生网页设计作业 HTML&#xff1a;结…

深度学习第四课——卷积神经网络(week 1)

目录 一、前言 1.1 卷积 1.2 其他滤波器 1.3 Padding 1.3.1 解释 1.3.2 填充多少像素的选择 1.4 卷积步长 1.5 三维卷积 1.6 单层卷积网络 1.7 深度卷积神经网络的一个示例 1.8 池化层 1.8.1 最大池化 1.8.2 平均池化 1.8.3 总结 1.9 卷积神经网络示例 1.10 为…

23种设计模式

1.创建型模式 ① 创建型模式的作用就是创建对象&#xff0c;说到创建一个对象&#xff0c;最熟悉的就是 new 一个对象&#xff0c;然后 set 相关属性 ② 但是很多场景下&#xff0c;需要给客户端提供更加友好的创建对象的方式&#xff0c;尤其是那种我们定义了类&#xff0c;但…

leetcode:644. 子数组最大平均数 II【浮点数二分 + 子数组最大平均值技巧】

目录题目截图题目分析ac code总结题目截图 题目分析 枚举铁超时&#xff0c; 10 ** -5考虑二分平均值需要同时考虑总和和长度能否只考虑一个考虑每个数num’ num - avg这样可以忽略长度猜一个guess_avg是否可能达到num’ -> num - avg_guess区间sum(num’) > 0说明其真…

Linux 开机运行sh 脚本 三种方法

一、修改开机启动文件​​​​​​​ /etc/rc.local&#xff08;或者/etc/rc.d/rc.local&#xff09; 1、编辑rc.local文件&#xff08;命令后面让得加&号&#xff0c;表示后台运行&#xff09; 2、最后修改rc.local文件的执行权限&#xff1a; chmod x /etc/rc.local二…

实践历练的力量

要让你的屁股和椅子建立起深刻的友谊来&#xff0c;要坚持下来。 掌握知识离不开实践和做&#xff0c;只有经历了这样的过程才能将知识转换为自己的。也才能真正明白在什么环境下需要什么样的知识。 解决问题。 真正的学习一定包括实践&#xff0c;而实践是更重要的学习。学…

【sfu】接收侧拼装H264 帧后的回调流程

sfu 基于webrtc协议栈,【sfu】rtc 入口 预先分配了资源,并创建了adpter模块和call模块。【webrtc】rtp包组帧 :涉及到收到rtp包到组帧、传递给Frame处理直到解码器的流程。帧就是从解码器导出的。我们只需要注册1个外部解码器就可以拿到编码后的H264 帧,给到其他流程处理。接…

【JVS低代码开发平台】支持纯手工配置的数据加工、处理、展现的数据仓库

数据智仓英文名称为Smart Data Warehouse&#xff0c;可简写为SDW。数据智仓是JVS整体企业数字化解决方案的核心能力&#xff0c;与JVS的低代码开发套件平级&#xff0c;如下图所示&#xff1a; 数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供基于数据的…

SOLIDWORKS 2023新功能揭秘!升级版轻松找到材料明细表修改

SOLIDWORKS 2023版本已经与大家见面&#xff0c;今天众联亿诚继续和大家分享SOLIDWORKS 2023 工程图的亮点新功能之一&#xff1a;材料明细表的覆盖。 材料明细表的覆盖 SOLIDWORKS工程图是我们常用的功能之一。当采用断开链接模式修改材料明细表的内容时&#xff0c;修改的内容…

【强化学习论文合集】AAAI-2022 强化学习论文 | 2022年合集(二)

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

【web前端期末大作业】HTML+CSS宠物狗静态网页设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…