Unity报错CS1705:.NET6 DLL依赖System.Runtime版本高于引用版本如何解决
问题描述
在Linux平台、使用Mono作为编译器的Unity项目中,引入.NET 6编译生成的自定义DominoEngine.dll时触发编译错误:
error CS1705: Assembly 'DominoEngine' with identity 'DominoEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' uses 'System.Runtime, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' which has a higher version than referenced assembly 'System.Runtime' with identity 'System.Runtime, Version=4.1.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
问题根因
该错误和Linux运行平台无关,核心是程序集编译目标与Unity运行时的基类库版本不匹配:
- .NET 6环境下编译类库时,默认会引用版本为6.0.0.0的
System.Runtime等.NET基础类库 - 未开启.NET 6兼容级别的Unity Mono编译环境,默认绑定.NET Standard/.NET Framework 4.x系列基础类库,自带的
System.Runtime最高版本为4.1.2.0,无法识别高版本基础程序集引用
解决方案(按推荐优先级排序)
方案1:重编译自定义类库匹配Unity支持的目标框架(无兼容风险,首选)
这是Unity引入自定义托管DLL的标准方案,不会引入任何运行时崩溃问题:
- 打开
DominoEngine项目的.csproj项目文件 - 将原有的
net6.0目标框架,替换为当前Unity版本支持的兼容目标:- Unity 2020.3及以上LTS版本,优先选择
netstandard2.1 - 项目开启.NET Framework兼容模式、或使用2020以前的Unity版本,选择
net48
- Unity 2020.3及以上LTS版本,优先选择
- 增加编译配置,避免编译时将系统基础类库复制到输出目录
参考项目配置如下:<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>netstandard2.1</TargetFramework> <GenerateRuntimeConfigurationFiles>false</GenerateRuntimeConfigurationFiles> <CopyLocalLockFileAssemblies>false</CopyLocalLockFileAssemblies> <Nullable>disable</Nullable> </PropertyGroup> </Project> - 重新编译项目,将输出目录下的
DominoEngine.dll复制到Unity项目的Assets/Plugins目录即可正常加载,不会再触发版本不匹配错误。
方案2:升级Unity配置支持.NET 6运行时(仅适用于高版本Unity)
如果必须使用.NET 6专属API、无法降级类库目标框架,需要满足以下前提:
- 使用2022.3 LTS及以上版本的Unity,该版本之后Mono后端才正式支持.NET 6 API兼容级别
- 打开Unity的
Player Settings > Other Settings > Configuration,将Api Compatibility Level调整为.NET 6 - 重新编译
DominoEngine.dll时,不要将.NET 6 SDK自带的System.Runtime等基础类库复制到Unity项目中,避免覆盖Unity自带的运行时库。
避坑提醒
- 绝对不要将本地.NET 6 SDK目录下的6.0版本
System.Runtime.dll等基础类库复制到Unity项目中,Mono运行时和CoreCLR基础库不兼容,会直接导致编辑器崩溃、Linux平台运行时闪退,且无明确报错日志 - 不要尝试通过
app.config配置程序集绑定重定向解决版本问题,Unity的Mono编译管线不识别该配置,添加后完全无效。
内容的提问来源于stack exchange,提问作者Fernando Valdes
相关产品推荐
相关产品推荐

