如何解決unity構建iOS版本,dll中的構建函數丟失的問題


比如某個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真機運行時出錯來查看那些類空間報錯添加進去即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM