运行时获取类库信息

运行时获取类库信息

Intro

在我们向别的开源项目提 issue 的时候,可能经常会遇到别人会让我们提供使用的版本信息,如果别的开源项目类库集成了 source link,我们可以从程序集信息中获取到版本以及对应的 commit 信息,这样我们就可以直接找到对应版本的 commit 对应的代码版本,这样也就可以更加方便的了解对应源码了

那我们是不是也可以在运行时获取类库的 commit 信息呢,答案是肯定的

Sample

我们集成了 source link 的话,在程序集信息中是可以获取到 git 相关的信息, source link 的单步调试也是基于此来扩展的调试时下载对应源文件的

这里是我集成了 source link 的一个开源项目,反编译 dll 的时候可以看到一些 git 相关的信息

26bf39f1ba556ac86d6390985c5eda81.png

AssemblyInfomationVersion 中的信息由两部分组成,一部分是原始的 package 版本号,另外一部分是对应 commit hash,我们结合 RepositoryUrl 就可以很方便的找到对应的代码了

RepositoryUrl 则是在一个 AssemblyMetadata 的 attribute 中

Implement

我们可以定义一个 model 来表示程序集的信息,这样以后扩展起来也会更加的方便,示例如下:

public class LibraryInfo
{public required Version LibraryVersion { get; init; }public required string LibraryHash { get; init; }public required string RepositoryUrl { get; init; }
}

然后通过反射从程序集中获取程序集的信息

public static LibraryInfo GetLibraryInfo(Assembly assembly)
{Guard.NotNull(assembly);var assemblyInformation = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>();var repositoryUrl = assembly.GetCustomAttributes<AssemblyMetadataAttribute>().FirstOrDefault(x => nameof(LibraryInfo.RepositoryUrl).Equals(x.Key))?.Value ?? string.Empty;if (assemblyInformation is not null){var informationalVersionSplit = assemblyInformation.InformationalVersion.Split('+');if (Version.TryParse(informationalVersionSplit[0], out var version)){return new LibraryInfo(){LibraryVersion = version,LibraryHash = informationalVersionSplit.Length > 1 ? informationalVersionSplit[1] : string.Empty,RepositoryUrl = repositoryUrl};}}return new LibraryInfo(){LibraryVersion = assembly.GetName().Version!,LibraryHash = string.Empty,RepositoryUrl = repositoryUrl};
}

为了使用方便添加一个根据类型获取的 overload

public static LibraryInfo GetLibraryInfo(Type type) => GetLibraryInfo(Guard.NotNull(type).Assembly);

More

使用 dotnet-exec  来测试一下

dotnet-exec 'ApplicationHelper.GetLibraryInfo(typeof(WeihanLi.Npoi.CsvHelper))' --reference "nuget:WeihanLi.Npoi,2.4.2"

51df1d9f6df33947f0f3b63cb3b4421d.png

从输出结果我们可以看到我们已经拿到 commit hash 和 RepositoryUrl 信息了,对应的 Github commit 地址就是:https://github.com/WeihanLi/WeihanLi.Npoi/tree/8e2c1dee6efee9b7b4b12f16272f266c9ad09233

最后还是建议大家在自己开源类库项目中集成 source link,不仅方便调试,还可以比较方便准确的获取对应版本的 commit 信息,这样别人使用遇到问题的话也会比较方便的进行 debug 和查找源代码

References

  • https://github.com/dotnet/sourcelink

  • https://github.com/WeihanLi/WeihanLi.Common/blob/1.0.58/src/WeihanLi.Common/Helpers/ApplicationHelper.cs

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

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

相关文章

xbox360链接pc_如何将实时电视从Xbox One流式传输到Windows PC,iPhone或Android Phone

xbox360链接pcSet up your Xbox One’s TV integration and you can do more than just watch TV on your Xbox: you can also stream that live TV from your Xbox to a Windows 10 PC, Windows phone, iPhone, iPad, or Android device over your home network. 设置Xbox One…

WPF ABP框架更新日志(最新2022-11月份)

更新说明本次更新内容包含了WPF客户端以及Xamarin.Forms移动端项目, 更新内容总结如下:WPF 客户端修复启动屏幕无法跳转异常修复添加好友异常修复托盘图标状态更新异常优化好友发送消息时状态检测更新聊天窗口UI风格更新好友列表得头像显示更新聊天窗口消息日期分组显示更新系统…

JSONObject和JSONArray 以及Mybatis传入Map类型参数

import org.json.JSONArray;import org.json.JSONObject;将字符串转化为JSONArray JSONArray jsonArray new JSONArray(deviceInfo); //注意字符串的格式将JSONArray转化为JSONObject类型 JSONObject jsonObject jsonArray.getJSONObject(0);将值存入Map Map<String,S…

十月cms_微软十月更新失败使整个PC行业陷入困境

十月cmsMicrosoft still hasn’t re-released Windows 10’s October 2018 Update. Now, PC manufacturers are shipping PCs with unsupported software, and Battlefield V is coming out next week with real-time ray-tracing technology that won’t work on NVIDIA’s RT…

让Visual Studio 2013为你自动生成XML反序列化的类

Visual Sutdio 2013增加了许多新功能&#xff0c;其中很多都直接提高了对代码编辑的便利性。如&#xff1a; 1. 在代码编辑界面的右侧滚动条上显示不同颜色的标签&#xff0c;让开发人员可以对所编辑文档的修改、查找、定位情况一目了然。而不用像往常一样上下不停地拖动滚动条…

