dotnet pack 打包文件版本号引起 Could not load file or assembly 问题

如果不是遇到,真的不会想到,代码世界的问题真是千奇百怪,这次遇到的是 dotnet pack 打包文件版本号引起的问题。

之前进行 nuget 打包都是在 Visual Studio build 时进行,版本号时通过 .csproj 中的 VersionPrefix 指定,没遇到问题。

最近,改为通过 shell 脚本在 linux 上打包,开始的 shell 脚本是怎么写的:

dotnet pack -c Release /p:version=$(git tag --sort=committerdate | tail -1 )

后来发现 dotnet pack 不能自动 build 项目,这个问题不是从哪个版本的 .net core cli 开始出现的。

为了解决这个问题,在 dotnet pack 命令之前添加了 dotnet build 命令:

dotnet build -c Release
dotnet pack -c Release /p:version=$(git tag --sort=committerdate | tail -1 )

采用这个脚本发包后,最近几次发包遇到了奇怪的问题,比如发布了 EnyimMemcached 2.2 包,在引起该包的 A 项目中升级到 EnyimMemcached 2.2,而 A 项目所引用的其他 nuget 包也引用了 EnyimMemcached 但引用的是旧版 EnyimMemcached 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)

对于这样的依赖同一个包的不同版本问题,.net core 中已经进行了有效解决,如果存在版本冲突,在 build 时就能发现,比如 解决 .net core 中 nuget 包版本冲突问题 ,只要 build 通过,基本不会出现上面的问题,.net core runtime 会自动使用最高版本。

而我们现在却遇到了这个 .net core 已经解决的问题,让人莫名其妙,无从下手。今天再次遇到这个问题时,想到把包解开看看其中有没有与运行时相关的元数据信息。

解开一看,除了 dll 文件,没有其他用于运行时的文件,在查看这个 dll 文件的信息时发现了线索:

640?wx_fmt=png 

不对,文件版本号怎么是 1.0 ,打的明明是 2.2 的包?

Review 打包脚本后恍然大悟

dll 文件是在 build 时生成的,Build 时没有添加版本信息,于是使用了默认版本号1.0。

赶紧改进脚本试试

VERSION=$(git tag --sort=committerdate | tail -1)
dotnet build /p:version=$VERSION -c Release Enyim.Caching
dotnet pack -c Release /p:version=$VERSION Enyim.Caching

这样改进后,打出的包中的 dll 文件版本就与包的版本就一致了

640?wx_fmt=png

在项目中升级到这个包,问题也就解决了。

原来,.net core 在 build 时只检查 nuget 包的版本号,不检查包中 dll 程序集文件的版本号,而 .net core runtime 在运行时会检查程序集文件的版本号。而我们遇到的问题就是由于 build 时与运行时的检查机制不一致,造成错误的文件版本号没有在 build 时被检查出来,从而在应用运行的时候才发现,大大增加了问题的排查难度。

为什么一定要在运行时检查程序集文件的版本号而且在版本号出现问题时让整个应用都无法启动?反正就这一个文件,写个告警日志,继续用这个文件就是了,如果无法使用这个文件,再让整个应用挂掉也不迟,这个地方有点想不通。

今天的发现也让之前的另外一个疑问有了答案,之前在 .NET Core 2.2 中遇到了 System.Data.SqlClient 的问题,想看看最新版的 corefx 是否解决了这个问题,于是签出最新版的 corefx 代码 build 出了 System.Data.SqlClient.dll 替换 .NET Core 2.2 中的同名文件,运行时也总是报错 "Could not load file or assembly" ,只有签出 release/2.2 分支的代码 build 才行,原来也是文件版本号的问题,只要修改一下文件版本号就能解决。

另外,程序集的依赖信息保存在 .deps.json 文件中,如果不能修改程序集文件的版本号,应该可以通过修改 .deps.json 文件中 runtime 配置的 fileVersion 值来实现。

"runtime": {
"lib/netstandard2.0/EnyimMemcachedCore.dll": {
"assemblyVersion": "2.2.2.0",
"fileVersion": "2.2.2.0"
}
}

原文地址:https://www.cnblogs.com/dudu/p/10880845.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315873.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FFT/NTT/FMT/FWT题目

快速傅里叶变换FFT hdu4609 3-idiots P4173 残缺的字符串 Hash Function [AH2017/HNOI2017]礼物 CF993E Nikita and Order Statistics 快速沃尔什变换 FWT BZOJ4589. Hard Nim Tree Cutting HDU - 5909 快速莫比乌斯变换 FMT 快速数论变换 NTT P2000 拯救世界

[Wannafly挑战赛2D-Delete]最短路

