You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:22:35