精华内容
下载资源
问答
  • <p>I did a build with Unity 2018.2 with IL2CPP (because it says that .Net is deprecated) <p>I don't have the "device" button in the "Start" button in Visual Studio 2017 <p><img alt...
  • Unity il2cpp逆向工程师 产品特点 完整的DLL还原(代码除外),可用于提取MonoBehaviour和MonoScript 支持ELF,ELF64,Mach-O,PE,NSO和WASM格式 支持Unity 5.3-2020 支持生成IDA和Ghidra脚本,以帮助IDA和Ghidra...
  • 那些想玩Unity il2cpp游戏的人的帮助库。 在Windows上进行了测试,但也可以轻松在Android / iOS上使用。 我认为只有Process.findModuleByName("GameAssembly.dll")!; il2cpp.ts需要更改。 示例类 import { Il2...
  • IL2CPP MONO unity 编译器

    2020-07-31 11:15:38
    很通俗易懂的介绍了啥是IL,MONO的出生 IL2cpp的出生,太棒了,原文如下 Unity3D 想必大家都不陌生,独立游戏制作者们很多人都在用它,甚至一些大公司也用在很商业的游戏制作上。Unity3D最大的一个特点是一次制作...

    转自:https://zhuanlan.zhihu.com/p/19972689

    很通俗易懂的介绍了啥是IL,MONO的出生 IL2cpp的出生,太棒了,原文如下

     

    Unity3D 想必大家都不陌生,独立游戏制作者们很多人都在用它,甚至一些大公司也用在很商业的游戏制作上。Unity3D最大的一个特点是一次制作,多平台部署,而 这一核心功能是靠Mono实现的。可以说Mono是Unity3D核心的核心,是Unity3D跨平台的根本。但是在2014年年中的时 候,Unity3D官方博客上却发了一篇“The future of scripting in unity”的文章,引出了IL2CPP的概念,感觉有取代Mono之势。那什么是IL2CPP,它能为Unity3D和作为使用Unity3D的我们带来哪些好处和改变?这就是本文尝试说明的。

    C#,.Net Framework
    我 们先说说IL2CPP试图取代的Mono。在说Mono之前,不得不提C#语言和背后的.Net Framework。C#是微软推出的一种基于.NET框架的、面向对象的高级编程语言。C#的发音为“see sharp”,模仿音乐上的音名“C♯”(C调升),是C语言的升级的意思。其正确写法应和音名一样为“C♯”。C#由C语言和C++派生而来,继承了其 强大的性能,同时又以.NET框架类库作为基础,拥有类似Visual Basic的快速开发能力。C#由安德斯·海尔斯伯格主持开发,微软在2000年发布了这种语言。说到安德斯·海尔斯伯格这里要多说一句,当年和VC(注 意,是VC,那个时候还没有Visual Studio)齐名还有另外一家公司的IDE也非常流行,那就是Borland公司的Delphi,也是由安德斯·海尔斯伯格主导开发的。

    他 后来被微软挖走,创建了J++,一门类似Java的语言(好吧,以我肤浅的知识认为,那基本就是照着Java做的)。后来由于和Sun公司授权的原因,微 软在2001年停止了J++的开发而推出了C# 1.0。说来要感谢和Sun的这场官司,否则微软也不会有C#,J++也可能一直会跟随Java的脚步。相反C#经过不断的进化,从1.0开始到4.0和 最新的5.0,C#已经远远甩开Java几条街了(还是以我个人的使用Java和C#感觉而言,关于两门语言的比较,无论是效率上,夸平台上,还是语言易 用性上,社区活跃度上,网上的争论随处可见,每个人都有自己的看法,这也不是本文的重点)。

    Mono,Mono VM
    C#虽好,但是只能在Windows上运行,微软那时候也没有将其开源,所以总是会有人说不能跨平台,光就这点,C#和Java就不能比呀。

    微 软公司已经向ECMA申请将C#作为一种标准。在2001年12月,ECMA发布了ECMA-334 C#语言规范。C#在2003年成为一个ISO标准(ISO/IEC 23270)。这意味着只要你遵守CLI(Common Language Infrastructure),第三方可以将任何一种语言实现到.Net平台之上。Mono就是在这种环境下诞生的。

    Mono是一个由 Xamarin公司(先前是Novell,最早为Ximian)所主持的自由开放源代码项目。该项目的目标是创建一系列符合ECMA标准(Ecma- 334和Ecma-335)的.NET工具,包括C#编译器和通用语言架构。与微软的.NET Framework(共通语言运行平台)不同,Mono项目不仅可以运行于Windows系统上,还可以运行于 Linux,FreeBSD,Unix,OS X和Solaris,甚至一些游戏平台,例如:Playstation 3,Wii或XBox 360之上。Mono使得C#这门语言有了很好的跨平台能力。相对于微软的.Net Framework运行时库Mono使用自己的Mono VM作为运行时库。 加上C#本身快速友好的开发能力,最终使得Unity团队在创建之初就决定将Mono,C#作为其核心。(嗯,这是我猜的)

    有 人也许会说,Unity还支持JavaScript和Boo呢,不光光只有C#一门语言。首先我要纠正的是,在Unity中的JavaScript严格意 义上说并不是W3C规范中的JavaScript,它正确的名字叫做Unity Script,其实是从Boo演变过来的(这样大家就能理解为啥在3门语言中,Boo用的人最少,但是却还一直存在的原因了吧)。我认为是Unity开始 为了让更多的人能够快速的上手,特别是考虑到很多脚本程序员对JavaScript已经很熟悉了,为了照顾这部分人,发明了Unity Script,它的语法和W3C的JavaScript几乎一致,使得大家可以直接用其进行开发,降低门槛。但是Unity Script在运行上却和JavaScript有着本质的不同。这个我会在下一节IL中进行详细的描述。从三门语言在Unity中的使用情况而言:Boo 几乎就没人用了,Unity Script和C#两者中无论是演示代码还是Unity Asset Store中的第三方代码,C#已经有85%-90%的比例(个人粗略估计,没有做详细统计)。可见C#在Unity中深受我等游戏码农的爱戴。

    IL
    啰 嗦完了C#,.Net Framework和Mono,引出了我们很重要的一个概念”IL“。IL的全称是 Intermediate Language,很多时候还会看到CIL(Common Intermediate Language,特指在.Net平台下的IL标准)。在Unity博客和本文中,IL和CIL表示的是同一个东西:翻译过来就是中间语言。它是一种属于 通用语言架构和.NET框架的低阶(lowest-level)的人类可读的编程语言。目标为.NET框架的语言被编译成CIL,然后汇编成字节码。 CIL类似一个面向对象的汇编语言,并且它是完全基于堆栈的,它运行在虚拟机上(.Net Framework, Mono VM)的语言。
    具体过程是:C#或者VB这样遵循CLI规范的高级语言,被先被各自的编译器编译成中间语言:IL(CIL),等到需要真正执行的时候,这些IL会被加载到运行时库,也就是VM中,由VM动态的编译成汇编代码(JIT)然后在执行。

     

    正是由于引入了VM,才使得很多动态代码特性得以实现。通过VM我们甚至可以由代码在运行时生成新代码并执行。这个是静态编译语言所无法做到的。回到上一 节我说的Boo和Unity Script,有了IL和VM的概念我们就不难发现,这两者并没有对应的VM虚拟机,Unity中VM只有一个:Mono VM,也就是说Boo和Unity Script是被各自的编译器编译成遵循CLI规范的IL,然后再由Mono VM解释执行的。这也是Unity Script和JavaScript的根本区别。JavaScript是最终在浏览器的JS解析器中运行的(例如大名鼎鼎的Google Chrome V8引擎),而Unity Script是在Mono VM中运行的。本质上说,到了IL这一层级,它是由哪门高级语言创建的也不是那么重要了,你可以用C#,VB,Boo,Unity Script甚至C++,只要有相应的编译器能够将其编译成IL都行!


    IL2CPP, IL2CPP VM

    本 文的主角终于出来了:IL2CPP。有了上面的知识,大家很容易就理解其意义了:把IL中间语言转换成CPP文件。大家如果看明白了上面动态语言的 CLI, IL以及VM,再看到IL2CPP一定心中充满了疑惑。现在的大趋势都是把语言加上动态特性,哪怕是c++这样的静态语言,也出现了适合IL的c++编译 器,为啥Unity要反其道而行之,把IL再弄回静态的CPP呢?这不是吃饱了撑着嘛。根据本文最前面给出的Unity官方博客所解释的,原因有以下几 个:
    1.Mono VM在各个平台移植,维护非常耗时,有时甚至不可能完成
    Mono的跨平台是通过Mono VM实现的,有几个平台,就要实现几个VM,像Unity这样支持多平台的引擎,Mono官方的VM肯定是不能满足需求的。所以针对不同的新平 台,Unity的项目组就要把VM给移植一遍,同时解决VM里面发现的bug。这非常耗时耗力。这些能移植的平台还好说,还有比如WebGL这样基于浏览 器的平台。要让WebGL支持Mono的VM几乎是不可能的。
    2.Mono版本授权受限
    大家有没有意识到Mono的版本已经更新到3.X了,但是在Unity中,C#的运行时版本一直停留在2.8,这也是Unity社区开发者抱怨的最多一 条:很多C#的新特性无法使用。这是因为Mono 授权受限,导致Unity无法升级Mono。如果换做是IL2CPP,IL2CPP VM这套完全自己开发的组件,就解决了这个问题。
    3.提高运行效率
    根据官方的实验数据,换成IL2CPP以后,程序的运行效率有了1.5-2.0倍的提升。

    使用Mono的时候,脚本的编译运行如下图所示:

     

     

    简单的来说,3大脚本被编译成IL,在游戏运行的时候,IL和项目里其他第三方兼容的DLL一起,放入Mono VM虚拟机,由虚拟机解析成机器码,并且执行
    IL2CPP做的改变由下图红色部分标明:

     

     

    在得到中间语言IL后,使用IL2CPP将他们重新变回C++代码,然后再由各个平台的C++编译器直接编译成能执行的原生汇编代码。

    几点注意:
    1.将IL变回CPP的目的除了CPP的执行效率快以外,另一个很重要的原因是可以利用现成的在各个平台的C++编译器对代码执行编译期优化,这样可以进一步减小最终游戏的尺寸并提高游戏运行速度。

    2. 由于动态语言的特性,他们多半无需程序员太多关心内存管理,所有的内存分配和回收都由一个叫做GC(Garbage Collector)的组件完成。虽然通过IL2CPP以后代码变成了静态的C++,但是内存管理这块还是遵循C#的方式,这也是为什么最后还要有一个 IL2CPP VM的原因:它负责提供诸如GC管理,线程创建这类的服务性工作。但是由于去除了IL加载和动态解析的工作,使得IL2CPP VM可以做的很小,并且使得游戏载入时间缩短。

    3.由于C++是一门静态语言,这就意味着我们不能使用动态语言的那些酷炫特性。运行时生 成代码并执行肯定是不可能了。这就是Unity里面提到的所谓AOT(Ahead Of Time)编译而非JIT(Just In Time)编译。其实很多平台出于安全的考虑是不允许JIT的,大家最熟悉的有iOS平台,在Console游戏机上,不管是微软的Xbox360, XboxOne,还是Sony的PS3,PS4,PSV,没有一个是允许JIT的。使用了IL2CPP,就完全是AOT方式了,如果原来使用了动态特性的 代码肯定会编译失败。这些代码在编译iOS平台的时候天生也会失败,所以如果你是为iOS开发的游戏代码,就不用担心了。因此就这点而言,我们开发上几乎 不会感到什么问题。

    最后给出Unite 2014上官方给出的性能测试截图(数字越小表示运行得越快):

     

     

    有了IL2CPP,程序尺寸可以相对缩小,运行速度可以提高!看了兴奋吗?其实现有的Unity版本中已经引入了IL2CPP技术。本文下篇就通过一个实际的例子,看看IL2CPP都为我们做了哪些,以及我们需要注意些什么。

    展开全文
  • Unity iOS IL2CPP Build error

    2020-12-26 05:38:23
    at Unity.IL2CPP.MethodWriter.WriteMethodBody (Mono.Cecil.MethodReference method, Unity.IL2CPP.CppCodeWriter methodBodyWriter, IRuntimeMetadataAccess metadataAccess, Unity.IL2CPP.IncludeCollection....
  • Failed running C:\Program Files\Unity2019.2.8f1\Editor\Data\il2cpp/build/il2cpp.exe --convert-to-cpp --emit-null-checks --enable-array-bounds-check --dotnetprofile=“unityaot” --compile-cpp --libil2...

    Failed running C:\Program Files\Unity2019.2.8f1\Editor\Data\il2cpp/build/il2cpp.exe --convert-to-cpp --emit-null-checks --enable-array-bounds-check --dotnetprofile=“unityaot” --compile-cpp --libil2cpp-static --platform=“Android” --architecture=“ARMv7” --configuration=“Release” --outputpath=“E:\Adtiming\slots\client\Temp\StagingArea\assets\bin\Data\Native\armeabi-v7a\libil2cpp.so” --cachedirectory=“E:\Adtiming\slots\client\Assets…\Library\il2cpp_android_armeabi-v7a/il2cpp_cache” --additional-include-directories=“C:/Program Files/Unity2019.2.8f1/Editor/Data/PlaybackEngines/AndroidPlayer/Tools\bdwgc/include” --additional-include-directories=“C:/Program Files/Unity2019.2.8f1/Editor/Data/PlaybackEngines/AndroidPlayer/Tools\libil2cpp/include” --tool-chain-path=“E:/softwares/android-ndk-r16b-windows-x86_64/android-ndk-r16b” --profiler-report --map-file-parser=“C:/Program Files/Unity2019.2.8f1/Editor/Data/Tools/MapFileParser/MapFileParser.exe” --directory=E:/Adtiming/slots/client/Temp/StagingArea/assets/bin/Data/Managed --generatedcppdir=E:/Adtiming/slots/client/Temp/StagingArea/Il2Cpp/il2cppOutput

    stdout:
    Building libil2cpp.so with AndroidToolChain
    Output directory: E:\Adtiming\slots\client\Temp\StagingArea\assets\bin\Data\Native\armeabi-v7a
    Cache directory: E:\Adtiming\slots\client\Library\il2cpp_android_armeabi-v7a\il2cpp_cache
    ObjectFiles: 248 of which compiled: 0
    Total compilation time: 142 milliseconds.
    il2cpp.exe didn’t catch exception: Unity.IL2CPP.Building.BuilderFailedException: E:\softwares\android-ndk-r16b-windows-x86_64\android-ndk-r16b\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++ @“C:\Users\zhouhui\AppData\Local\Temp\tmpACD.tmp” -o “E:\Adtiming\slots\client\Library\il2cpp_android_armeabi-v7a\il2cpp_cache\linkresult_6D95211E8A2D9A549AF8D74E216D94C3\libil2cpp.so” -shared -Wl,-soname,libil2cpp.so -Wl,–no-undefined -Wl,-z,noexecstack -Wl,–gc-sections -Wl,–build-id --sysroot “E:\softwares\android-ndk-r16b-windows-x86_64\android-ndk-r16b\platforms\android-16\arch-arm” -gcc-toolchain “E:\softwares\android-ndk-r16b-windows-x86_64\android-ndk-r16b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64” -target armv7-none-linux-androideabi -Wl,–wrap,sigaction -L “E:\softwares\android-ndk-r16b-windows-x86_64\android-ndk-r16b\sources\cxx-stl\gnu-libstdc++\4.9\libs\armeabi-v7a” -lgnustl_static -latomic -llog -rdynamic -fuse-ld=gold.exe

    E:\Adtiming\slots\client\Temp\StagingArea\Il2Cpp\il2cppOutput/Assembly-CSharp4.cpp:34049: error: undefined reference to 'getIPv6’
    clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)

    详细报错路上,重点关注加粗的一句undefined reference to ‘getIPv6’。这是因为使用IL2CPP的方式编译的时候,一些IOS平台的方法在安卓平台没有导致的报错。
    在项目中也确实找到如下方法:

        [DllImport("__Internal")]
        private static extern string getIPv6(string mHost, string mPort);
        private static string getIPv6ByCS(string mHost, string mPort)
        {
    #if UNITY_IPHONE && !UNITY_EDITOR
    		string mIPv6 = getIPv6(mHost, mPort);
    		return mIPv6;
    #else
            return mHost + "&&ipv4";
    #endif
        }
    

    以[DllImport(“__Internal”)]修饰的方法必须在对应平台有对应的c++实现不然就报错
    所以可以使用宏修饰该方法。
    改正如下:

        #if UNITY_IPHONE && !UNITY_EDITOR
        [DllImport("__Internal")]
        private static extern string getIPv6(string mHost, string mPort);
        #endif
        private static string getIPv6ByCS(string mHost, string mPort)
        {
    #if UNITY_IPHONE && !UNITY_EDITOR
    		string mIPv6 = getIPv6(mHost, mPort);
    		return mIPv6;
    #else
            return mHost + "&&ipv4";
    #endif
        }
    

    这样便可以顺利编译了

    展开全文
  • 前文详细的介绍了IL2CPP的来龙去脉,这里用一个实际的例子来看看Unity3D里的IL2CPP都为我们做了哪些工作以及在使用的过程中会遇到哪些问题。 IL2CPP应用的第一个平台是WebGL,为了让游戏可以一键部署到基于WebGL...

    转自:https://zhuanlan.zhihu.com/p/19972666

    版本准备

    前文详细的介绍了IL2CPP的来龙去脉,这里用一个实际的例子来看看Unity3D里的IL2CPP都为我们做了哪些工作以及在使用的过程中会遇到哪些问题。

    IL2CPP应用的第一个平台是WebGL,为了让游戏可以一键部署到基于WebGL的浏览器中,Unity3D Script工作组的大牛们找到了一个绝妙的解决方案:不仅解决了C#,Unity Script语言兼容问题,还解决了客户端源码泄漏问题。这个功能在Unity5.0 Beta版中提供了测试。

    IL2CPP的第二个试用平台是iOS 64位版。大家都知道苹果已经发了最后通牒,全新App必须在15年2月1日支持64位CPU,而已经上架的游戏也必须在15年6月1日更新的时候支持64位。这个64位编译就是交由IL2CPP完成的。具体到版本是 Unity 4.6.1 p5,Unity4.6.2和Unity 4.6.2 p1。本文后面都使用4.6.2 p1版本来进行演示。

    创建项目,加入代码
    创建一个空的项目,加入两个cs文件,一个叫IL2CPPCompatible.cs,另外一个是IL2CPPStudy.cs。前者主要用来测试代码在IL2CPP中的兼容性,后者用来产生C++代码,用来做对比分析。

    以下是两个文件的详细内容:

    IL2CPPCompatible.cs

    这个文件中有两个兼容性测试函数。一个函数使用ThreadPool.QueueUserWorkItem启动一个新的线程。另一个则是SSL认证函数:ssl.AuthenticateAsClient (hosturl); 之所以写这两个函数是因为上述4.6.x IL2CPP对他们支持的还不是很好,会产生问题,这个我们在后面会详细讲到。

    IL2CPPStudy.cs

    using UnityEngine;
    using System.Collections;
    using System.IO;
    using System.Threading;
    public class CoconutClassStudy
    {
            public int inta;
            public int intb;
            public int Add()
            {
                    return inta + intb;
            }
            public CoconutClassStudy(int a, int b)
            {
                    inta = a;
                    intb = b;
            }
            public void IOTest(string filename)
            {
                    if (File.Exists (filename)) {
                            FileStream fs = File.Open(filename, FileMode.Create);
                            fs.Close();
                    }
            }
            public void ThreadTest()
            {
                    Thread a =new Thread(delegate(object state) {
                            Debug.Log ("Thread Started");
                    });
                   
                    a.Start ();
            }
    }
    
    
    public class IL2CPPStudy : MonoBehaviour {
            // Use this for initialization
            void Start () {
                    Debug.Log (CoconutFuncStudy (10 , 20));
                    CoconutClassStudy cc = new CoconutClassStudy (50, 60);
                    Debug.Log (cc.Add ());
                    cc.IOTest("test.txt");
                    cc.ThreadTest ();
                    Debug.Log (cc.GetType ());
            }
            
            // Update is called once per frame
            void Update () {
            
            }
            int CoconutFuncStudy(int a, int b)
            {
                    return a + b;
            }
    }
    
    这个文件里面的内容就更简单了:一个CoconutClassStudy类,里面有一个构造函数,一个Add函数和一个IOTest函数。另外在MonoBehaviour的Start()中,创建这个类的实例,并调用这两个函数。这个源码可以让我们研究以下几个方面:
    1.cs的类在经过IL2CPP以后如何在CPP文件中表达
    2.C#的IO操作经过IL2CPP以后如何在CPP文件中表达
    3.当调用new关键字在堆里产生一个实例的时候CPP文件又是如何做的
    4.开启一个线程的操作IL2CPP会如何翻译
    5.调用cc.GetType()的行为IL2CPP如何处理

    有了这连个文件后我们要做的第一件事情是生成XCode项目:
    选择IL2CPP编译模块,然后Build,生成XCode项目。
    打开项目,在项目结构中打开Classes目录,可以看到多了一个Native的子目录。
    IL2CPP转换出的所有文件都在其中。
    我们写的逻辑代码,都在Assembly-CSharp.cpp中,除了这个文件,Native文件夹中还有很多以Bulk开头的文件,这些其实是IL2CPP把一些必要C#库翻译到CPP形成的文件。


    像Bulk_Generics_x.cpp和System.Collections.Generic有关。
    Bulk_UnityEngine.UI_x.cpp则和Unity自带的UI有关。

    让我们粗略的分析下在CPP文件中前面的5条都是如何实现的:
    1.cs的类在经过IL2CPP以后如何在CPP文件中表达


    我们的CoconutClassStudy类在CPP文件中变成了一个Struct,继承于Object_t4。那这个Object_t4又是什么呢?

    聪明的你一看注释就知道了吧,没错,这个就是C#中的万物之源,System.Object。

    既然我们C#的类变成了Struct,那类里面的函数都去哪里了呢?带着这个疑问,我们来看第二条。

    2.C#的IO操作经过IL2CPP以后如何在CPP文件中表达
    在CoconutClassStudy类中有一个成员函数:IOTest。在CPP中,我们看到了如下的实现:

    类中的函数变成了一般的全局函数,函数名字是类名加上函数名,最后加上一个后缀而成。而原本C#中的File.Exists和File.Open函数都有了相应的C++实现。

    3.当调用new关键字在堆里产生一个实例的时候CPP文件又是如何做的?
    C#代码中我们在Start函数中有一个显示的New,找到相应C++代码:
    可以看到代码调用了一个叫il2cpp_codegen_object_new的函数。而这个函数最终调用了IL2CPP VM中的New函数,分配了属于GC管理的内存。

    接下来第四条

    4.开启一个线程的操作IL2CPP会如何翻译
    C#中的System.Thread,在C++中是一个Thread_t26相当巨大的结构,在New出了这个结构之后,设置线程入口函数,最后调用Thread_Start_m47启动线程。这个函数就是对应System.Threading.Thread.Start() 
    我们看最后一条
    5.调用cc.GetType()的行为IL2CPP如何处理。找到C++中的对应Start函数:
    首先我们看到了对应C#中的Type的C++实现:Type_t28,其次是GetType()这个函数在C++中的实现,最后发现是调到了IL2CPP的VM函数:

    在这些C++的实现中,细心的读者可能会发现他们时时刻刻都在使用MethodInfo和TypeInfo这样的信息。这个就是Unity Script项目组提到的Metadata。Metadata指的是非逻辑代码,而是函数,结构,变量以及类本省的一些信息。比如名字,类型等。这个Metadata提供C++代码和后台的IL2CPP VM运行时必要的信息。

    以上5条只是很简单的例子,大家如果对IL2CPP的转换感兴趣,可以自己写出想要了解的测试代码,然后再对比CPP文件看其实现。

    前方有坑,请小心
    新的事物总是伴随着问题,特别是在软件行业,Bug是不可避免的。就目前阶段而言,IL2CPP还有不少问题。这个就是项目中IL2CPPCompatible.cs存在的意义:做兼容性测试。大家在实际的项目中如果遇到了问题,可以在这个文件中追加测试代码。下面的表格把我们遇到的已知问题做一个列举,供参考。

    IL2CPP总结以及我们的建议
    IL2CPP是Unity核心进行的很重要的进化之一。就现在来看,好处有以下几点:

    1.运行速度加快,游戏安装尺寸减小,内存占用降低

    2.除了可以Mono调试C#之外,我们又多了一种选择:Native C++ 源码级调试(不知道你们什么感觉,我对Unity C#调试颇有意见,经常连不上调试器,而且调试过程中常常宕机。换成用原生IDE调试C++代码,就爽很多啦)。

    3.可以快速的支持新的平台,当然这点对我们关系不大。

    带来的问题:
    1.由于原来由Mono VM的IL代码全部变成了CPP,导致项目中多了很多CPP代码,编译时间会显著增加。

    2.IL2CPP还有各种Bug,可能会导致原来的代码不能很好的编译运行。需要等待Unity版本迭代。

    3.鉴于C++静态语言的特性,我们不能使用诸如System.Reflection.Emit这样的动态代码。(C# ATO方式编译)

    给使用Unity开发者的建议:
    IL2CPP是大势所趋,加上苹果强制使用64位支持,意味着到了6月1号,所有用Unity开发的游戏都要用到新的编译方式。如果你的项目比较大,应该立刻开始尝试IL2CPP,以便发现问题,并开始解决。

    本文项目在:
    CoconutIslandStudio/IL2CPP_Test · GitHub
    展开全文
  • UnityIL2CPP

    千次阅读 2019-03-16 19:19:25
    背景 在Unity4.6.1p5以后版本中,在PlayerSettings—&gt;Other Settings—&gt;Scripting Backend有mono和il2cpp两个选项,...IL2CPPUnity一种新的脚本后处理(Scripting Backend)方式,针对.Net平台编...

     

    背景

    在Unity4.6.1p5以后版本中,在PlayerSettings—>Other Settings—>Scripting Backend有mono和il2cpp两个选项,它们是Unity脚本后处理(Scripting Backend)的两种方式。

     

    概念

    IL2CPP 是 Unity一种新的脚本后处理(Scripting Backend)方式,针对.Net平台编译输出的IL(中间语言)进行处理。

    IL2CPP主要由两部分组成:

    1. AOT静态编译编译器(il2cpp.exe)
    2. 运行时库(libil2cpp)

    其中AOT将 IL转换为C++源码,再交给各平台的C++编译器进行编译,达到平台兼容的目的;运行时库则会提供诸如 垃圾回收、线程/文件获取、内部调用直接修改托管数据结构的原生代码 的服务与抽象。

    IL2CPP脚本后处理技术示例图:

     

    对比

    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比较适合开发和发布项目 ,但是为了提高版本迭代速度,可以在开发期间切换到Mono模式(构建应用快)。

     

     

     

     

     

    参考链接:

    https://www.cnblogs.com/lancidie/p/6258154.html

    http://www.newhappy.com.cn/?p=1025

    https://www.jianshu.com/p/7cfcb7b0cfe7

    展开全文
  • s not a huge amount of talk about using IL2CPP independently of Unity (unless I just haven't done enough research...). <p>Maybe this isn't something you've looked at, but is it even ...
  • <div><p>Hi, I'... message if I try to dump IL2CPP from Unity 2017 builds. It works on Mach-O files though. Thanks!</p><p>该提问来源于开源项目:djkaty/Il2CppInspector</p></div>
  • Unity3D想必大家都不陌生,独立游戏制作者们很多人都在用它,甚至一些大公司也用在很商业的游戏制作上。Unity3D最大的一个特点是一次制作,多平台部署,而这一核心功能是靠Mono实现的。可以说Mono是U
  • Unity Android il2cpp

    2020-05-07 22:38:21
    原来 il2cpp android 导出的 c++ 已经编译成 so 了
  • IL2CPP

    2016-10-07 22:30:00
    [官方教程] IL2CPP 深入讲解系列介绍 (汇总帖) http://forum.china.unity3d.com/forum.php?mod=viewthread&...Unity将来时:IL2CPP是什么?http://inpla.net/thread-8197-1-1.htmlhttps://zhuanlan.zhi...
  • Unity 2018 il2cpp issues

    2020-12-30 11:36:28
    il2cpp::icalls::mscorlib::System::Reflection::AssemblyName' No member named 'UnsafeGetValue' in 'il2cpp::icalls::mscorlib::System::Reflection::FieldInfo' No member named '...
  • Unity IL2CPP原理合辑

    千次阅读 2017-08-29 15:15:41
    Unity做游戏,你需要深入了解一下IL2CPP(一) IL2CPP 深入讲解:代码生成之旅(二) IL2CPP 深入讲解:P/Invoke封装(三) IL2CPP 深入讲解:方法调用介绍(四) ...
  • unity打包webgl中出现的错误及解决方法第一个 IL2cpp.exe not run properly第二个 IL2cpp/build/unityLinker.exe not run properly 第一个 IL2cpp.exe not run properly 常见的iL2cpp.exe not run properly,是因为...
  • <p>Failed running C:\Program Files\Unity\Editor\Data\il2cpp/build/il2cpp.exe --convert-to-cpp --copy-level=None --enable-symbol-loading --development-mode --extra-types.file="C:\Program ...
  • IL2CPP反汇编程序。 开启Apk 选择apk,它会自动展开和反汇编。 像代码编辑器一样,您可以看到反汇编的结果。 比较Apks 选择两个apk,并显示它们之间的差异。 如果存在差异,则更改背景色。 入门 视窗 下载 打开...
  • Unity3d IL2CPP 内存对齐错误

    千次阅读 2019-04-13 16:13:42
    title: Unity3d IL2CPP 内存对齐错误 key: 201904131333 tags: unity 文章目录layout: post title: Unity3d IL2CPP 内存对齐错误 key: 201904131333 tags: unity unity3d il2cpp安卓包运行异常,出现信号错误signal ...
  • Unity Android il2cpp 编译报错解决

    万次阅读 2018-02-03 15:41:31
    Unity很早就提供了Android il2cpp的编译接口,谣传il2cpp效率提升了一些,让出了一些效率给渲染。还有一个好处破解难度升级,mono时代反编译dll就好,il2cpp的.so文件破解难度增加。最近反编译大厂的游戏很多游戏也...
  • Unity IL2CPP概述

    2018-04-13 09:45:49
    写在最前:IL2CPP译为Common Intermediate Language To C++,相比较原来mono,这是另一种脚本烘焙模式(Scripting Backend)MonoIL2CPPUnity3D想必大家都不陌生,独立游戏制作者们很多人都在用它,甚至一些大公司也用...
  • Unity 5.0 IL2CPP

    千次阅读 2015-06-05 11:35:58
    使用Unity5.0 有一段时间了,直到最近才发现IL2CPP,不是很明白它是干什么的,因为用了iTextSharp去生成PDF文件在iOS设备上,必须在Build成为Xcode工程的时候从Mono2.0切换到IL2CPP,否则iTextSharp会导致App在iOS...
  • <p>IL2CPP error for field 'Zenject.DiContainer Zenject.KeyedFactoryBase`2::_container' in KeyedFactory.cs:11 Additional information: attempting to call method 'System.Void Zenject....
  • UnityIL2CPP & Mono

    2019-03-29 16:37:03
    UnityIL2CPP & Mono 作者: lingze 分类: Unity3D 发布时间: 2018-10-18 16:27 iOS和Android平台 , 可以在PlayerSettings面板中选择 Mono 或者 IL2CPP 这两种Scripting Backend (译者注:Scripting Backend...
  • unity3d IL2CPP for android

    万次阅读 2019-01-22 00:16:00
    unity3d 使用IL2Cpp导出android工程报以下错误解决方法 重点是这块 “”System.Reflection.TargetInvocationException: ���õ�Ŀ�귢�����쳣�� --->System.InvalidOperationException: ��ʵ�ֲ�...
  • unity il2cpp 热更实现

    2021-02-05 14:58:53
    unity libil2cpp.so 代码动态库热更实现 代码热更分别要实现动态库热更和global-metadata.dat的热更。...1.声明出il2cpp所有的导出函数 // // Created by Administrator on 2019/5/14. // #ifndef TEST_UPDATE_
  • Unity IL2Cpp

    千次阅读 2018-07-27 14:58:00
    Failed running C:\Program Files\Unity\Editor\Data\il2cpp/build/il2cpp.exe --convert-to-cpp --emit-null-checks --enable-array-bounds-check --dotnetprofile="unityaot" --compile-cpp --libil2cpp-static --...
  • Unity il2cpp support

    2021-01-03 04:08:49
    <div><p>Trying to support https://github.com/discordapp/discord-rpc/issues/243</p><p>该提问来源于开源项目:discord/discord-rpc</p></div>

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 882
精华内容 352
关键字:

il2cppunity