ILRuntime学习——从零开始

2023-11-07

1, ILRuntime项目为基于C#的平台(例如Unity)提供了一个纯C#实现,快速,方便且可靠的IL运行时,使得能够在不支持JIT的硬件环境(如iOS)能够实现代码的热更新

2,无缝访问C#工程的现成代码,无需额外抽象脚本API

推荐的方式是直接使用ILRuntime的源代码,,这样ILRuntime可以根据你的发布设置自动进行优化。

3,将下列源码目录复制Unity工程的Assets目录:

  • Mono.Cecil.20
  • Mono.Cecil.Pdb
  • ILRuntime

删除这些目录里面的binobjProperties子目录,以及.csproj文件

ILRuntime使用了unsafe代码来优化执行效率,所以你需要在Unity中开启unsafe模式:

    如果你使用的是Unity5.4及以前的版本,并且使用的编译设置是.Net 2.0而不是.Net 2.0 Subset的话,
   你需要将上述说明中的smcs.rsp文件名改成gmcs.rsp。如果你使用的是Unity5.5以上的版本,你需要将上述说明中的smcs.rsp    文件名改成mcs.rsp

Unity3D的示例工程

你可以在GitHub - Ourpalm/ILRuntimeU3D: Unity3D demo project for ILRuntime下载到最新的Unity实例工程,该示例是在Unity5.5下制作的。

里面有2个工程,其中ILRuntimeDemo是Unity的主工程。实例都在这个工程当中的各个示例场景中,这个工程是在Unity5.5下完成的

HotFix_Project是热更DLL工程,用VS2015之类的C# IDE打开和进行编译,在编译前请确保至少打开过一次Unity的主工程,如果编译依然说找不到UnityEngine等dll,请手动重新指认一下

从Visual Studio开始

在VisualStudio的C#项目中使用ILRuntime,需要引用编译好的ILRuntime.dllMono.Cecil.20.dll以及Mono.Cecil.Pdb

开始使用

使用ILRuntime非常简单,只需要以下这些代码即可运行一个完整的例子:

ILRuntime.Runtime.Enviorment.AppDomain appdomain;
void Start()
{
    StartCoroutine(LoadILRuntime());
}

IEnumerator LoadILRuntime()
{
    appdomain = new ILRuntime.Runtime.Enviorment.AppDomain();
#if UNITY_ANDROID
    WWW www = new WWW(Application.streamingAssetsPath + "/Hotfix.dll");
#else
    WWW www = new WWW("file:///" + Application.streamingAssetsPath + "/Hotfix.dll");
#endif
    while (!www.isDone)
        yield return null;
    if (!string.IsNullOrEmpty(www.error))
        D.error(www.error);
    byte[] dll = www.bytes;
    www.Dispose();
#if UNITY_ANDROID
    www = new WWW(Application.streamingAssetsPath + "/Hotfix.pdb");
#else
    www = new WWW("file:///" + Application.streamingAssetsPath + "/Hotfix.pdb");
#endif
    while (!www.isDone)
        yield return null;
    if (!string.IsNullOrEmpty(www.error))
        D.error(www.error);
    byte[] pdb = www.bytes;
    using (System.IO.MemoryStream fs = new MemoryStream(dll))
    {
        using (System.IO.MemoryStream p = new MemoryStream(pdb))
        {
            appdomain.LoadAssembly(fs, p, new Mono.Cecil.Pdb.PdbReaderProvider());
        }
    }
    OnILRuntimeInitialized();
}

void OnILRuntimeInitialized()
{
    appdomain.Invoke("Hotfix.Game", "Initialize", null, null);
}

这个例子为了演示方便,直接从StreamingAssets目录里读取了脚本DLL文件以及调试符号PDB文件, 实际发布的时候,如果要热更,肯定是将DLL和PDB文件打包到Assetbundle中进行动态加载的,

调试插件

 

支持Visual Studio2015和Visual Studio 2017的调试插件

Releases · Ourpalm/ILRuntime · GitHub

