首页 > 其他分享 >远程代码加载方案

远程代码加载方案

时间:2024-10-15 10:59:12浏览次数:7  
标签:request 代码 bytes var using 远程 加载

原理

通过http获取到远程代码,并下载加来替换掉本次使用的代码

编辑器启动本地服务器(代码示例)

#if !NO_HYBRIDCLR
using HybridCLR;
#endif 
using System;
using System.Reflection;
using UnityEngine;

/// <summary>
/// 启动流程-加载并应用dll
/// </summary>
public class LoadDllLaunchTask : LaunchTask
{
    /// <inheritdoc/>
    public override void Run()
    {
        TestLogManager.Instance.StartRecord(TestLogManager.TestLogKey.Launch_LoadDll);
        LoadDllHotFix();
    }

    /// <inheritdoc/>
    protected override void OnFinished()
    {

    }

    /// <summary>
    /// 加载dll热修内容
    /// </summary>
    private void LoadDllHotFix()
    {
        byte[] hotBytes = null;
        LoadDlls((name, bytes) => {
            if (name.ToLower() == "hotfixassembly")
            {
                hotBytes = bytes;
            }
            else
            {
                RuntimeApi.LoadMetadataForAOTAssembly(bytes, HomologousImageMode.SuperSet);
                Debug.Log($"加载AOT成功 {name}");
            }
            SetComplete();
        }, () => {
            if (hotBytes == null)
            {
                Debug.LogError("加载热更代码失败");
                return;
            }

            Assembly.Load(hotBytes);
            Debug.Log($"加载热更代码成功");

            TestLogManager.Instance.EndRecord(TestLogManager.TestLogKey.Launch_LoadDll);
            SetComplete();
        });
    }

    private void LoadDlls(Action<string, byte[]> dllLoaded, Action allCompleted)
    {
        string RemoteDllURL = Launch.Instance.RemoteDllURL;
        if (string.IsNullOrEmpty(RemoteDllURL))
        {
            ResourceLoader.LoadAllAsset("Dll", (objects, str) =>
            {
                if (objects == null)
                {
                    Debug.LogError("加载热更代码失败");
                    return;
                }

                for (int i = 0; i < objects.Length; i++)
                {
                    TextAsset textAsset = objects[i] as TextAsset;
                    dllLoaded(textAsset.name, textAsset.bytes);
                }

                allCompleted();
            });
        }
        else
        {
            RemoteDllLoader loader = new RemoteDllLoader();
            loader.Initialize(RemoteDllURL, dict =>
            {
                foreach (var pair in dict)
                {
                    dllLoaded(pair.Key, pair.Value);
                }

                allCompleted();
            });
        }
    }
}


使用远程代码资源(代码示例)

using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using UnityEngine;
using UnityEngine.Networking;

/// <summary>
///  远程加载本机Dll
/// </summary>
public class RemoteDllLoader
{
    #region Properties
    private string serverURL;
    private ZipArchive zipArchive;
    #endregion

    #region Public Methods
    /// <summary>
    ///     初始化
    /// </summary>
    /// <param name="serverURL">服务器地址</param>
    /// <param name="completed">完成回调</param>
    public void Initialize(string serverURL, Action<Dictionary<string, byte[]>> completed)
    {
        serverURL = serverURL.TrimEnd('/');
        this.serverURL = serverURL;
        var request = UnityWebRequest.Get(this.serverURL + "?code_zip=true");
        var asyncOp = request.SendWebRequest();
        asyncOp.completed += asyncOperation =>
        {
#if UNITY_2020_1_OR_NEWER
            var isNetError = !(request.result == UnityWebRequest.Result.InProgress ||
                               request.result == UnityWebRequest.Result.Success);
#else
            bool isNetError = request.isHttpError || request.isNetworkError;
#endif

            if (isNetError)
            {
                Debug.LogErrorFormat("请求代码资源失败:{0}\n{1}", request.url, request.error);
            }
            else
            {
                var data = request.downloadHandler.data;
                Debug.Log("请求代码资源成功");
                zipArchive = new ZipArchive(new MemoryStream(data), ZipArchiveMode.Read);
            }

            Dictionary<string, byte[]> codeMap = new Dictionary<string, byte[]>();
            for (var i = 0; i < zipArchive.Entries.Count; i++)
            {
                var entry = zipArchive.Entries[i];
                using (var stream = entry.Open())
                {
                    byte[] bytes = new byte[entry.Length];
                    stream.Read(bytes, 0, bytes.Length);
                    codeMap.Add(entry.Name, bytes);
                }
            }

            completed(codeMap);
        };
    }

