.NET Core连接Redis时遇System.Runtime.CompilerServices.Unsafe加载错误求助
解决.NET Core部署UAT后Redis连接时System.Runtime.CompilerServices.Unsafe加载失败问题
问题核心
本地运行正常,但UAT环境部署后出现程序集加载错误;降级StackExchange.Redis和Unsafe版本虽能恢复Redis连接,但会导致MySQL无法工作,需找到同时兼容两者的解决方案。
具体解决方案
1. 对齐本地与UAT的.NET Core运行时版本
.NET Core的程序集加载逻辑依赖运行时版本,若UAT环境的运行时版本低于本地(比如本地用.NET Core 3.1,UAT用2.1),会直接导致绑定重定向失效:
- 查看本地项目的目标框架(打开
.csproj文件,查看<TargetFramework>节点) - 在UAT服务器上安装完全匹配的.NET Core Runtime版本
2. 验证UAT部署目录的程序集完整性
部署过程中可能遗漏或错放依赖程序集:
- 本地发布项目后,检查输出目录中是否存在
System.Runtime.CompilerServices.Unsafe.dll,版本需为5.0.0.0 - 若UAT部署目录中缺失该文件,手动复制对应版本的dll到目录,或重新发布时勾选“包含所有依赖项”
3. 用项目配置自动生成绑定重定向
.NET Core中手动编写的web.config绑定重定向可能不生效,改为通过项目配置自动生成适配规则:
在项目的.csproj文件中添加以下配置:
<PropertyGroup> <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects> <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType> </PropertyGroup>
重新发布项目,系统会自动生成适配当前环境的绑定重定向规则,覆盖web.config中的手动配置
4. 强制统一依赖包版本
通过项目文件强制指定Unsafe版本,避免不同NuGet包的版本冲突:
在.csproj中添加:
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="5.0.0" PrivateAssets="all" />
PrivateAssets="all"会限制该包仅当前项目使用,防止上层项目引入其他版本引发冲突
5. 排查Redis服务器版本兼容性
StackExchange.Redis 2.6.x对Redis服务器版本有最低要求(建议4.0+),若UAT的Redis版本过低:
- 升级UAT的Redis服务器到稳定版(如5.x或6.x),测试是否解决加载问题
6. 寻找兼容StackExchange.Redis和MySQL的中间版本
降级后MySQL失效,说明MySQL驱动(如MySqlConnector)依赖特定版本的Unsafe:
- 查看MySqlConnector的NuGet依赖说明,确认它兼容的Unsafe版本范围
- 测试StackExchange.Redis 2.5.x + System.Runtime.CompilerServices.Unsafe 4.7.x的组合,该版本组合大概率同时兼容Redis和MySQL
内容的提问来源于stack exchange,提问作者Bikash Pal
相关产品推荐
相关产品推荐

