Unity2020.3.33使用Newtonsoft.Json.dll用IL2CPP打包PC出错

工作时使用IL2CPP打包PC,发现打包失败。

根据代码查找后,发现是Unity.Plastic.Newtonsoft.Json找不到

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Plastic.Newtonsoft.Json;
using Unity.Plastic.Newtonsoft.Json.Linq;

public class MyScripts : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        string json = CreateJson();
        Debug.Log(json);
        LoadJson(json);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    void LoadJson(string json)
    {
        JToken token = JsonConvert.DeserializeObject<JToken>(json);
        if (token.Type == JTokenType.Object)
        {
            JObject obj = token.ToObject<JObject>();
            Debug.LogFormat("json数据如下: num:{0},name:{1},sex:{2}",
                obj["num"].ToString(),
                obj["name"].ToString(),
                obj["sex"].ToString());
        }
    }
    string CreateJson()
    {
        MyData data = new MyData();
        data.num = 5;
        data.name = "测试";
        data.sex = true;
        string json = JsonConvert.SerializeObject(data);
        return json;
    }
}
public class MyData
{
    public int num;
    public string name;
    public bool sex;
}

于是去查找命名空间所在dll位置

发现是Unity的包 框架似乎是.net3.5,怀疑dll不支持。 

于是通过这个方法成功打包

unity 关于Newtonsoft.Json引用报错问题!!!!(已解决) - 灰信网(软件开发博客聚合) (freesion.com)

但是打包后运行代码出错

依旧无法找到Newtonsoft.Json.dll。

unity3d - Unity Json.net System.Reflection.Emit in iOS 中的错误 - 堆栈溢出 (stackoverflow.com)

根据搜索发现IL2CPP似乎不支持运行时代码生成,不能与Newtonsoft Json一起使用。

Installation via UPM · jilleJr/Newtonsoft.Json-for-Unity Wiki · GitHub

最终通过搜索找到了Unity特殊版本的Newtonsoft.Json库,成功解决了问题

总结解决方法:

1.找到你的项目文件夹/Packages/manifest.json文件,打开并添加以下内容

{
 "scopedRegistries": [
    {
      "name": "Packages from jillejr",
      "url": "https://npm.cloudsmith.io/jillejr/newtonsoft-json-for-unity/",
      "scopes": ["jillejr"]
    }
  ],

  "dependencies": {
    "jillejr.newtonsoft.json-for-unity": "12.0.201",
    "com.unity.ide.visualstudio": "2.0.14",
    "com.unity.ide.vscode": "1.2.5",
    "com.unity.test-framework": "1.1.31",
    "com.unity.textmeshpro": "3.0.6",
    "com.unity.ugui": "1.0.0",
    "com.unity.modules.ai": "1.0.0",
    "com.unity.modules.androidjni": "1.0.0",
    "com.unity.modules.animation": "1.0.0",
    "com.unity.modules.assetbundle": "1.0.0",
    "com.unity.modules.audio": "1.0.0",
    "com.unity.modules.cloth": "1.0.0",
    "com.unity.modules.director": "1.0.0",
    "com.unity.modules.imageconversion": "1.0.0",
    "com.unity.modules.imgui": "1.0.0",
    "com.unity.modules.jsonserialize": "1.0.0",
    "com.unity.modules.particlesystem": "1.0.0",
    "com.unity.modules.physics": "1.0.0",
    "com.unity.modules.physics2d": "1.0.0",
    "com.unity.modules.screencapture": "1.0.0",
    "com.unity.modules.terrain": "1.0.0",
    "com.unity.modules.terrainphysics": "1.0.0",
    "com.unity.modules.tilemap": "1.0.0",
    "com.unity.modules.ui": "1.0.0",
    "com.unity.modules.uielements": "1.0.0",
    "com.unity.modules.umbra": "1.0.0",
    "com.unity.modules.unityanalytics": "1.0.0",
    "com.unity.modules.unitywebrequest": "1.0.0",
    "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
    "com.unity.modules.unitywebrequestaudio": "1.0.0",
    "com.unity.modules.unitywebrequesttexture": "1.0.0",
    "com.unity.modules.unitywebrequestwww": "1.0.0",
    "com.unity.modules.vehicles": "1.0.0",
    "com.unity.modules.video": "1.0.0",
    "com.unity.modules.vr": "1.0.0",
    "com.unity.modules.wind": "1.0.0",
    "com.unity.modules.xr": "1.0.0"
  }
}

2.在Assets文件夹下新建一个link.xml文件,写入以下内容,防止裁剪

<linker>
      <assembly fullname="Newtonsoft.Json" preserve="all" />
  <assembly fullname="System.Core">
    <type fullname="System.Linq.Expressions.Interpreter.LightLambda" preserve="all" />
  </assembly>
</linker>

3.最后记得代码的using更改

using Unity.Plastic.Newtonsoft.Json;
using Unity.Plastic.Newtonsoft.Json.Linq;

//改为下面这段


using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

猜你喜欢

转载自blog.csdn.net/qq_42429534/article/details/126674788