Unity 项目中的 System.Private.CoreLib 引用问题

开发环境

  • Unity 2022.3.46f1
  • Rider 2024.3.33
  • .NET 6.0.201
  • Obfuscar 2.2.40

问题背景

为了防代码泄露,需要隔离开发工程和美术工程,将开发工程代码编译成 DLL,并且混淆后导入美术工程使用。

遇到了一个错误:混淆后的 DLL 在 Unity 中报错 Unable to resolve reference 'System.Private.CoreLib',而未混淆的 DLL 没有这个问题。

问题现象

  1. 正常情况

    • 未混淆的 Dave.CodeGen.dll 在 Unity 中正常运行
    • 使用 ILSpy 检查发现引用的是 mscorlib
  2. 异常情况

    • 使用 Obfuscar.Console 混淆后,Unity 报错:
    1
    
    Unable to resolve reference 'System.Private.CoreLib'. Is the assembly missing or incompatible with the current platform
    
    • 使用 ILSpy 检查发现引用了 System.Private.CoreLib

问题分析

1. 初步猜测

  • System.Private.CoreLib 是 .NET Core / .NET 5+ 的核心库
  • Unity 使用的是 .NET Framework 4.8(基于 mscorlib
  • 混淆过程可能引入了不兼容的引用

2. 排查过程

检查 .NET 版本

  1. 操作步骤

    • 使用 ILSpy 打开混淆后的 Dave.CodeGen.dll
  2. 发现

    • 目标框架是 .NET Framework 4.7.2,与预期一致
    • 引用中出现了 System.Private.CoreLib
  3. 结论

    • .NET 版本正确,问题不在目标框架

对比未混淆的 DLL

  1. 操作步骤

    • ILSpy 打开未混淆的 Dave.CodeGen.dll
  2. 发现

    • 未混淆的 DLL 引用的是 mscorlib
    • 没有 System.Private.CoreLib 引用
  3. 结论

    • 混淆过程引入了 System.Private.CoreLib 的引用

环境检查

  1. .NET 环境

    1
    2
    3
    4
    5
    6
    
    # 检查 SDK 版本
    dotnet --list-sdks
    dotnet --version
    
    # 检查运行时版本
    dotnet --info
    
  2. Unity 编译

    • Unity 自动编译
    • Unity 命令行编译
    • 输出位置:Library/ScriptAssemblies/
  3. Obfuscar 工具

    1
    2
    3
    4
    5
    
    # 安装
    dotnet tool install --global Obfuscar.GlobalTool --version 2.2.40
    
    # 卸载
    dotnet tool uninstall --global Obfuscar.GlobalTool
    

解决方案

1. 调整混淆配置

在 Obfuscar 配置文件中添加 mscorlib.dll 的路径(./obfuscar_dependencies/mscorlib.dll):

1
<AssemblySearchPath path="./obfuscar_dependencies" />

2. 配置步骤

  1. 创建依赖目录

    • 在项目目录下创建 obfuscar_dependencies 文件夹
    • mscorlib.dll 复制到该目录
  2. 验证配置

    • 混淆后的 DLL 引用 mscorlib
    • 无 System.Private.CoreLib 引用
    • 在 Unity 中运行正常

问题根源

原因分析

Obfuscar 在混淆时未找到 mscorlib.dll,可能从系统路径(.NET 6 SDK)加载了 System.Private.CoreLib。这是因为:

  1. Obfuscar 默认会搜索系统路径
  2. 系统中安装了 .NET 6 SDK
  3. 没有明确指定 mscorlib.dll 的路径

57.12k 字
43篇文章