【问题标题】:Fixing PlatformNotSupportedException when referencing System.Data.SqlClient from C# Azure Function从 C# Azure 函数引用 System.Data.SqlClient 时修复 PlatformNotSupportedException
【发布时间】:2017-12-08 17:00:13
【问题描述】:

我在 Windows 10 环境中使用 netstandard2.0 的目标框架在 C# 中创建一个 Azure 函数。该函数调用另一个类库中的一个方法,该方法创建一个 SqlConnection 实例。当我运行该函数时,出现以下异常:

Microsoft.Azure.WebJobs.Host.FunctionInvocationException:异常 执行功能时:Functions.RefreshImages ---> System.Reflection.TargetInvocationException : 异常已发生 由调用的目标抛出。 ---> System.PlatformNotSupportedException:System.Data.SqlClient 不是 本平台支持。在 System.Data.SqlClient.SqlConnection..ctor(String connectionString)......

显然 SqlConnection 在 Windows 上受支持,所以我认为这里还有其他事情发生。

【问题讨论】:

  • 我在 Windows 服务(在 .net 框架中)中引用 .netstandard 库时遇到了类似的问题。我还必须将 System.Data.SqlClient nuget 引用添加到 Windows 服务项目以使其工作。将 .netstandard 库转换为 nuget,然后引用它似乎也有效,并且似乎是一种更好的方法。我现在正在调查。

标签: c# azure-functions .net-standard system.data


【解决方案1】:

看来这和loading a SQL connection via reflection in .NET core有关(你在netstandard2.0上运行但原理应该还是一样的)。

【讨论】:

  • 关于我需要进行哪些更改的任何指示?该库也是 netstandard2.0,可以从 ASP.NET Core 网站调用,没有问题。
  • 嗯,如果库在 .NET Core 网站上没有问题,那确实令人困惑。如果这只是 Azure Functions 上的一个问题,那么它可能是我们如何管理依赖项的问题,正如上面的 GitHub 问题所暗示的那样。我将删除我的答案中暗示图书馆有问题的部分。如果您使用 netstandard2.0 以外的目标框架创建函数,这是否有效?
【解决方案2】:

当使用 SqlConnection 的 .Net 标准库通过反射动态加载时会发生这种情况。 .Net 标准库通常会引用System.Data.SqlClient,这似乎是一个没有实际实现的虚拟库。它显然确保了该库将在所有平台上编译,包括那些没有注册表的平台以及真正的 SqlClient 实现所依赖的其他平台特定的东西。

我能找到的最简单的解决方案是在宿主应用程序(动态加载 .Net 标准库的 .Net 核心应用程序)中添加对 Microsoft.Data.SqlClient NuGet 包的引用。

您可能会在解决方案资源管理器中看到一个小的黄色警告感叹号图标,因为 Visual Studio 认为您没有使用该库,并且如果您使用“删除未使用的引用”功能,它还会建议删除该包。 PropertyGrid 中有一个抑制警告的功能,但我无法确定应该填写 wat 编号,因为编译时警告不会出现在错误列表中...

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2021-01-08
    • 2018-06-19
    • 1970-01-01
    相关资源
    最近更新 更多