[Wannafly挑战赛2D-Delete]最短路 题目描述 给定一张 n 个点,m 条边的带权有向无环图,同时给定起点 S 和终点 T ,一共有 q 个询问,每次询问删掉某个点和所有与它相连的边之后 S 到 T 的最短路,询问之间互相独立(即删…

ASP.NET Core MVC 视图

ASP.NET Core MVC中视图的知识和ASP.NET MVC有很多相似之处,学习难度较低。以下内容主要体现了编程中模块化的思想,模块化才应是我们关注的重点。布局用于提供各个页面所需的公共部分,如:菜单、页头、页尾等。在ASP.NET Core中默认…

CF993E Nikita and Order Statistics

CF993E Nikita and Order Statistics 题意: 给你一个数组 a1∼na_{1 \sim n}a1∼n​,对于 k0∼nk 0 \sim nk0∼n,求出有多少个数组上的区间满足:区间内恰好有 k 个数比 x 小。 x 为一个给定的数。 n≤2105n \le 2 \times 10^5n…

ASP.NET Core 通过 Microsoft.DotNet.Watcher.Tools 实现热部署

之前开发前端的时候,webpack 会有热更新工具,在修改了代码之后,自动将代码编译,实时展现到页面上,给开发带来了极大的方便。Java也可以通过第三方插件JRebel实现热部署,不用频繁的重启Tomcat。微软官方也为…

P3825 [NOI2017]游戏

P3825 [NOI2017]游戏 题目描述 小 L 计划进行n场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏。 小 L 的赛车有三辆,分别用大写字母A、B、C表示。地图一共有四种,分别用小写字母x、a、b、c表示。其中&#x…

事关SuperSocket发布,寻找YangFan哥哥

SuperSocket近日发布了2.0的第一个预览版《SuperSocket 2.0 Preview1 发布,.NET Socket服务器框架》,在NuGet上以一个包含数个SuperSocket程序集的大包的形式发布。https://www.nuget.org/packages/SuperSocket/2.0.0-preview1我原意以独立小包的形式发布…

P3321 [SDOI2015]序列统计(未解决)

P3321 [SDOI2015]序列统计 题意: 题解: 参考题解: 题解 P3321 【[SDOI2015]序列统计】 【LG3321】[SDOI2015]序列统计 神仙题。。学透再补 代码:

P1963 [NOI2009]变换序列

题目描述 不想水字,详见某谷:P1963 [NOI2009]变换序列 solution 其实 的计算就类似于环上的距离。 对于每一个 都可能有两种位置选择:, 。 所以把它们分别连边,二分图上匈牙利算法求完美匹配即可。 #include&…

一次 .NET Core 中玩锁的经历:ManualResetEventSlim, SemaphoreSlim

最近同事对 .net core memcached 缓存客户端 EnyimMemcachedCore 进行了高并发下的压力测试,发现在 linux 上高并发下使用 async 异步方法读取缓存数据会出现大量失败的情况,比如在一次测试中,100万次读取缓存,只有12次成功&…

BZOJ4589. Hard Nim

BZOJ4589. Hard Nim 题意: Claris和NanoApe在玩石子游戏,他们有n堆石子,规则如下: Claris和NanoApe两个人轮流拿石子,Claris先拿。每次只能从一堆中取若干个,可将一堆全取走,但不可不取&…

P2825 [HEOI2016/TJOI2016]游戏

题目描述 详见 P2825 [HEOI2016/TJOI2016]游戏。 solution 套路题。 一般思路是行列建点跑二分图最大匹配。 此题中的#会分隔行列,因此我们把每行的极大联通块设为点,列同理建点。 再对于每个*对应的行的极大联通块与列的最大联通块编号连边&…

P3033 [USACO11NOV]牛的障碍Cow Steeplechase

P3033 [USACO11NOV]牛的障碍Cow Steeplechase 题目描述 详见:P3033 [USACO11NOV]牛的障碍Cow Steeplechase solution 裸题。 对于每一对相交的线段,连一条边,表示这一对线段不能都取。 显然这样会建立一个二分图(横的线段不…

Tree Cutting HDU - 5909

Tree Cutting HDU - 5909 题意: 一个无根树,n个点,n-1条边,每个节点有一个权值,一棵树的权值就是其节点(包含本身及其子节点)的权值的异或和;求价值为[0,m)的树有多少颗?(所谓的树其实就是原连…

Redis作者antirez:开源维护者的挣扎

这两天,一篇名为《开源维护者的挣扎》的文章被迅速顶至 Hacker News 首页,这是 Redis 作者 antirez 发布的最新博客。几个月前,一名开源项目的维护者向 antirez 发邮件,倾诉自己苦心维护项目多年,这或多或少带来了一些…

CF662C Binary Table

CF662C Binary Table 题意: 有一个 n 行 m 列的表格,每个元素都是 0/1 ,每次操作可以选择一行或一列,把 0/1 翻转,即把 0 换为 1 ,把 1 换为 0 。请问经过若干次操作后,表格中最少有多少个 1 …

P4111 [HEOI2015]小Z的房间

P4111 [HEOI2015]小Z的房间 题目描述 详见&#xff1a;P4111 [HEOI2015]小Z的房间 solution Matrix-Tree裸题。 题意为求一个有障碍的网格图的生成树个数。 因此对于每一个点向左边和上面的节点连边&#xff0c;Matrix-Tree定理求解生成树个数即可。 #include<bits/s…

黑科技抢先尝(续) - Windows terminal中WSL Linux 终端的极简美化指南

之前&#xff0c;本人写了两篇文章 黑科技抢先尝 | Windows全新终端初体验(附代码Build全过程) 和 程会玩 | 无需自行编译也能玩转 Windows Terminal&#xff0c;介绍了玩转Windows terminal的两种方式。今天这篇文章&#xff0c;主要介绍如何美化 Windows terminal 中 WSL 的 …

P3203 [HNOI2010]弹飞绵羊

P3203 [HNOI2010]弹飞绵羊 题目描述 详见&#xff1a;P3203 [HNOI2010]弹飞绵羊 solution 这是一道LCT的裸题。 但是我并不想用LCT解决此题&#xff08;In fact 是不会LCT ~QAQ&#xff09; 于是我们开始大力分块。 考虑把弹跳装置分块&#xff0c;我们每次需要知道在一…

L - Two Ants Gym - 102823L

L - Two Ants Gym - 102823L 题意&#xff1a; 有两个线段A&#xff0c;B&#xff0c;两个线段不会超过一个公共点&#xff0c; 你站在线段B上&#xff0c;整个平面你看不到的区域的面积(如图中S所在区域) 题解&#xff1a; 计算几何&#xff0c;恶心题。调了一个小时还是…