VS2019 NuGet包管理器无法还原System.Data.SQLite.Core的Interop dll
问题根因
这是使用packages.config格式管理System.Data.SQLite.Core包的.NET Framework项目的典型问题,核心原因如下:
SQLite.Interop.dll是非托管依赖项,不直接加入项目的托管引用列表,该文件的复制逻辑是通过NuGet包内置的MSBuild构建目标,在构建阶段根据目标CPU架构自动拷贝到输出目录- 常规的「还原NuGet包」操作仅校验本地是否存在对应版本的NuGet包,不会自动将包的构建目标重新注册到项目配置中,因此还原后直接构建时,复制Interop文件的步骤不会执行,导致输出目录缺失该文件
- 执行
Update-Package –reinstall命令时会重新执行包的完整安装流程,将对应的构建目标重新写入项目文件,因此后续构建可以正常复制文件
解决方案
方案1:修复项目构建目标注册(推荐)
- 右键项目选择「卸载项目」,再次右键点击卸载后的项目选择「编辑.csproj文件」
- 确认文件底部存在以下导入节点,若缺失则手动补充,注意将代码中的
[你的包版本号]替换为实际安装的System.Data.SQLite.Core版本:
<Import Project="..\packages\System.Data.SQLite.Core.[你的包版本号]\build\net4x\System.Data.SQLite.Core.targets" Condition="Exists('..\packages\System.Data.SQLite.Core.[你的包版本号]\build\net4x\System.Data.SQLite.Core.targets')" />
- 保存文件后重新加载项目,后续构建时就会自动执行Interop文件的复制逻辑,无需每次重新安装包
方案2:显式托管Interop文件
如果不想依赖NuGet包的构建目标,可以手动管理依赖文件:
- 从本地NuGet包缓存的
System.Data.SQLite.Core.[版本号]\build\net4x\目录下,取出x86和x64架构的SQLite.Interop.dll文件 - 在项目中新建
lib\x86和lib\x64两个文件夹,分别放入对应架构的dll文件 - 分别选中两个dll文件,右键打开属性面板,将「生成操作」设置为「内容」,「复制到输出目录」设置为「如果较新则复制」
- 提交代码时将这两个文件一并提交到Git仓库,后续克隆后构建会自动复制到输出目录
方案3:调整NuGet全局配置
在解决方案根目录新建/修改nuget.config文件,添加以下配置,让构建时自动执行包的目标注册逻辑:
<configuration> <packageRestore> <add key="automaticallyRunPackageRestoreOnBuild" value="True" /> </packageRestore> </configuration>
如果项目切换为PackageReference格式管理NuGet包,不需要额外配置即可自动处理该依赖的复制逻辑。
内容的提问来源于stack exchange,提问作者JNygrenLT
相关产品推荐
相关产品推荐

