AWS Lambda、.Net Core 和 MySql:无法加载文件或程序集 'System.Diagnostics.TraceSource,版本 = 4.0.0.0

Posted

技术标签:

【中文标题】AWS Lambda、.Net Core 和 MySql:无法加载文件或程序集 \'System.Diagnostics.TraceSource,版本 = 4.0.0.0【英文标题】:AWS Lambda, .Net Core, & MySql: Could not load file or assembly 'System.Diagnostics.TraceSource, Version=4.0.0.0AWS Lambda、.Net Core 和 MySql:无法加载文件或程序集 'System.Diagnostics.TraceSource,版本 = 4.0.0.0 【发布时间】:2017-06-07 06:29:35 【问题描述】:

我正在构建通过 RDS 中的 mysql 访问数据的 lambda 微服务。我的本地单元测试工作正常,但是当我发布到 AWS 时,我收到以下错误:

    
  "TypeName": "MySql.Data.MySqlClient.MySqlTrace",
  "Message": "The type initializer for 'MySql.Data.MySqlClient.MySqlTrace' threw an exception.",
  "Data": ,
  "InnerException": 
    "Message": "Could not load file or assembly 'System.Diagnostics.TraceSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified.\n",
    "FileName": "System.Diagnostics.TraceSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a",
    "Data": ,
    "InnerException": 
      "Message": "'System.Diagnostics.TraceSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' not found in the deployment package or in the installed Microsoft.NETCore.App.",
      "FileName": null,
      "Data": ,
      "InnerException": null,
      "StackTrace": "   at AWSLambda.Internal.Bootstrap.LambdaAssemblyLoadContext.Load(AssemblyName assemblyName)\n   at System.Runtime.Loader.AssemblyLoadContext.ResolveUsingLoad(AssemblyName assemblyName)\n   at System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName)",
      "HelpLink": null,
      "Source": "Bootstrap",
      "HResult": -2147024894
    ,
    "StackTrace": null,
    "HelpLink": null,
    "Source": null,
    "HResult": -2147024894
  ,
  "StackTrace": "   at MySql.Data.MySqlClient.MySqlTrace.LogError(Int32 id, String msg)\n   at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()\n   at MySql.Data.MySqlClient.MySqlPool.GetConnection()\n   at MySql.Data.MySqlClient.MySqlConnection.Open()\n   at HealthStats.Functions.GetLocationTypes(APIGatewayProxyRequest request, ILambdaContext context)",
  "HelpLink": null,
  "Source": "MySql.Data",
  "HResult": -2146233036

这是我的 project.json 文件。我尝试将System.Diagnostics.TraceSource 库添加为标准项目依赖项(未显示)和框架依赖项(如下所示)。我的想法可能是在发布期间它没有添加程序集,因为我没有在我的代码中直接使用 TraceSource。但是,这两种尝试都没有解决问题:


  "version": "1.0.0-*",
  "buildOptions": 
    "emitEntryPoint": false
  ,

  "dependencies": 
    "Amazon.Lambda.APIGatewayEvents": "1.0.1",
    "Amazon.Lambda.Core": "1.0.0",
    "Amazon.Lambda.Serialization.Json": "1.0.1",
    "Amazon.Lambda.Tools": 
      "type": "build",
      "version": "1.1.0-preview1"
    ,
    "Microsoft.NETCore.App": 
      "type": "platform",
      "version": "1.0.0"
    ,
    "MySql.Data": "7.0.6-IR31"
  ,

  "tools": 
    "Amazon.Lambda.Tools" : "1.1.0-preview1"
  ,

  "frameworks": 
    "netcoreapp1.0": 
      "dependencies": 
        "System.Diagnostics.TraceSource": "4.0.0"
      ,
      "imports": [
        "dnxcore50",
        "portable-net45+win8"
      ]
    
  

有什么想法吗?

【问题讨论】:

您最终找到了答案吗?我正在做同样的事情,除了我将 ef core 与 mysql 的 sapientguardian nuget 包一起使用。 刚刚找到解决类似问题的方法。我要做的是dotnet publish,然后将 dll 从 \publish\runtimes\unix\lib\netstandard1.3 子文件夹复制到发布文件夹。压缩发布文件夹的内容(不包括运行时文件夹)并将其上传到 lambda。让我知道它是否适合您@xeon 和@SnOrfus @JonPeterson 如果您想将其发布为答案,我会投赞成票。它对我有用。我曾尝试将程序集复制到发布文件夹中,然后使用 Visual Studio 中的发布(认为它会拾取复制的程序集),但这不起作用。所以我走在了正确的轨道上。感谢您的提示! 【参考方案1】:

