从 .net core 3.0 迁移到 3.1 导致缺少 System.Data.SqlClient 程序集错误

Migrating from .net core 3.0 to 3.1 causes missing System.Data.SqlClient assembly error

我有一个引用 .net 框架库的 .net 核心项目。框架库使用 System.Data.SqlClient 访问数据库。当核心项目在 dotnet core 3.0 上 运行 时,一切正常。但是,我刚刚迁移到 3.1,现在出现以下异常:

FileNotFoundException: Could not load file or assembly 'System.Data.SqlClient, Version=4.6.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.

我尝试在框架库中通过 Nuget 显式安装 System.Data.SqlClient v.4.6.0,但我仍然遇到同样的异常。

您可能不再受困于此,但对我来说,将 System.Data.SqlClient 从 4.7 升级到 4.8.1 解决了这个问题。

我之前曾尝试卸载并重新安装 4.7,但没有成功。

tl;dr:将 Microsoft.Windows.Compatibility 元包安装到您的 Core/Standard 项目中以解决此问题。


您在错误消息中看到的版本是 .NET Framework 项目期望的 程序集版本。这对应于该项目编译所针对的 .NET Framework 版本附带的版本。

由于 .NET Core(和 Standard)的耦合度远不如 Framework,许多以前属于 Framework 的命名空间已分解为自己的 NuGet 包。 System.Data.SqlClient 是其中之一,所以答案是将该包的适当版本安装到您​​的 .NET Core/Standard 项目中……对吗?

是的,但这不是最佳答案。

由于 SqlClient 是独立于其 NuGet 包开发的,因此该库的汇编版本与其包的版本不同,实际上这些版本不能简单地通过检查它们来关联。找出哪个版本对应哪个包的唯一方法是手动检查 NuGet 包版本并将它们与这些包中包含的 DLL 的程序集版本进行比较 - 我在下面做了艰苦的工作 table所以你不必。其他名称空间和包可能会发生类似的疯狂。

不过!

Microsoft 已通过 Microsoft.Windows.Compatibility 元包消除了上述痛苦完全没有必要。如果你将它安装到你的 Core/Standard 项目中,你的框架项目所依赖的所有包的正确版本 将被引入。不仅如此,如果你更改版本您的 Framework 项目,相关包的相应更新版本将在您下次构建时拉入

这比手动引用您需要的特定包(例如 System.Data.SqlClient)要好得多,因为如果您安装这些包的特定版本并更改您的框架版本,运行时又会出现问题。只是为了痛苦而不必要的痛苦。

所以,安装 Microsoft.Windows.Compatibility,告别版本控制地狱!

System.Data.SqlClient 个版本的参考列表

| NuGet package version | Assembly version | File version   |
|-----------------------|------------------|----------------|
|                 4.8.1 |          4.6.1.1 | 4.700.20.6702  |
|                 4.8.0 |          4.6.1.0 | 4.700.19.56404 |
|                 4.7.0 |          4.6.0.0 | 4.700.19.46214 |
|                 4.6.1 |          4.5.0.1 | 4.6.27618.01   |
|                 4.6.0 |          4.5.0.0 | 4.6.27110.04   |
|                 4.5.3 |          4.4.0.1 | 4.6.28516.10   |
|                 4.5.1 |          4.4.0.0 | 4.6.26606.05   |
|                 4.5.0 |          4.4.0.0 | 4.6.26515.06   |
|                 4.4.3 |          4.2.0.2 | 4.6.26212.01   |
|                 4.4.2 |          4.2.0.1 | 4.6.25921.02   |
|                 4.4.1 |          4.2.0.1 | 4.6.25706.01   |
|                 4.4.0 |          4.2.0.0 | 4.6.25519.03   |
|                 4.3.1 |          4.1.1.1 | 4.6.25220.01   |
|                 4.3.0 |          4.1.1.0 | 4.6.24705.01   |
|                 4.1.0 |          4.1.0.0 | 1.0.24212.01   |