# Multi-Platform 跨平台

# Mono

把c#转成IL(intermediatelanguage)中间语言,再在各平台上建上专属Mono VM(虚拟机),在VM上面运行IL即可以实现跨平台。 C#为静态语言,IL为动态语言。 难点: 实现各个平台的VM比较复杂,VM官方并没有实现太多。

5.png


# IL2CPP

把C#直接转为各个平台原生C++执行,例如安卓使用ndk编译。这其中为了保证c#的一些原生特性,为此也加个一个VM,但是功能比较少,比如实现c#的GC功能等。

6.png   使用动态特性 可以使用link.xml文件来做黑名单:

<linker>
       <assembly fullname="System.Web.Services">
               <type fullname="System.Web.Services.Protocols.SoapTypeStubInfo" preserve="all"/>
       </assembly>

       <assembly fullname="System">
               <type fullname="System.Net.Configuration.WebRequestModuleHandler" preserve="all"/>
               <type fullname="System.Net.HttpRequestCreator" preserve="all"/>
               <type fullname="System.Net.FileWebRequestCreator" preserve="all"/>
       </assembly>

       <assembly fullname="mscorlib">
               <type fullname="System.AppDomain" preserve="fields"/>
               <type fullname="System.InvalidOperationException" preserve="fields">
                       <method signature="System.Void .ctor()"/>
               </type>
               <type fullname="System.Object" preserve="nothing">
                      <method name="Finalize"/>
               </type>
       </assembly>
</linker>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

参考:

https://docs.unity3d.com/Manual/IL2CPP-BytecodeStripping.html (opens new window)

https://zhuanlan.zhihu.com/p/19972689 (opens new window)

扩展:.net 的跨平台

https://www.cnblogs.com/artech/p/how-to-cross-platform-03.html (opens new window)

上次更新: 3/23/2021, 8:33:58 AM