我在将最近迁移到 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 文件夹中?
我们遇到了类似的问题,并使用您第三点的解决方案解决了它。我们的设置是 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>
我在 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 版本(来自目标)。