VS 构建未输出Microsoft.Data.SqlClient.SNI.dll

问题描述 投票:0回答:2

我在将最近迁移到 NetStandard2.0 的类库引入旧式 AspNet Web 应用程序项目(框架 4.7.2)时遇到问题。

更新后的程序集参考 NuGet 包 Microsoft.Data.SqlClient v5.1.0

运行时,应用程序在尝试打开 SQL 连接时生成以下错误跟踪:

“Microsoft.Data.SqlClient.TdsParser”的类型初始值设定项引发了 例外。

“Microsoft.Data.SqlClient.SNILoadHandle”的类型初始值设定项引发异常。

无法加载DLL“Microsoft.Data.SqlClient.SNI.dll”:找不到指定的模块。 (HRESULT 的异常: 0x8007007E)

果然,输出 bin 文件夹中没有 Microsoft.Data.SqlClient.SNI.dll 实例 - 下面的屏幕截图 - 但有 x64、x86 和 arm64 dll 的实例。

已尝试过的:

  • 将 NuGet 包 Microsoft.Data.SqlClient v5.1.0 包直接添加到 Web 应用程序项目中。

  • 位于此资源,建议在应用程序的 .csproj 文件中显式引用 .targets 文件(来自 Microsoft.Data.SqlClient 包),但没有详细说明如何执行此操作。

  • 找到了this question,它提出了几乎相同的问题,并尝试将以下标记合并到应用程序的.csproj文件中,但没有明显的效果或进一步的诊断输出:

    <Target Name="_CopySNIFilesToWebProjectOutputDir" AfterTargets="CopySNIFiles" Condition="'$(WebProjectOutputDir)' != ''">
      <Copy SourceFiles="@(SNIFiles)" DestinationFiles="@(SNIFiles -> '$(WebProjectOutputDir)\bin\%(RecursiveDir)%(Filename)%(Extension)')" />
    </Target>
    
  • 指定 x64 作为目标平台。没有影响。

我现在不知道进一步追求的途径。如何将 Microsoft.Data.SqlClient.SNI.dll 放入我的应用程序的 bin 文件夹中?

c# asp.net .net-standard-2.0 microsoft-data-sqlclient
2个回答
1
投票

我们遇到了类似的问题,并使用您第三点的解决方案解决了它。我们的设置是 ASP.NET Framework 4.7.2 项目,依赖于 .Net Standard 2.0 项目(使用 Serilog 记录到 MsSql)。

  <Target Name="CopySNIFilesToOutputPath" AfterTargets="CopySNIFiles" Condition="'$(WebProjectOutputDir)' != ''">
    <Copy SourceFiles="@(SNIFiles)" DestinationFiles="@(SNIFiles -> '$(WebProjectOutputDir)\bin\%(RecursiveDir)%(Filename)%(Extension)')" />
  </Target>

0
投票

我在 net 4.8 WinForms 项目中遇到了同样的问题,通过添加最新的 System.Buffers nuget 修复了该问题。

--历史

我将winforms和asp.net常用的一组库从.net 4.8转换为标准2.0,这需要将System.Data.SqlClient替换为Microsoft.Data.SqlClient。

Winforms 然而仍然是 4.8。它在本地可以正常运行,但安装后却不能。打开连接后,触摸属性上的任何内容,例如连接属性、连接状态等,都会抛出未引用的对象实例...异常。

我添加了上述想法(修改了路径)以将 SNI 工件包含在安装程序的构建中,但这没有帮助。
因此,我手动将所有 Microsoft.*.dll 程序集复制到本地计算机上已安装的版本。然后它给出了 Systems.buffer 程序集版本错误。 虽然本地 bin 和安装的程序文件(甚至修订版和补丁部分)上的 System.Buffers 版本相同,但文件大小不同(认真的 Microsoft,遵循最佳实践)。

因此,我在我的 winforms 项目中添加了最新的 System.Buffers nuget,创建了一个新的安装程序构建(以清除我的实验),并在本地计算机上进行了新安装,现在可以工作了。

这需要大量的尝试和错误。我还注意到 System.Tuples.Values(是的,就是那个)具有不同的文件大小。因此,用于 winforms 的 Visual Studio 2022 中使用的本地构建具有一些项目部署程序所没有的秘密武器。我还注意到 vs 2022 中的本地项目 bin 使用完整版本的 Microsoft.Data.SqlClient(大约 2 MB),而安装程序则拉取了 72kb 版本(来自目标)。

© www.soinside.com 2019 - 2024. All rights reserved.