【问题标题】: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 中的发布(认为它会拾取复制的程序集),但这不起作用。所以我走在了正确的轨道上。感谢您的提示!

标签: c# mysql amazon-web-services .net-core aws-lambda


【解决方案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

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

      【讨论】:

        猜你喜欢
        • 2020-04-25
        • 2017-01-12
        • 2018-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多