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?