比如某個dll中有一個類:
public class A { public A(){} }
如果工程中,沒有顯式調用 new A(),在使用il2cpp方式構建時,這個A()會被剔除掉。最終的程序包里也就沒法找到這個默認構造了。
解決辦法:
1、找一個位置定義一個無用的靜態實例,如 static A _unusedA = new A();這樣就相當於A()被使用了,不會被剔除。問題是多了一個無用的對象在內存里。
2、使用unity的link.xml,具體如下:
無論從減少安裝包大小還是迎合unity64位IL2CPP默認就會打開StrippingLevel功能,通過庫剖離來減少DLL的空間大小。
那么問題是我們自定義庫使用了一些type,例如xml,或者webclient c#封裝的http請求等,如果被任性解剖出去,那么肯定是不允許的。
可以在Assets/下添加link.xml文件來手動排除不被剖離的類。
1 <linker> 2 <assembly fullname="mscorlib"> 3 <type fullname="System.Reflection" preserve="all"/> 4 <type fullname="System.Security.Cryptography" preserve="all"/> 5 <type fullname="System.Runtime.CompilerServices" preserve="all"/> 6 <type fullname="System.Runtime.InteropServices" preserve="all"/> 7 <type fullname="System.Diagnostics" preserve="all"/> 8 <type fullname="System.Security" preserve="all"/> 9 <type fullname="System.Security.Permissions" preserve="all"/> 10 </assembly> 11 </linker>
如上我們保持link.xml里面的格式這樣既可 assembly其實就是dll庫名,我們要排除這個dll庫里面的
1:整個命名空間;
2:某個命名空間里面的某個具體類
針對排除整個命名空間可以這樣加:
<assembly fullname="JsonDotNet"> <namespace fullname="Newtonsoft.Json" preserve="all"/> </assembly>
關於查看dll庫可以用默認的mono編輯器或者vs點進目錄文件分類的dll就能看見了。
關於如何知道什么類或者命名空間你需要添加進去link.xml,只能你使用這個特殊命名空間才知道了。或者你通過xcode debug出錯、eclipse debug真機運行時出錯來查看那些類空間報錯添加進去即可。