使用方法如下:

  • 安装ILRuntime调试插件,并重新启动VS2015或VS2017
  • 运行Unity工程,并保证执行过appdomain.DebugService.StartDebugService(56000);来启动调试服务器
  • 用VisualStudio打开热更DLL项目
  • 点击菜单中的Debug->Attach to ILRuntime按钮
  • 在弹出来的窗口中填入被调试的主机的IP地址以及调试服务器的端口
  • 点击Attach按钮后,即可像UnityVS一样下断点调试

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ILRuntime学习——从零开始 的相关文章

  • stable diffusion webui中的sampler

    Stable Diffusion 采样器篇 知乎采样器 Stable Diffusion的webUI中 提供了大量的采样器供我们选择 例如Eular a Heum DDIM等 不同的采样器之间究竟有什么区别 在操作时又该如何进行选择 本文将
  • Linux基础——Framebuffer(应用层驱动lcd)

    Framebuffer 简介 Framebuffer的API函数 1 open函数 2 ioctl 函数 3 mmap 函数 编写函数操作 开发环境 韦东山Linux开发板 IMX6ULL PRO 开发板 简介 Framebuffer 是用
  • 正则表达式简要笔记

    昨天在给领导演示的时候发现需要替换文件 结果发现同事那机器上只有UltraEdit我还不太会用 淦 没找到正则替换的入口 结果不了了之 后来回来在自己电脑上试了试 发现自己想的正则也不太对 索性现在总结一下最基础 通用 重要的符号 剩下的就
  • Fiddler抓包基础使用(二)

    续上一篇文章 软件测试人员电脑需要安装的基础工具 可可爱爱的程序员的博客 CSDN博客 软件测试资料领取方式 1 Issue 可可爱爱的程序员 软件测试资料合集 GIT CODE 响应HTTP状态过滤规则 Hide success 202
  • Redis 经典面试题合集详解

    作者主页 欢迎来到我的技术博客 个人介绍 大家好 本人热衷于Java后端开发 欢迎来交流学习哦 如果文章对您有帮助 记得关注 点赞 收藏 评论 您的支持将是我创作的动力 让我们一起加油进步吧 文章目录 1 谈谈你对 Redis 的了解 2

