C#报”TypeLoadException”的原因以及解决办法

  • Post category:C#

原因:

TypeLoadException是.NET框架的一种异常类型,通常由于加载程序集时出现类型依赖关系无法得到满足所致。在.NET程序开发中,常常会涉及到使用第三方组件,特别是当要在同一个解决方案中同时使用多个版本的同一组件时,就有可能引发类型加载问题。

解决办法:

  1. 绑定重定向

此方法可以在应用程序配置文件中设置,指示中间件查找程序集的替代版本,并用它们替换程序集中使用的版本。

<dependentAssembly>
  <assemblyIdentity name="MyAssembly"
       publicKeyToken="32ab4ba45e0a69a1"
       culture="en-us" />
  <bindingRedirect oldVersion="1.0.0.0-2.0.0.0"
       newVersion="3.0.0.0"/>
</dependentAssembly>
  1. 重新部署程序

当在第三方组件中出现类型加载异常时,可以尝试删除组件并重新部署它。

在互联网上查找相关的错误信息和解决方案也是非常有帮助的,因为这些错误等通常会有广泛的解决方案和经验分享。

例如:

假设我们的项目依赖两个开源库Newtonsoft.Json和RestSharp,我们使用RestSharp访问一个API,随后我们又新增使用了RestSharp提供的decompression功能,并添加了相关实例化代码。在这种情况下,如果系统中已经存在了一个低版本的RestSharp(没有decompression功能),我们就会遇到TypeLoadException,因为我们的程序引用的是最新版本的RestSharp,但我们的代码却使用了之前版本的API。

解决方法

可以使用绑定重定向来修复这个问题,可以在应用程序配置文件中设置,指示中间件查找程序集的替代版本,并用它们替换程序集中使用的版本。在这个例子中,我们应该在应用程序的app.config文件中添加下列内容:

<dependentAssembly>
    <assemblyIdentity name="RestSharp" publicKeyToken="598062e77f915f75" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-105.1.0.0" newVersion="106.0.0.0" />
</dependentAssembly>

另外,也可以删除系统中较旧的版本并重新安装最新版来解决问题。