开发环境
- 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 没有这个问题。
问题现象
正常情况
- 未混淆的
Dave.CodeGen.dll
在 Unity 中正常运行 - 使用
ILSpy
检查发现引用的是mscorlib
- 未混淆的
异常情况
- 使用
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 版本
操作步骤
- 使用
ILSpy
打开混淆后的Dave.CodeGen.dll
- 使用
发现
- 目标框架是
.NET Framework 4.7.2
,与预期一致 - 引用中出现了
System.Private.CoreLib
- 目标框架是
结论
- .NET 版本正确,问题不在目标框架
对比未混淆的 DLL
操作步骤
- 用
ILSpy
打开未混淆的Dave.CodeGen.dll
- 用
发现
- 未混淆的 DLL 引用的是
mscorlib
- 没有
System.Private.CoreLib
引用
- 未混淆的 DLL 引用的是
结论
- 混淆过程引入了
System.Private.CoreLib
的引用
- 混淆过程引入了
环境检查
.NET 环境
1 2 3 4 5 6
# 检查 SDK 版本 dotnet --list-sdks dotnet --version # 检查运行时版本 dotnet --info
Unity 编译
- Unity 自动编译
- Unity 命令行编译
- 输出位置:
Library/ScriptAssemblies/
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
):
|
|
2. 配置步骤
创建依赖目录
- 在项目目录下创建
obfuscar_dependencies
文件夹 - 将
mscorlib.dll
复制到该目录
- 在项目目录下创建
验证配置
- 混淆后的 DLL 引用 mscorlib
- 无 System.Private.CoreLib 引用
- 在 Unity 中运行正常
问题根源
原因分析
Obfuscar 在混淆时未找到 mscorlib.dll,可能从系统路径(.NET 6 SDK)加载了 System.Private.CoreLib。这是因为:
- Obfuscar 默认会搜索系统路径
- 系统中安装了 .NET 6 SDK
- 没有明确指定 mscorlib.dll 的路径