.NET Framework 4.8中MySqlConnector+Dapper遇TypeLoadException求助
我有一段代码在两个不同解决方案中使用,其中一个可正常运行,另一个却报错。代码如下:
protected internal static int SomeMethod(string x,string y) { int result; using (MySqlConnection connectionMysql = new MySqlConnection(ConnectionString)) { connectionMysql.Open(); DynamicParameters parameters = new DynamicParameters(); parameters.Add("@x", x); parameters.Add("@y", y); parameters.Add("@z", dbType: DbType.Int16, direction: ParameterDirection.Output); connectionMysql.Execute("SP", parameters, commandType: CommandType.StoredProcedure); result = parameters.Get<int>("@z"); } return result; }
ConnectionString已通过独立应用验证有效。问题出在connectionMysql.Open()调用时,抛出异常:
System.TypeLoadException: 'Could not load type
'System.Diagnostics.Activity' from assembly
'System.Diagnostics.DiagnosticSource, Version=4.0.1.0,
Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'.'
当前项目引用的System.Diagnostics.DiagnosticSource版本为7.0.0.2,已存在于执行目录,但运行时却查找4.0.1.0版本。该项目是基于.NET Framework 4.8.0的C#类库,使用的NuGet包包括Dapper、MySqlConnector、EntityFramework、System.Data.Sqlite且均为最新版本。
添加程序集绑定重定向:在调用该类库的主项目(控制台、Web应用等)的
app.config或web.config中加入绑定重定向配置,让运行时将对4.0.1.0版本的请求重定向到7.0.0.2版本。配置代码如下:<runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-7.0.0.2" newVersion="7.0.0.2" /> </dependentAssembly> </assemblyBinding> </runtime>注意:类库自身的配置文件不会生效,必须在主项目的配置中添加。
排查NuGet依赖冲突:打开NuGet包管理器控制台,执行
Get-Package -ProjectName 你的项目名查看所有包的依赖链,确认是否有其他包强制依赖System.Diagnostics.DiagnosticSource 4.0.1.0。如果有,优先更新该依赖包到兼容新版本的版本;若无法更新,可考虑降级System.Diagnostics.DiagnosticSource到4.6.x系列(该版本包含System.Diagnostics.Activity类型)。清理重建项目:删除项目的
bin和obj目录,执行dotnet nuget locals all --clear清除NuGet缓存,然后重新还原NuGet包并生成项目,确保输出目录中的程序集版本正确。确认程序集引用设置:右键项目→管理NuGet程序包,确认System.Diagnostics.DiagnosticSource的版本为7.0.0.2;再右键该引用→属性,确保“复制本地”设置为
True,保证程序集被复制到输出目录。
内容的提问来源于stack exchange,提问作者Mostafa Tarek Yassien

