无法加载文件或程序集'System.Data.SqlClient, Version=4.4.0.0'

33
首先,一些背景信息:
平台上安装了.NET Framework 4.7.1。我有一个类库,符合.NET Standard 2规范,以支持未来的.NET Core。现在依赖项的某些部分,即Dapper,使用System.Data.SqlClient。这个库在我的电脑上很好用,但是当我在Windows 2012服务器上部署和测试时遇到问题。特别是,在使用Dapper时出现运行时错误:Could not load file or assembly 'System.Data.SqlClient, Version=4.4.0.0, Culture=neutral, PublicKeyToken=kfddsnfsjnfs' or one of its dependencies. The system cannot find the file specified. 请注意,我首先安装了版本4.5.1.0。然后我降级到4.4.0.0并重新运行代码。现在我收到相同的错误,但这次是关于4.2.0.0的。但我似乎无法在Nuget中找到这个特定版本。之后我进行了谷歌搜索。很多。首先我尝试通过添加重绑定旧版本来添加新版本,通过添加:

appsettings.json:

{
  "dependentAssembly": {
    "assemblyIdentity": {
      "name": "System.Data.SqlClient",
      "publicKeyToken": "kfddsnfsjnfs",
      "culture": "neutral"
    },
    "bindingRedirect": {
      "oldVersion ": "4.4.0.0",
      "newVersion": "4.5.1"
    }
  }
}

和 app.config:

<dependentAssembly>
  <assemblyIdentity name="System.Data.SqlClient"  publicKeyToken="kfddsnfsjnfs"  culture="neutral" />
  <bindingRedirect oldVersion="4.4.0.0" newVersion="4.5.1.0" />
</dependentAssembly>

然而,这并没有什么区别。我还尝试了较旧版本的SqlClient和多次重新安装。我还发现有人说要仔细检查csproj文件,以确保它没有引用gac中的某些内容,但实际上它并没有:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <Authors>me</Authors>
    <Product />
    <Company />
    <GeneratePackageOnBuild>false</GeneratePackageOnBuild>
    <Version>1.0.8</Version>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="TaskMetadata.json">
      <PackagePath>TaskMetadata.json</PackagePath>
      <Pack>True</Pack>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="dapper" Version="1.50.5" />
    <PackageReference Include="itextsharp" Version="5.5.13" />
    <PackageReference Include="System.Data.SqlClient" Version="4.5.1" />
  </ItemGroup>

  <ItemGroup>
    <Folder Include="External\" />
  </ItemGroup>

</Project>

1
假设这是一个Visual Studio项目,你是否检查了“引用”节点中的引用? - absoluteAquarian
是的,实际上我有两个对 SqlClient 的引用,分别在 Dependencies>Nuget>Dapper>System.Data.SQLClient 和 Dependencies>Nuget>System.Data.SQLClient 中。它们都是 4.5.1 版本。 - Krille
不好意思,我能找到的最接近的 DLL 名称是 System.Data.SQLite。 - Krille
前往“引用”节点,然后到“添加引用...”,然后向下滚动直到找到“System.Data.SQLClient”。勾选旁边的复选框,然后关闭引用窗口。在构建项目后,您现在应该在上述文件夹中拥有正确的DLL。 - absoluteAquarian
我假设你并没有实际上使用这个公钥令牌kfddsnfsjnfs,是吗? - Lasse V. Karlsen
显示剩余3条评论
8个回答

46
每个库都在主应用程序的进程下运行。因此,主应用程序需要知道如何加载SqlClient DLL。因此,父项目(.NET 4.7.1项目)需要将SqlClient添加为引用,可以通过安装NuGet软件包或通过浏览.NET标准项目下的DLL来实现。 旧答案:该版本在NuGet中存在:https://www.nuget.org/packages/System.Data.SqlClient/4.4.0 在“程序包管理器控制台”中(确保“默认项目”下拉菜单设置正确),尝试卸载然后重新安装该特定版本:
Uninstall-Package System.Data.SqlClient
Install-Package System.Data.SqlClient -Version 4.4.0

