C# 如何获取程序集(Assembly)版本信息 - 反射的应用

发布时间 - 2025-12-26 00:00:00    点击率:
C#中获取程序集版本最常用方式是通过反射调用Assembly类属性:用GetExecutingAssembly()获当前程序集版本,GetEntryAssembly()获入口程序集版本(需判空),typeof(T).Assembly获指定类型所在程序集版本,并可用GetCustomAttribute读取 AssemblyTitle 等元数据。

在 C# 中,获取程序集(Assembly)的版本信息最常用、最直接的方式就是利用 反射(Reflection),通过 Assembly 类及其相关属性实现。核心在于拿到当前或指定程序集的 Assembly 实例,再读取其 GetName().Version 或其他元数据属性。

获取当前程序集的版本号

这是最常见场景,比如在日志、About 窗口或 API 响应中显示本程序版本:

  • 使用 Assembly.GetExecutingAssembly() 获取当前正在执行的程序集(即包含该调用代码的 .dll 或 .exe)
  • 调用 .GetName().Version 得到 Version 对象,可直接转为字符串(如 v.ToString()
  • 也可分别访问 MajorMinorBuildRevision 四个整数字段

示例代码:

var version = Assembly.GetExecutingAssembly().GetName().Version;
Console.WriteLine($"版本:{version}"); // 输出如 1.2.3.4
Console.WriteLine($"主版本:{version.Major}");

获取入口程序集(主程序)的版本

适用于类库中需要知道宿主应用(如 WinForm、ASP.NET Core 主项目)版本的情况:

  • Assembly.GetEntryAssembly() 获取启动当前进程的程序集
  • 注意:在某些上下文(如单元测试、某些插件环境)中可能返回 null,需判空

示例:

var entry = Assembly.GetEntryAssembly();
if (entry != null)
  Console.WriteLine($"主程序版本:{entry.GetName().Version}");

获取指定类型所在程序集的版本

当你有一个类型(Type),想查它定义在哪个程序集及该程序集的版本:

  • 通过 typeof(SomeClass).Assembly 或实例的 GetType().Assembly 拿到程序集
  • 再调用 .GetName().Version 即可

示例:

var version = typeof(Program).Assembly.GetName().Version;
// 或 var version = obj.GetType().Assembly.GetName().Version;

读取更完整的程序集元数据(标题、描述、公司等)

除了版本号,常需获取 AssemblyTitleAssemblyDescription 等友好名称,这些来自程序集特性(Assembly Attributes):

  • 使用 GetCustomAttribute() 方法读取如 AssemblyTitleAttribute
  • 需引用 System.Reflection,且确保对应特性已在 AssemblyInfo.cs(或 .csproj)中设置

示例:

var assembly = Assembly.GetExecutingAssembly();
var title = assembly.GetCustomAttribute()?.Title ?? "未知标题";
var desc = assembly.GetCustomAttribute()?.Description ?? "";

基本上就这些。反射获取版本不复杂但容易忽略细节,比如混淆 GetExecutingGetEntry、忘记判空、或误以为 Version 字符串格式固定(实际可能缺省 Revision)。按需选择合适方式,再加点防御性代码,就能稳稳拿到想要的信息。


# win  # c#  # .net  # NULL  # if  # 字符串  # Reflection  # var  # console  # 对象  # typeof  # 主程序  # 最常用  # 这是  # 就能  # 当你  # 适用于  # 也可  # 或其他  # 已在  # 可直接 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 智能起名网站制作软件有哪些,制作logo的软件?  Laravel怎么使用artisan命令缓存配置和视图  Python自动化办公教程_ExcelWordPDF批量处理案例  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】  Android自定义listview布局实现上拉加载下拉刷新功能  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel如何处理文件下载请求?(Response示例)  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Laravel如何配置任务调度?(Cron Job示例)  三星、SK海力士获美批准:可向中国出口芯片制造设备  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  PHP正则匹配日期和时间(时间戳转换)的实例代码  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  如何快速搭建高效简练网站?  EditPlus 正则表达式 实战(3)  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  如何快速搭建FTP站点实现文件共享?  北京网站制作公司哪家好一点,北京租房网站有哪些?  太平洋网站制作公司,网络用语太平洋是什么意思?  HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Laravel distinct去重查询_Laravel Eloquent去重方法  PythonWeb开发入门教程_Flask快速构建Web应用  如何为不同团队 ID 动态生成多个独立按钮  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程  iOS验证手机号的正则表达式  ,南京靠谱的征婚网站?  如何在建站之星绑定自定义域名?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  JavaScript如何实现音频处理_Web Audio API如何工作?  php结合redis实现高并发下的抢购、秒杀功能的实例  教你用AI润色文章,让你的文字表达更专业  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  教你用AI将一段旋律扩展成一首完整的曲子  javascript如何操作浏览器历史记录_怎样实现无刷新导航  简单实现Android文件上传  如何快速搭建个人网站并优化SEO?  如何在局域网内绑定自建网站域名?  javascript基于原型链的继承及call和apply函数用法分析  如何基于云服务器快速搭建网站及云盘系统?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  如何在IIS服务器上快速部署高效网站?  Laravel如何保护应用免受CSRF攻击?(原理和示例)  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】