本地正常TeamCity报错:System.Runtime.CompilerServices.Unsafe版本不匹配
解决System.Runtime.CompilerServices.Unsafe版本不匹配的TeamCity执行报错
检查TeamCity的NuGet还原配置
- 确保TeamCity构建步骤里的NuGet还原操作,优先读取项目本地的
packages.config或PackageReference配置,而非依赖全局缓存的旧版本。部分场景下,TeamCity会用缓存中的4.0.4.1版本覆盖你指定的6.0.0版本,引发版本冲突。 - 可以在构建前置步骤中添加清理缓存命令:
dotnet nuget locals all --clear,或者在NuGet还原步骤里勾选「清理缓存」选项。
验证绑定重定向是否同步到输出目录
- 本地运行时VS会自动将app.config的绑定重定向生成到测试项目输出的
[测试项目名].exe.config中,但TeamCity构建时可能未完成这个同步。检查构建后的测试输出目录,确认配置文件里存在以下节点:<dependentAssembly> <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" /> </dependentAssembly> - 如果缺失,手动在测试项目的app.config中明确添加该节点,并确保TeamCity构建过程不会覆盖这个文件。
统一测试运行器版本
- 部分旧版本的测试运行器(如NUnit、xUnit)自身依赖System.Runtime.CompilerServices.Unsafe的4.0.4.1版本,若TeamCity使用的测试运行器和你本地版本不一致,就会引发冲突。
- 升级TeamCity上的测试运行器至最新稳定版,同时在测试项目中直接引用对应测试运行器的最新NuGet包,保证依赖链统一。
在项目文件中强制指定版本
- 打开测试项目的
.csproj文件,添加以下配置,强制依赖6.0.0版本的程序集,避免依赖解析时自动选择旧版本:<ItemGroup> <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.0.0" PrivateAssets="all" /> </ItemGroup> - 若是
packages.config格式,确认其中的版本配置为<package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0" targetFramework="..." />,且没有其他关联项目引用旧版本。
检查构建代理的GAC缓存
- 极少数情况下,TeamCity构建代理机器的全局程序集缓存(GAC)中可能存在4.0.4.1版本的程序集,导致构建时优先加载该版本。在代理机器上执行
gacutil /l System.Runtime.CompilerServices.Unsafe查看,若存在旧版本,用gacutil /u System.Runtime.CompilerServices.Unsafe, Version=4.0.4.1卸载。
内容的提问来源于stack exchange,提问作者Mr X
相关产品推荐
相关产品推荐