20年的 .NET ,更需要 00 后的你

.NET 20 周年&#xff0c; 在国内有一大批和 .NET 一起成长的开发者&#xff0c;有一大批在不同行业采用 .NET 作为解决方案的企业。或者你会经常听到很多的大神说他的 .NET 经历&#xff0c;也会听到 .NET “牛逼” 的故事&#xff0c;更会听到用 .NET 不用“996”的神话。但对…

UIT创新科存储系统服务“500强”汽车名企

信息化已成为汽车产业链各企业提高市场竞争力和传统汽车产业谋求转型升级的推动力&#xff0c;无论是汽车生产商&#xff0c;还是汽车服务商和零配件生产商&#xff0c;无不重视信息化系统的建设。某全球汽车行业著名的零配件生产商&#xff0c;财富500强企业之一&#xff0c;从…

通过从备份中排除这些文件夹来节省Time Machine驱动器上的空间

Are you getting notifications about a full Time Machine drive? Do you feel like your backups are taking too long? A bigger, faster hard drive might be the best solution, but you can also help by excluding particular folders from your backups. 您是否收到有…

c#调用触滑输入法实现触摸屏键盘功能

背景最近在做一个项目&#xff0c;用户端是触摸屏&#xff0c;涉及到一些表单数据的操作&#xff0c;因为是没有外接的鼠标键盘&#xff0c;所以想着当用户在操作表单的时候&#xff0c;能够把软件键盘输入法给调出来使用。什么是触滑输入法触滑输入法Swype&#xff0c;是针对触…

Teradata天睿公司推出适用各种部署环境的全球最强分析数据库

Teradata天睿公司&#xff08;Teradata Corporation&#xff0c;纽交所&#xff1a;TDC&#xff09;推出Teradata Everywhere™&#xff0c;成为业内首家在多种公有云、托管云和本地部署环境下部署全球最强海量并行处理&#xff08;MPP&#xff09;分析数据库的厂商。这些部署环…

如何使用智能铃声避免在Android中令人尴尬的大声铃声

Choosing a ringtone volume can be hard – there is no one setting that is right for all environments. What works perfectly at home may be too quiet for when you’re on the train, but too loud for the office. Intelligent Ringer can be used to adjust ringto…

为什么要把类设置成密封?

前几天笔者提交了关于FasterKvCache的性能优化代码&#xff0c;其中有一个点就是我把一些后续不需要继承的类设置为了sealed密封类&#xff0c;然后就有小伙伴在问&#xff0c;为啥这个地方需要设置成sealed&#xff1f;提交的代码如下所示&#xff1a;一般业务开发的同学可能接…

Java 打飞机(小游戏)[版权非本人 本人制作收藏整理]

今天在网络上 看到一个纯java的小游戏 代码copy到 myeclipse中 居然效果还不错 这是一些效果图 当然了 图片是我自己找的 有心兴趣的朋友可以做的好看一点 具体的代码 都放在自己的文件里去了 那么可以去下载 https://i.cnblogs.com/Files.aspx 转载于:https://www.cnblogs…

nest 架构_当有人打来您的Nest Hello时,如何让Google Home通知您

nest 架构The Nest Hello can alert you on your phone whenever someone rings your doorbell, but if you have a Google Home, you can also have Google Assistant audibly announce that someone is at the door. 无论何时有人按下门铃&#xff0c; Nest Hello都会在电话上…

如何序列化派生类

前言假设有一个 Person 抽象基类&#xff0c;其中包含 Student 和 Teacher 派生类&#xff1a;public class Person {public string Name { get; set; } }public class Student : Person {public int Score { get; set; } }public class Teacher : Person {public string Title…

nexus 手动增加_如何使用Google的工厂图像手动升级Nexus设备

nexus 手动增加Google’s Nexus devices are supposed to receive timely updates, but the staggered rollout means it can take weeks for devices to receive over-the-air (OTA) updates. Luckily, there’s a faster (and geekier) way to install the latest version of…

WPF-16 图形处理

我们这节主要介绍WPF常用画图标签&#xff0c;由于WPF图形处理设计大量篇幅 ,我们在这里抛砖引玉&#xff0c;具体更多的学习资料链接https://github.com/microsoft/WPF-Samples/tree/master/Graphics 该链接中微软提供了大量的学习Demo&#xff0c;WPF图形处理最大的区别在于…

纯CSS制作各种各样的网页图标(三角形、暂停按钮、下载箭头、加号等)

三角形 <div class"box"></div> <style>.box{ width: 0;height: 0;border-top: 50px solid transparent;border-bottom: 50px solid transparent;border-left: 50px solid transparent;border-right: 50px solid red; } </style> 平行四边形…

您的MyFitnessPal帐户几乎肯定已被黑客入侵,请立即更改密码

If you’re one of the millions of the 150 million MyFitnessPal users, bad news: hackers have your email address, your user name, and your hashed password. 如果您是1.5亿MyFitnessPal用户中的数百万用户之一&#xff0c;那么这是个坏消息&#xff1a;黑客拥有您的电…

ios 启用 证书_如何在iOS 10中启用就寝提醒,轻柔的唤醒和睡眠跟踪

ios 启用 证书If you have trouble regularly getting a full night’s sleep, the new Bedtime feature in iOS 10 might just help. Set a wake up time and how many hours of sleep you need, and iOS offers bedtime reminders, more gentle alarms, and basic sleep trac…