随机推荐

  • Java基础——Object类和Objects工具类

    目录 1 Object类 1 1 常用方法 1 2 Object类中方法常见的问题 1 为什么重写equals时必须重写hashCode方法 2 wait和notify为什么定义在Object类当中 wait和notify或notifyAl
  • Brocade_porterrshowt(博科交换机端口状态分析)

    Brocade Switches 如何确定是SFP 或是光纤线导致 Loss of Link 丢失链接 问题 问题描述 一个有问题的SFP或光纤线会造成丢失与主机 存储或另一台交换机的连接问题 在交换机的error log中可能有如下显示
  • RPM包基本命令

    RPM包基本命令 原文链接 https www cnblogs com zqwang0929 p 3352237 htmls 例子 rpm ivh example rpm 安装 example rpm 包并在安装过程中显示正在安装的文件信息
  • python二级菜单_python二级登陆菜单

    1 三级菜单 注册 登陆 注销 2 进入每一个一级菜单 都会有下一级的菜单 user item dict try while True print Welcome sir input choice int input Please ente
  • 利用cordova打包apk

    声明 电脑未安装过android studio 不会使用android studio 在此基础上将vue cli3项目打包成apk 百度了一下如何将vue项目打包成apk 百度说用HBuilderX 10秒就可以完成 然后我就按照百度的方法
  • Bert CNN信息抽取

    Github参考代码 https github com Wangpeiyi9979 IE Bert CNN 数据集来源于百度2019语言与智能技术竞赛 在上述链接中提供下载方式 感谢作者提供的代码 1 信息抽取任务 给定schema约束集合
  • webpack 热更新原理解析

    一 什么是 HMR HMR 全称 Hot Module Replacement 中文语境通常翻译为模块热更新 它能够在保持页面状态的情况下动态替换资源模块 提供丝滑顺畅的 Web 页面开发体验 1 1 HMR 之前 在 HMR 之前 应用的
  • JavaScript HTML DOM - 改变CSS

    要使用JavaScript改变HTML元素的CSS样式 可以通过访问元素的style属性来实现 下面是一些常见的方法 1 直接设置样式属性 javascript var element document getElementById myE
  • VISIO,不规则封闭图形填充方法

    VISIO 不规则封闭图形填充方法 2013 01 17 11 42 08 分类 Windows平台 VISIO 不规则封闭图形颜色填充方法 使用VISIO 2010 时 对规则的封闭图形填充非常简单 但是要想画一个不规则的图形 并且填充颜
  • Whois原理

    RFC812 定义了一个非常简单的Internet信息查询协议 WHOIS协议 其基本内容是 先向服务器的TCP端口43建立一个连接 发送查询关 键字并加上回车换行 然后接收服务器的查询结果 世界上各级Internet管理机构秉承公开 公正
  • python字典(dictionary)

    字典 字典组成 字典由键 key 和值 value 组成 字典元素由 括在一起 dic key1 value1 key2 value2 key是字典中的键 value是该键对应的值 key value称之为键值对 字典的创建 直接按照定义创
  • 高校校园网络设计与实现

    这是我的第一个博客 好好学习 天天向上 一 设计目的 通过大型园区网的设计与方案设计 实习完成后学生将可以独立完成网络拓扑设计 网络设备调试 安装以及优化 通过项目的完成学生可以达到以下目标 1 掌握工程项目的流程设计及文档编写 2 掌握网
  • 无法正常访问服务器

    网络原因 本地网络 解决办法 检查本地网络是否正常 访问外网是否流畅 机房网络 通过路由追踪查看是否中间有 节点不通 确定是线路出现丢包 远程连接 检查远程连接是否启用以及远程计算机上的连接数是否超出 未启用和超出连接数都会出现服务器无法连
  • 如何更改conda环境位置

    参考Anaconda 安装及修改环境默认位置 把环境从C盘移动到D盘 首先 D conda envs是我的目标文件夹路径 在conda中输入命令 torch 04seaFusion D pythonProjects paper06 yolo
  • vue3安装vue3-json-viewer

    vue3安装vue3 json viewer 官方文档 效果图 安装 npm i vue3 json viewer 2 2 2 提醒 2 1 0以下版本需要依赖clipboard 2 1 0以上版本不需要依赖clipboard 使用
  • Python中元组的函数

    定义一个带字段名的元组 from collections import namedtuple User namedtuple User name sex age user User lisi male 12 print user User
  • CentOS7查找目录或文件

    which命令 查找用户所执行的命令文件存放的目录 which命令用于查找Linux命令程序并显示所在的具体位置 其搜索范围主要由用户的环境变量PATH决定 可以执行 echo PATH 命令查看 这个范围也是Linux系统在执行命令或程序
  • 复旦nlp实验室 nlp-beginner 任务四:基于LSTM+CRF的序列标注

    经历了期末摸鱼之后它终于来了 认认真真的学了CRF 先上个Demo版本 model import torch import torch nn as nn from torch nn utils rnn import pack padded
  • 面试中关于Redis的问题看这篇就够了

    昨天写了一篇自己搭建redis集群并在自己项目中使用的文章 今天早上看别人写的面经发现redis在面试中还是比较常问的 笔主主Java方向 所以查阅官方文档以及他人造好的轮子 总结了一些redis面试和学习中你必须掌握的问题 事无巨细 不可
  • ILRuntime学习——从零开始

    1 ILRuntime项目为基于C 的平台 例如Unity 提供了一个纯C 实现 快速 方便且可靠的IL运行时 使得能够在不支持JIT的硬件环境 如iOS 能够实现代码的热更新 2 无缝访问C 工程的现成代码 无需额外抽象脚本API 推荐的