0

0

C#怎么获取程序的编译时间_C#如何读取程序集的属性信息【技巧】

尼克

尼克

发布时间:2026-03-13 14:19:03

|

809人浏览过

|

来源于php中文网

原创

最可靠方式是通过 AssemblyMetadataAttribute 在编译时注入并读取 BuildTime;其次可解析 AssemblyVersion 中自动生成的构建号(需项目配置时间戳版本);文件时间戳(如 LastWriteTime)仅为妥协方案,不可靠。

c#怎么获取程序的编译时间_c#如何读取程序集的属性信息【技巧】

怎么从 Assembly 里读出编译时间?

没有直接的“编译时间”元数据——.NET 不在程序集里存这个值。所谓“获取编译时间”,本质是读取 AssemblyVersion 或文件时间戳,再靠约定反推。最常用、也最靠谱的方式是解析 AssemblyVersion 中的构建号(build number),前提是你的项目用了自动生成版本号(比如 1.0.* 或 SDK 风格项目的 $(DateTime) 替换)。

如果没配自动版本,Assembly.GetExecutingAssembly().GetName().VersionBuildRevision 就是 0,毫无意义。这时候只能退而求其次,读程序集文件的 LastWriteTime(但注意:它反映的是最后写入磁盘的时间,不是编译时间;发布后重签名、复制、解压都会改它)。

  • SDK 风格项目推荐在 .csproj 中启用时间戳版本:<VersionPrefix>1.0.0</VersionPrefix><VersionSuffix>$(DateTime:yyyyMMddHHmm)</VersionSuffix>
  • 老式项目可用 AssemblyVersion("1.0.*"),此时 Build 是自动生成的天数(距 2000-1-1),Revision 是秒数 / 2,可换算
  • 别信 File.GetCreationTime——它在很多部署场景下不可靠(如 ZIP 解压、CI/CD 拷贝)

GetCustomAttribute<AssemblyMetadataAttribute> 能不能存编译时间?

可以,而且是真正可控的方式:你在编译时手动注入一条元数据,运行时再读出来。但它需要你主动配置 MSBuild,在生成阶段把时间写进去。

原理很简单:MSBuild 执行时用 $(DateTime)$(UnixTimestamp) 生成一个字符串,通过 <AssemblyMetadata> 写进程序集。运行时调用 Assembly.GetCustomAttribute<AssemblyMetadataAttribute>("BuildTime") 就能拿到。

  • .csproj 里加:<AssemblyMetadata Include="BuildTime" Value="$(DateTime:yyyy-MM-dd HH:mm:ss)" />
  • 注意 DateTime 格式不支持所有分隔符,MM(月)和 mm(分)大小写敏感,错写成 mm 会报 MSBuild 错误
  • 读取时必须用完全匹配的 key 名,"buildtime""BuildTime" 是不同的键
  • 该方式不影响性能,也不依赖文件系统,适合 CI/CD 环境固化构建信息

为什么 Assembly.GetExecutingAssembly().Location 有时为空?

因为当前程序集被加载为“反射上下文”或“内存流”,比如单元测试里用 Assembly.Load(byte[])、Blazor WebAssembly、某些插件热加载场景,Location 返回空字符串。这时候 CodeBase 也可能不可靠,甚至抛异常。

AITDK
AITDK

免费AI SEO工具,SEO的AI生成器

下载

想绕过这个问题,得换路径策略:优先用 Assembly.GetExecutingAssembly().ManifestModule.Name 拿模块名,再结合 AppContext.BaseDirectory 拼路径;或者更稳妥地,用 typeof(Program).Assembly.Location(确保 Program 类在主程序集中)。

  • 不要对 Location 做非空断言,先判空再 fallback
  • Assembly.GetCallingAssembly() 在 JIT 或内联后可能指向意外程序集,慎用
  • Unity 或 .NET Native AOT 下,反射行为受限,AssemblyMetadata 可能被裁剪,需保留 [assembly: Preserve](若用 Mono)或检查 AOT 链接配置

AssemblyDescriptionAttributeAssemblyProductAttribute 有啥陷阱?

这些属性是纯字符串,编译器不校验内容,也不强制填写。常见问题是空值、硬编码占位符(如 "TODO: Enter description")、或混入换行符导致 UI 显示异常。

它们适合放人工维护的信息(如产品名、版权),不适合放机器生成的数据(比如时间戳)。如果你看到某处代码试图从 AssemblyDescriptionAttribute 里 parse 时间,基本可以判定是历史债务——没人维护、格式不统一、容易崩。

  • 读取前务必判空:attr?.Description ?? "N/A"
  • 不要用正则从 Description 里抽时间——不同团队填法五花八门,今天是 "Built on 2024-05-20",明天可能是 "v1.2.3 (20240520)"
  • 这类属性会被写进 Windows PE 文件的资源段,影响最终 EXE 大小(虽然极小),但过度堆砌描述字段无实际收益

真正可靠的编译时间,只存在于你主动写进去的地方。要么塞进 AssemblyVersion(靠约定),要么用 AssemblyMetadata(靠配置),其余都是妥协方案。最容易被忽略的一点:时间格式必须在写入和读取两端严格一致,哪怕多一个空格,DateTime.TryParseExact 就会静默失败。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1567

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

651

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1228

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1204

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

193

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

131

2025.08.07

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.2万人学习

C 教程
C 教程

共75课时 | 5.4万人学习

C++教程
C++教程

共115课时 | 21.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号