添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

Intermediate Language,中间语言,面向对象的汇编语言

通过C#编译器mcs,将C#编译为IL(中间语言,byte code)
通过Mono运行时中的编译器将IL编译成对应平台的原生码

IL三种转译方式

即时编译(Just in time,JIT):程序运行过程中,将CIL的byte code转译为目标平台的原生码。
提前编译(Ahead of time,AOT):程序运行之前,将.exe或.dll文件中的CIL的byte code部分转译为目标平台的原生码并且存储,程序运行中仍有部分CIL的byte code需要JIT编译。
完全静态编译(Full ahead of time,Full-AOT):程序运行前,将所有源码编译成目标平台的原生码。

Unity跨平台的原理

Mono运行时编译器支持将IL代码转为对应平台原生码
IL可以在任何支持CLI,通用语言环境结构)中运行,IL的运行是依托于Mono运行时。

IOS不支持jit编译原因

机器码被禁止映射到内存,即封存了内存的可执行权限,变相的封锁了jit编译方式

c#代码生成的IL编码,由虚拟机的JIT编译执行,其中对象无须手动释放,由GC管理

非托管代码

C++/C#中以不安全类型写的代码,虚拟机无法跟踪

托管代码剥离

托管代码剥离过程将分析项目中的程序集,以查找和删除未实际使用的代码。分析过程使用一组规则来确定要保留的代码和要丢弃的代码。这些规则将在构建大小(包含太多代码)与风险(删除太多代码)之间进行权衡。Managed Stripping Level 设置可用于控制删除代码的激进程度。

Mono构建

  1. 构建应用非常快
  2. 由于Mono的JIT(Just In Time compilation ) 机制, 所以支持更多托管类库
  3. 支持运行时代码执行
  4. 必须将代码发布成托管程序集(.dll 文件 , 由mono或者.net 生成 )
  5. Mono VM在各个平台移植异常麻烦,有几个平台就得移植几个VM(WebGL和UWP这两个平台只支持 IL2CPP)
  6. Mono版本授权受限,C#很多新特性无法使用
  7. iOS仍然支持Mono , 但是不再允许Mono(32位)应用提交到Apple Store
    在这里插入图片描述

IL2CPP

  1. 相比Mono, 代码生成有很大的提高
  2. 可以调试生成的C ++代码
  3. 可以启用引擎代码剥离(Engine code stripping)来减少代码的大小
  4. 程序的运行效率比Mono高,运行速度快
  5. 多平台移植非常方便
  6. 相比Mono构建应用慢
  7. 只支持AOT(Ahead of Time)编译
    在这里插入图片描述

IL2CPP概括:

  1. Mono将c#翻译成IL
  2. IL2CPP得到IL转变为C++代码
  3. 再由各个平台C++编译器编译成可执行机器码
