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

ste*_*r42 4 asp.net-core asp.net-core-3.1

我有一个引用 .net 框架库的 .net core 项目。框架库用于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.
Run Code Online (Sandbox Code Playgroud)

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

Ian*_*emp 6

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


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

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

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

由于 SqlClient 是独立于其 NuGet 包开发的,因此该库的程序集版本与其包的版本不同,并且事实上这些版本不能仅通过检查来关联。确定哪个版本对应于哪个包的唯一方法是手动检查 NuGet 包版本并将它们与这些包中包含的 DLL 的程序集版本进行比较 - 我已经在下表中完成了这项艰苦的工作,因此您不必这样做不必。其他名称空间和包可能也会发生类似的疯狂情况。

然而!

微软通过元包让上述痛苦变得完全不必要Microsoft.Windows.Compatibility。如果你将其安装到你的Core/Standard项目中,你的Framework项目所依赖的所有包的正确版本都会被拉入。不仅如此,如果你改变了你的Framework项目中的版本,依赖包的相应更新版本也会被拉进来。下次构建时将被拉入

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

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

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

| NuGet 包版本 | 组装版| 文件版本 |
|------------------------|------------------|------ ----------|
| 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 |