Azure 函数运行时异常,系统数据 sqlclient 异常的类型初始化程序,无法加载 DLL 'sni.dll'

Azure functions runtime exception, the type initializer for system data sqlclient excetion, Unable to load DLL 'sni.dll'

我正在使用 aspnet core 3.0 和 azure function v3-preview with system.data.sqlclient version 4.7.0 当我尝试 运行 azure 函数(在服务队列触发器和时间触发器上)时,它给出以下错误:

'System.Data.SqlClient.TdsParser' 的类型初始值设定项引发异常。 'System.Data.SqlClient.SNILoadHandle' 的类型初始值设定项抛出异常。无法加载 DLL 'sni.dll' 或其依赖项之一:找不到指定的模块。

我尝试了以下链接中的解决方案,但没有奏效: 1. 2.https://github.com/Azure/app-service-announcements-discussions/issues/9

我尝试将 "Microsoft.Data.SqlClient" 用于 aspnetcore 3.0 但是当 运行在 Azure 门户上使用 Azure 函数时仍然出现同样的异常。

请帮忙!

这是csproj文件

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.0</TargetFramework>
    <AzureFunctionsVersion>v3-preview</AzureFunctionsVersion>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="1.0.30-beta2" />
    <PackageReference Include="runtime.native.System.Data.SqlClient.sni" Version="4.6.0" />
    <PackageReference Include="System.Data.SqlClient" Version="4.7.0" />
  </ItemGroup>
  <ItemGroup>
    <None Update="host.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Update="local.settings.json">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <CopyToPublishDirectory>Never</CopyToPublishDirectory>
    </None>
  </ItemGroup>
  <!-- For publish --><!--
  <ItemGroup>
    <None Include="$(USERPROFILE)\.nuget\packages\microsoft.data.sqlclient.0.19249.1\runtimes\win\lib\netcoreapp2.1\microsoft.Data.SqlClient.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
  --><!-- For local debug --><!--
  <Target Name="CopyToBin" BeforeTargets="Build">
    <Copy SourceFiles="$(USERPROFILE)\.nuget\packages\microsoft.data.sqlclient.0.19249.1\runtimes\win\lib\netcoreapp2.1\microsoft.Data.SqlClient.dll" DestinationFolder="$(OutputPath)\bin" />
  </Target>-->

  <ItemGroup>
    <None Include="$(USERPROFILE)\.nuget\packages\system.data.sqlclient.7.0\runtimes\win\lib\netcoreapp2.1\system.Data.SqlClient.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
  </ItemGroup>
  <Target Name="CopyToBin" BeforeTargets="Build">
    <Copy SourceFiles="$(USERPROFILE)\.nuget\packages\system.data.sqlclient.7.0\runtimes\win\lib\netcoreapp2.1\system.Data.SqlClient.dll" DestinationFolder="$(OutputPath)\bin" />
  </Target>

</Project>

请确保您的 azure 函数满足此 link 中的这些条件。

这里是其他人提供的workaround,将以下内容添加到您的.csproj:

<Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="copy $(OutDir)$(ProjectName).deps.json $(OutDir)bin\function.deps.json" />
  </Target>
  <Target Name="PostPublish" BeforeTargets="Publish">
    <Exec Command="copy $(PublishDir)$(ProjectName).deps.json $(PublishDir)bin\function.deps.json" />
  </Target>

通过在 csproj 文件中添加以下代码,它对我有用:


<Target Name="PostPublish" BeforeTargets="Publish">
  <Exec Command="move $(PublishDir)\runtimes $(PublishDir)\bin" />
</Target>

这一行应该解决这个问题: <Exec Command="move $(PublishDir)\runtimes $(PublishDir)\bin" />

参考:github