.NET Core 3.1 - 组件依赖解析失败 - AWS Mock Lambda 测试工具

Ali*_*son 10 c# aws-lambda .net-core-3.1

我创建了一个新的 AWS Lambda .NET Core 3.1 项目,然后使用 AWS Lambda 测试工具运行它,然后我按预期得到了这个页面:

在此处输入图片说明

但是,如果我安装这些软件包之一:

Microsoft.EntityFrameworkCore.SqlServer

Microsoft.Data.SqlClient

当我运行时,出现此错误并且无法打开测试页面:

AWS .NET Core 3.1 Mock Lambda Test Tool (0.10.0)
Unknown error occurred causing process exit: Dependency resolution failed for component C:\Users\siri\repos\bolao-futebol\website-core\AWSLambda1\bin\Debug\netcoreapp3.1\AWSLambda1.dll with error code -2147450740. Detailed error: Error:
An assembly specified in the application dependencies manifest (AWSLambda1.deps.json) was not found:
package: 'runtime.win-x64.runtime.native.System.Data.SqlClient.sni', version: '4.4.0'
path: 'runtimes/win-x64/native/sni.dll'

at System.Runtime.Loader.AssemblyDependencyResolver..ctor(String componentAssemblyPath)
at Amazon.Lambda.TestTool.Runtime.LambdaAssemblyLoadContext..ctor(String lambdaPath) in C:\codebuild\tmp\output\src142363207\src\Tools\LambdaTestTool\src\Amazon.Lambda.TestTool\Runtime\LambdaAssemblyLoadContext.cs:line 28
at Amazon.Lambda.TestTool.Runtime.LocalLambdaRuntime.Initialize(String directory, IAWSService awsService) in C:\codebuild\tmp\output\src142363207\src\Tools\LambdaTestTool\src\Amazon.Lambda.TestTool\Runtime\LocalLambdaRuntime.cs:line 71
at Amazon.Lambda.TestTool.Runtime.LocalLambdaRuntime.Initialize(String directory) in C:\codebuild\tmp\output\src142363207\src\Tools\LambdaTestTool\src\Amazon.Lambda.TestTool\Runtime\LocalLambdaRuntime.cs:line 46
at Amazon.Lambda.TestTool.TestToolStartup.Startup(String productName, Action`2 uiStartup, String[] args, RunConfiguration runConfiguration) in C:\codebuild\tmp\output\src142363207\src\Tools\LambdaTestTool\src\Amazon.Lambda.TestTool\TestToolStartup.cs:line 77
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我有一个带有此包的 .NET Core 2.1 Lambda 项目,它运行良好,但仅在 .NET Core 3.1 中失败。

下面是我的 .csproj,以防有人想尝试。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
    <AWSProjectType>Lambda</AWSProjectType>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Amazon.Lambda.Core" Version="1.1.0" />
    <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="1.0.0" />
    <PackageReference Include="Amazon.Lambda.SQSEvents" Version="1.1.0" />
    <PackageReference Include="Amazon.Lambda.AspNetCoreServer" Version="5.0.0" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.0" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

这可以很好地部署在 AWS Lambda 上,它只会在本地使用模拟工具运行时失败。

删除Microsoft.EntityFrameworkCore.SqlServer使其再次工作。


这也是不久前发布在 github 上的,我希望其他人遇到了这个问题并进行了修复。

小智 29

您能否尝试为我做实验,并在您的 csproj 文件中添加CopyLocalLockFileAssemblies值为的属性,true看看这是否会改变您的行为?

这是一个完整的 csproj 文件示例。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
    <AWSProjectType>Lambda</AWSProjectType>
    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Amazon.Lambda.Core" Version="1.1.0" />
    <PackageReference Include="Amazon.Lambda.Serialization.SystemTextJson" Version="1.0.0" />
    <PackageReference Include="System.Data.SqlClient" Version="4.8.1" />
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

  • 是的,添加 `CopyLocalLockFileAssemblies` 是有效的。我的理解是[这会将所有nuget包DLL添加到输出(bin)文件夹中](/sf/ask/3068634691/ -nuget-references-to-the-build-output),但我仍然不清楚为什么这只是“System.Data.SqlClient”而不是其他包的问题。 (2认同)

Pus*_*ahu 5

当我尝试使用 Terraform 将我的 AWS lambda 函数部署到 AWS 时,我遇到了同样的问题。

将此属性添加到我的 lambda 函数 .csproj 文件修复了该问题。它允许将插件所需的所有 nuget 包依赖项复制到输出目录 -

<PropertyGroup>
  <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)