Mono跨平台ILIntermediate Language,中间语言,面向对象的汇编语言工作流通过C#编译器mcs,将C#编译为IL(中间语言,byte code)通过Mono运行时中的编译器将IL编译成对应平台的原生码IL三种转译方式即时编译(Just in time,JIT):程序运行过程中,将CIL的byte code转译为目标平台的原生码。提前编译(Ahead of time,AOT):程序运行之前,将.exe或.dll文件中的CIL的byte code部分转译为目标平台的原生码 场景资源管理器:用于遍历场景的变换层次结构的简单菜单。 GameObject Inspector :各种有用的工具,用于查看和操纵GameObject,类似于您在编辑器中可以执行的操作。 反射检查器:检查属性和字段。 也可以设置原始值并评估原始方法。 搜索:使用各种过滤器搜索 Unity Engine.Objects,或将帮助器用于静态实例和类。 C#控制台:具有一些基本帮助程序的交互式控
Il2 Cpp AssemblyUnho​​llower 从的输出生成 Managed-> IL2 CPP 代理程序集的工具。 这允许从受管域使用 IL2 CPP 域和其中的对象。 这包括泛型类型和方法、数组和新对象创建。 有些东西可能会被严重破坏。 构建或获取版本 使用获取虚拟程序集 运行AssemblyUnhollower --input=<path> --output=<output> --mscorlib=<path> 生成的程序集可以与您最喜欢的加载程序一起使用,该加载程序在 IL2 CPP 游戏进程中提供 Mono 域,例如 。 这对于 Unity 2018.4.x 游戏似乎运行良好,但需要更广泛的测试。 根据 .NET Core/.NET Framewor
调试模式/控制台用于调试MelonLoader内部。 所有插件都放置在游戏的“安装”文件夹内已创建的“插件”文件夹中。 所有Mod都放置在游戏的Install文件夹内创建的Mods文件夹中。 所有日志均在游戏的“安装”文件夹内创建的日志文件夹中进行。 为了正确使用dnSpy的调试器,请使用“调试模式/控制台”启动选项运行游戏。 自动安装: 确保要安装的游戏已关闭且未运行。 运行MelonLoader.Installer.exe。 单击选择按钮。 在游戏的安装文件夹中选择并打开游戏的EXE。 用于 Unity3D 游戏的.NET Mono 注入器。 转到。 Microsoft Developer Network for Reference Source,并提供本机C ++ Windows功能/结构/枚举文档。 Unity Technologies for Unity 游戏引擎(没有它们,就不会有太多的乐趣)。 罗伯特·吉塞克(Robert Giesecke)拥有出色的编译时库集(UnmanagedExports项目),并使之可以长时间保持最新(13天前更新)。 JämesMénétrey(ZenLulz)和其他在内存编辑库中做出过贡献的人(MemorySharp和Fasm.NET项目)。 JetBrains的高质量Microsoft Visual Studio生产力扩展(ReSharper产品)。 Unity Injector团队,用于开
一、 JIT 、 AOT 是什么 JIT ,即Just-in-time,动态(即时)编译,边运行边编译; AOT ,Ahead Of Time,指运行前编译,是两种程序的编译方式 JIT 优点: ①可以根据当前硬件情况实时编译生成最优机器指令(ps. AOT 也可以做到,在用户使用是使用字节码根据机器情况在做一次编译) ②可以根据当前程序的运行情况生成最优的机器指令序列 ③当程序需要支持动态链接时,只能使用 JIT ④可以根据进程中内存的实际情况调整 代码 ,使内存能够更充分的利用 JIT 缺点: ①编译需要占用运行时资源
部件ID对应maskrgb的色块表 建筑部件ID去策划表中拿,找到对应的是门部件之类的,再出mask图中有门的抠图,抠图的颜色从上表中ID对应rgb取。调整完后编辑器的色相参数最好归0 shader流程 1.把原rgb色彩空间转hsv色彩空间 2.取不同rgbmask确定部位编号,然后不同部位取不同色相值
http://msdn.microsoft.com/library/z1zx9t92 http://msdn.microsoft.com/en-us/library/ht8ecch6(v=vs.90).aspx http://www. mono -project.com/ AOT 转载于:https://www.cnblogs.com/lilei9110/p/3431688.html...
使用枚举类型的Array的Contains方法,在IOS真机上报错 AOT , 经查,Contains方法属于System.Linq,但诸如 string[]、int[]等使用均不会有问题,枚举类型直接就真机调试挂了。。估计是使用了动态 代码 。 不使用Contains,直接使用一个for循环做判断。
1.带有增高垫IL的 c# c# 语言作为一种高级语言,是不能直接在我们的CPU上来直接运行的。 需要编译成IL语言(Intermediate Language)即中间层语言(就是这么高冷)。然后由我们的编译器编译成 底层的语言来到cpu运行。IL是将.NET 代码 转化为机器语言的一个中间语言,因此又把IL语言称之为伪汇编语言。 写 代码 如果要保护 代码 ,首先做窗体程序我就不怎么考虑 c# ,但是使用其它编程语言写门槛稍微高一些, 有时候为了写一个免费软件但是又不被别人拿去改成自己的,说真的就不想写了, c# 和java剽窃 代码 那是从源码级别进行剽窃的,这大大打击了写免费软件和收费软件的动力 现在,有了这个技术 ,再也不怕了 首先需要说明一点的是,winform(.net framework)和.net 的w... 所有StreamingAssets下的文件会被复制到包体。 所有Resource下的资源会被无条件打包。 所有加入到构建中的场景以及他们所引用的所有资源都会进入包体,如场景使用了模型,模型使用了材质,材质使用了shader和贴图,这些资源都被引用了。 其他一些闪...
unity 报错Applications/ Unity / Unity .app/Contents/ il2 cpp /build/deploy/ il2 cpp --convert-to- cpp --assembly=Library/Bee/artifacts/Android/ManagedStripped/System.Xml.Linq.dll --assembly=Library/Bee/artifacts/Android/ManagedStripped/ Unity Engine. Unity AnalyticsModule.dll
这个报错可能是因为 Unity 在尝试使用 il2 cpp 将 Mono 脚本编译成C++ 代码 时出错了。以下是一些可能的解决方案: 1. 检查您的 Unity 项目的Build Settings中是否已经正确配置了Android平台的信息。如果没有,请重新配置。 2. 确认您的 Unity 项目中使用的 Mono 版本与 il2 cpp 所需的 Mono 版本相同。如果版本不同,可能需要更新 Unity 或使用正确的 Mono 版本。 3. 检查您的 Unity 项目中是否存在任何编译错误或警告。如果有,请尝试修复它们并重新编译。 4. 尝试使用 Unity 的 Mono 编译器而不是 il2 cpp 。在Build Settings中将脚本后端设置为 Mono ,然后重新编译您的项目。 如果以上方法无法解决问题,请尝试重新安装 Unity 或联系 Unity 官方支持获取更多帮助。