我在 lambda 结果中看到了类似的问题:

“MySql.Data.MySqlClient.MySqlTrace”的类型初始化器抛出异常。:TypeInitializationException 在 MySql.Data.MySqlClient.MySqlTrace.LogError(Int32 id,字符串 msg) 在 MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() 在 MySql.Data.MySqlClient.MySqlPool.GetConnection() 在 MySql.Data.MySqlClient.MySqlConnection.Open() 在 AWSLambda2.Function.FunctionHandler(SNSEvent 输入,ILambdaContext 上下文) 在 lambda_method(Closure , Stream , Stream , ContextInfo )

'System.Diagnostics.TraceSource, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 在部署包或安装的 Microsoft.NETCore.App 中找不到:FileNotFoundException 在 AWSLambda.Internal.Bootstrap.LambdaAssemblyLoadContext.Load(AssemblyName assemblyName) 在 System.Runtime.Loader.AssemblyLoadContext.ResolveUsingLoad(AssemblyName 程序集名称) 在 System.Runtime.Loader.AssemblyLoadContext.Resolve(IntPtr gchManagedAssemblyLoadContext, AssemblyName assemblyName)

对我有用的是使用 dotnet publish 手动发布项目,然后在已发布的文件夹中导航到 .\publish\runtimes\unix\lib\netstandard1.3 并将在那里发布的 dll 复制到 .\publish。将它们放入该文件夹后,我压缩了发布文件夹的内容,不包括运行时子文件夹,并将其上传到 lambda。

我对为什么会发生这种情况的工作理论是因为 dotnet publish 正在发布,好像智能系统正在使用结果,但是我认为 lambda 正在将程序集加载到另一个上下文中了解在子文件夹中查找依赖项。

【讨论】:

+1 SapientGuardian.EntityFrameworkCore.MySql 依赖于 System.Diagnostics.TraceSource,它最终不会出现在已发布的文件夹中,并且在 lambda 中运行时找不到它。这对我有用。再次感谢乔恩 感谢您提供此解决方法。关于永久解决方案的任何想法?我的目标是为 C# + Lambda + MySQL 构建一个开发流程。 @xeon 你和我。对我来说不幸的是,我的 AWS VS 工具包无法正常工作(联合用户的问题,叹息)。您可以尝试@dohmoose 和@alduar 的答案,将文件复制为dotnet publish 的一部分。请注意,这些答案的假设是您在 Windows 上发布 - 不过我确信在其他平台上也有等效的复制方式。【参考方案2】:

最简单的解决方案是编辑 project.json 文件。 添加预发布事件

“脚本”: “预发布”:[“xcopy ./bin/Release/netcoreapp1.0/publish/runtimes/unix/libnetstandard1.3/System.Diagnostics.TraceSource.dll ./bin/Release/”], "postpublish": ["dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%"] 这会导致在 AWS 发布向导复制它之前复制引用。

问候

阿尔多弗洛雷斯

【讨论】:

【参考方案3】:

类似于@alduar,但我认为将其放在发布后更合适,因为 dll 在首次构建时不会出现。 而且我认为它应该被复制到发布目录。 请注意,这些文件路径适用于 windows。

    "scripts": 
       "postpublish": [ "xcopy bin\\Release\\netcoreapp1.0\\publish\\runtimes\\unix\\lib\\netstandard1.3\\System.Diagnostics.TraceSource.dll bin\\Release\\netcoreapp1.0\\publish\\" ]
    ,

【讨论】:

【参考方案4】:

运行以下命令后我遇到了同样的问题。

dotnet publish src\Lambda.csproj -c Release

起初我像 Jon Peterson 建议的那样,通过从 runtimes\unix\lib\netstandard1.3 复制文件来修复它。

我找到了一个看起来更干净的解决方案。现在我只运行以下命令。

dotnet publish src\Lambda.csproj -c Release -r linux

这将创建一个包含所有正确文件的发布文件夹。

【讨论】:

以上是关于AWS Lambda、.Net Core 和 MySql:无法加载文件或程序集 'System.Diagnostics.TraceSource,版本 = 4.0.0.0的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda Dot Net Core 3.1 在使用 Aspose Cells for .Net 时抛出 gdip 异常

是否可以使用 .Net Core 2.2 在 AWS Lambda 上使用 Kinesis FireHose 执行 PutRecord?

DotNet Core:AWS Lambda 解析器

AWS Lambda不支持连接到专用租赁VPC中的资源

AWS Lambda - 调用另一个 lambda 函数的方法

使用从 S3 事件调用的 AWS Lambda 触发 Airflow DAG