    #endregion

    #region Internal Methods
    #endregion
}

adb连接

adb reverse tcp:1234 tcp:1234

标签:request,代码,bytes,var,using,远程,加载
From: https://www.cnblogs.com/comradexiao/p/18467015

相关文章

  • ECharts关系图-悲惨世界人物关系图(环形布局),附视频讲解与代码下载
    引言: 关系图(或称网络图、关系网络图)在数据可视化中扮演着至关重要的角色。它们通过节点(代表实体,如人、物体、概念等)和边(代表实体之间的关系或连接)的形式,直观地展示了数据集中各元素之间的复杂关联。本文将详细介绍如何使用ECharts库实现一个关系图,包括图表效果预览、视频讲解......
  • 用python、JavaScript、JAVA等多种语言的实例代码演示教你如何免费获取股票数据(实时数
    ​近一两年来,股票量化分析逐渐受到广泛关注。而作为这一领域的初学者,首先需要面对的挑战就是如何获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的核心任务是从这些数据......
  • 修改网站源代码的步骤
    修改网站源代码通常涉及以下几个步骤:备份现有代码:在进行任何更改之前,确保对当前的源代码进行完整备份。这有助于在出现问题时恢复到修改前的状态。获取源代码:通过FTP/SFTP、Git或其他版本控制系统将网站源代码下载到本地计算机上。分析需求:明确你需要做出哪些具......
  • 如何保存修改过的网页源代码
    要保存修改过的网页源代码,可以按照以下步骤操作:选择保存方式:如果只是临时修改查看,可以直接在浏览器开发者工具中进行,但这些修改不会被持久化。若要永久保存修改后的源代码,则需要将其另存为本地文件。获取源代码:使用浏览器的“查看页面源代码”功能(通常可以通过右键菜......
  • Python编程、机器学习与深度学习技术——建议收藏!附代码!
    原文链接:Python编程、机器学习与深度学习技术——建议收藏!附代码!https://mp.weixin.qq.com/s?__biz=MzUzNTczMDMxMg==&mid=2247622086&idx=4&sn=a2e310ea4b6e8a40de2fc683215e839b&chksm=fa825c21cdf5d537c8ef826df48d5e4791c48eda7bc53733a14dfaa67613dc76842db5da7104&token=......
  • 几种常用大模型工具生成基于hi3861的OpenHarmony代码的尝试
    引言最近在上智能物联网的课程,讲授基于hi3861的OpenHarmony编程,所以尝试一下使用大模型工具生成相关的代码,看看效果如何。提问的方式比较简单粗暴:在OpenHarmony的hi3861平台上,如何编程访问https的网站?KimiKimi是我用得最多的平台,它经过文献搜索之后给出如下答案。 ......
  • DeepSORT算法实现车辆和行人跟踪计数和是否道路违规检测(代码+教程)
    DeepSORT算法实现车辆和行人跟踪计数和是否道路违规检测(代码+教程)特征提取此处面对的场景是是交通摄像头下的马路场景,数据格式为视频流或者视频,所以我们要提取视频的第一帧作为背景来进行车道线的标定,运行extra.py文件即可提取第一帧背景图片。✍......
  • VsCode 如何自定义代码片段(Code Snippet)
    前言在现代前端开发中,提高工作效率是每个开发者的追求。VisualStudioCode(Vscode)作为一款强大的代码编辑器,提供了许多让开发者高效编程的功能,其中自定义代码片段(CodeSnippet)便是一个重要的工具。通过自定义代码片段,你可以快速插入常用的代码模板,大幅减少重复工作量。本......
  • 有缺陷的 Java 代码:Java 开发人员最常犯的 10 大错误
    Java是一种复杂的编程语言,很长一段时间以来一直主导着许多生态系统。可移植性、自动垃圾回收及其温和的学习曲线是使其成为软件开发的绝佳选择的一些因素。但是,与任何其他编程语言一样,它仍然容易受到开发人员错误的影响。本文探讨了Java开发人员最常犯的10大错误以......
  • 【linux内核】内核编译与模块加载
    原创星火可以燎燃星火技术在前面的课程中,我们学习了如何在Linux系统中使用加密技术来保护数据的安全。今天,我们将探讨如何在Linux系统中编译内核以及加载内核模块,这对于优化系统性能和适应特定硬件需求非常重要。一、内核的重要性Linux内核是操作系统的核心部分,负责管理系......