用的是 .net core 2.2 ,项目中引用的 EnyimMemcachedCore 包版本是 2.2.0-beta7
,项目中引用的其他 nuget 包 引用的 EnyimMemcachedCore 包版本是 2.1.12
,可以正常 build ,但运行时却报下面的错误:
System.IO.FileLoadException: Could not load file or assembly 'EnyimMemcachedCore, Version=2.1.12.0, Culture=neutral, PublicKeyToken=null'. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'EnyimMemcachedCore, Version=2.1.12.0, Culture=neutral, PublicKeyToken=null'
at System.Signature.GetSignature(Void* pCorSig, Int32 cCorSig, RuntimeFieldHandleInternal fieldHandle, IRuntimeMethodInfo methodHandle, RuntimeType declaringType)
请问如何解决这个问题?
终于找到原因了!竟然与 EnyimMemcachedCore 打包时所用的 .net core sdk 版本有关,打包 EnyimMemcachedCore 2.2.0-beta7 所用的 .net core sdk 版本是 2.2.100
(对应的 runtime 版本是 2.2.0
),运行项目的 .net core runtime 版本是 2.2.4
,用 .net core sdk 2.2.203(对应的 runtime 版本是 2.2.4
)重新打包 EnyimMemcachedCore 为 2.2.0-beta8 ,安装这个新版本问题就解决了。
今天找到了问题的真正原因,是打包的文件版本号引起的,详见 dotnet pack 打包文件版本号引起 "Could not load file or assembly" 问题
我今天也遇到了类似的问题,解决办法是保持同个项目中引用其他包版本的同步,
比如 项目中我有一个工具类 包A 当前版本为 3.0.0,
B 包引用 A 包版本的 2.0.0 版本
C包 引用A 包版本的 3.0.0 版本
如果你的项目中都引用了 B 和C 包,编译时没问题,运行时就有问题了,我今天的解决办法就是先把无关的包给移除掉,第二就是更新 B包中的引用。
最坑的就是,很多包不归自己管,要是 Nuget 自动选择当前版本最新的包就好了。
在 .net core 中引用包的版本不兼容问题在编译时就能检测出来(详见博文),之前在运行时没碰到过这个问题
我最近也遇到了这个问题,我的解决办法是:
rm -rf ~/.nuget/packages
然后,清除掉 obj 跟 bin,最后重新 restore
我这次遇到的情况不一样,EnyimMemcachedCore 2.2.0-beta7 是刚发布的包,build 项目之前用 git clean -dfx
清理了