更新:或者,在你的绑定重定向中,只需将oldVersion设置为4.2.0.0即可。


重要的是,如果您在标准项目中更新版本,则还需要更新框架项目中的版本,否则您可能会分发错误的文件。 - Kirsten

11

在两个项目中安装版本为4.8.2的软件:

Install-Package System.Data.SqlClient -Version 4.8.2


1
它确实起作用了,但我不知道为什么我们必须在两个项目中都安装。 - Hong Van Vit

9

2
你使用的是哪个版本的 .net core?奇怪的是,在 3.0 版本中它对我来说完美地工作,但是一旦我更新到 3.1 版本,就开始出现这个错误。 - stellr42
1
你是说 Microsoft.Data.SqlClient 吗? - NoWar
3
我们有一个 .Net Framework 4.6.1 组件,并将其包含在 .Net Core 3.1 api 中,因此我们需要在库和主 api 项目中都包含 'Microsoft.Data.SqlClient'。将代码从 System.Data.SqlClient 更改为 Microsoft.Data.SqlClient。同时需要在 Startup 构造函数中添加以下代码:`public Startup(IConfiguration configuration) { Configuration = configuration;// Chesare. Requerido para .net Core DbProviderFactories.RegisterFactory("Microsoft.Data.SqlClient", Microsoft.Data.SqlClient.SqlClientFactory.Instance);}` - Chesare
在 .netCore 项目中出现了“指定的不变名称 'System.Data.SqlClient' 在注册的 .NET 数据提供程序列表中未找到”的错误。 - Chesare
这个可行,你实际上可以看到它是一个.NET的汇编。 - user0123456789
显示剩余2条评论

5

我遇到了同样的问题。基本上我正在使用 .net framework 开发 WinForm 应用程序,而我的类库是 .net standard。

我尝试了十次安装和卸载 System.Data.SqlClient,但它没有起作用。

然后稍后我想到,我也在 UI 层安装了相同的引用,然后它就可以工作了。即使我在 UI 层没有任何与 Sql 交互的代码,随后又出现了另一个问题,UI 无法识别对 Dapper 的引用,我不得不在 UI 上安装 Dapper 引用。 然后一切都很好。

我真的很惊讶为什么那没有起作用。一旦你将 UI 引用到类库中时,类库应该执行所需的操作并将数据传递给 UI!


1
当我将一个解决方案移动到 .net core 6.0 中的新文件夹时,遇到了同样的问题。UI 层的项目并没有安装 System.Data.Sql.Client,也不需要它,但是在调用数据库层的 DLL 时,它却要求版本为 4.6。通过 Nuget 在 UI 项目上安装当前的 4.8 版本的 System.Data.Sql.Client,即使它从未使用过,也可以解决这个问题。 - Dan

3

尝试再次通过NuGet添加System.Data.SqlClient,尽管您可能已经作为.NET Framework的一部分手头拥有它。这个解决方案解决了我的问题。


1
我在运行单元测试时遇到了这个问题。{"无法加载文件或程序集'System.Data.SqlClient,版本=4.4.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a'。系统找不到指定的文件。":"System.Data.SqlClient,版本=4.4.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a"} System.IO.FileNotFoundException
当我安装了System.Data.SqlClient,版本=4.4.0.0时,它没有起作用。
但是,当我安装了最新版本的System.Data.SqlClient nuget包后,问题得到了解决。

1
我在Azure的一个webjobs中的控制台上遇到了这个错误。在发布配置文件中,我将配置从“debug”更改为“release”,然后它就正常工作了。

0

我在使用最新的Microsoft.Data.SqlClient时,遇到了.NET Core相关的错误,不得不更改我的DBProvider。

Microsoft.Data.SqlClient

Microsoft.Data.SqlClient.SqlConnection, Microsoft.Data.SqlClient

为了让NLog加载Microsoft.Data.SqlClient


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接