Skip to content

如何解决程序集无法加载的问题

问题描述

开发服务端命令或中间件时,引人了第三方包,开发和编译时都没有问题,但是在执行这个服务端命令时,会报以下错误

Could not load file or assembly 'RestSharp, Version=110.1.0.0, Culture=neutral, PublicKeyToken=598062e77f915f75'. Could not find or load a specific file. (0x80131621)

问题调查

出现这个错误,通常是因为第三方库中使用 DLL 文件在活字格服务器中也被使用了,而活字格服务器使用的DLL版本却低于类库中引用的版本。例如问题描述中的例子。是加载 RestSharp.dll 失败了。

可以打开活字格的 bin 目录找到 RestSharp.dll 文件
1705132669215-7e708c47-80f1-463e-8f07-a50b0c169f95.png

通过查看文件属性,可以查看活字格中引用的 DLL 的版本。

1705132773603-145434df-f5fa-4e5f-b1f9-e20c593fb85b.png

根据异常信息可以知道,第三方类库尝试加载 RestSharp.dll 的版本号为 110.1.0.0 而活字格引用的版本号是 106.15.0.0。而.NET框架的策略是如果主进程(活字格)依赖的版本高,而插件依赖的版本低,是可以正确加载的。反之,则会加载失败。

解决方案

方法一:直接从活字格的Bin目录引用

  1. 首先从NuGet里删除RestSharp包
    1705135200112-40b56c5a-e468-4db6-a0cb-9190104af3c8.png
  2. 通过添加引用直接引用活字格中的对应的Assembly文件
  3. 选择“添加项目引用”
    1705134750578-a71c5854-82f6-4739-b46d-147eec45c2d2.png
  4. 点击“浏览”
    1705134794383-e1d50a60-324e-4fdc-87ce-90e7facd53ac.png
  5. 找到活字格的安装目录,找到对应的DLL文件,点击添加
    1705134870168-460339a1-e08f-4b16-89e5-84152246f53d.png
  6. 添加后即可在在程序集中找到RestSharp引用。重新编译即可解决
    1705134914456-c9621793-85f8-40e5-9b8b-7b09d4cd61d2.png

方法二:降低第三方类库的版本

有些时候,无法直接通过添加活字格安装目录的DLL来解决问题,可能是因为这个DLL是用过第三方类库间接引用的,方法一就无法使用。
此时可以通过降低第三方类库的版本,确保插件依赖的版本号低于活字格依赖的版本号,例如,InfluxDB.Clent.Core 最新版是依赖的 RestSharp 的版本是 110.1.0.0 会导致这个问题。只需要安装一个较低版本,查看依赖的RestSharp 版本低于 106.15.0.0 即可
1705135358554-393b7643-c0df-4750-b25b-f657594ce652.png通过查看InfluxDB.Clent.Core可以发现 3.3.0 版本依赖的 RestSharp 版本为 106.12.0.0。 低于106.15.0.0 所以安装 3.3.3 版本就可以解决问题了。
1705135488115-3d2dd6f0-d054-49b4-b79e-fae82ff98580.png

更新: 2024-01-13 18:35:04
原文: https://www.yuque.com/robert-bh51n/ea8l6c/cdriwo3dxeoacd56