旧项目无法安装Serilog.Sinks系列NuGet包,遇元数据及卸载异常求助
我之前维护旧.NET项目时,正好碰到过和你一模一样的Serilog NuGet问题——明明已经装好了Serilog 2.6.0且代码能正常运行,但安装Sink包(比如Serilog.Sinks.MSSqlServer)时卡元数据错误,卸载Serilog又报空引用异常,折腾了好一阵才搞定,给你几个亲测有效的解决步骤:
先清理NuGet缓存,大概率能解决元数据问题
本地NuGet缓存损坏是这类元数据报错的头号原因。打开命令提示符(或者Visual Studio里的Package Manager Console),运行下面的命令清空所有缓存:dotnet nuget locals all --clear如果你用的是基于
packages.config的老项目,也可以用这个命令:nuget locals all -clear清理完成后重启Visual Studio,再尝试安装Serilog.Sinks.MSSqlServer,很多时候这一步就能直接解决问题。
手动修复项目依赖配置文件
如果缓存清理没用,那大概率是项目的依赖配置文件出现了损坏:- 先关闭Visual Studio,找到你的项目配置文件——老项目一般是
packages.config,新一点的SDK风格项目是.csproj - 打开文件检查Serilog相关的条目:
- 若是
packages.config,确保Serilog的条目格式正确,没有多余的错误属性:<package id="Serilog" version="2.6.0" targetFramework="net461" /> - 若是
.csproj,找到对应的PackageReference节点,确认版本和路径没有异常:<PackageReference Include="Serilog" Version="2.6.0" />
- 若是
- 保存文件后重新打开项目,再尝试安装Sink包。
- 先关闭Visual Studio,找到你的项目配置文件——老项目一般是
用命令行强制卸载Serilog,解决空引用错误
卸载时的空引用错误,一般是NuGet包管理器的内部状态紊乱导致的,别用Visual Studio的UI卸载,改用命令行强制操作:- 打开项目所在目录的命令提示符
- 若是SDK风格项目(使用PackageReference),运行:
dotnet remove package Serilog - 若是旧的
packages.config项目,运行:nuget uninstall Serilog -Version 2.6.0 -ProjectName 你的项目名称
卸载完成后,再重新安装Serilog 2.6.0,之后再安装对应的Sink包就能正常进行了。
检查NuGet源是否正常
偶尔也会遇到NuGet源不稳定导致元数据拉取失败的情况。打开Visual Studio的NuGet包管理器设置,检查你使用的源(比如官方nuget.org)是否能正常访问,要是配置了私有源可以暂时禁用,只用官方源试试。
额外提一句:如果项目允许的话,尽量把Serilog升级到2.12.x这类更高的稳定版本,新版本的NuGet包结构更健壮,这类奇怪的元数据和卸载问题会少很多,升级前记得做好功能测试就行。
内容的提问来源于stack exchange,提问作者qhyseni

