有时候我们作为一个开发者,在开发自己的Web应用时,希望将当前的程序版本和最后更新时间打印在网页上,这样可以更加清晰的告知各位访客自己什么时候更新过网站程序,并且当前版本为多少。
一、获得程序版本
获得程序版本这个问题,WinForm比Web简单,因为在WinForm里是默认引用了System.Windows.Forms这个框架,而这个框架里,有一个名为“Application”的类库提供了一个ProductVersion的属性,我们可以直接访问这个属性来获得程序当前版本。
而在C#的Web开发里,默认是不引用这个System.Windows.Forms框架的(毕竟是开发Web,为啥要去引用WinForm的框架)。那么就会有人问了,那我们直接自己去手动添加这个框架不就好了吗。
然而现实是残酷的,即便是我们自己手动引用了System.Windows.Forms框架,我们依旧没法正确的获得当前程序集的版本。结果如下:
(当前程序集的版本为1.0.0.0)
(运行时显示版本为10.0.10557.1000)
怎么无缘无故编成十点几了……就算是出错了,我们也得搞清楚是错在哪里的对吧?拿着这个“10.0.10557.1000”在解决方案里找了一圈也没发现匹配项。正当一头雾水的时候,笔者突然注意到了任务栏托盘里的一个图标:
等等……难不成……
迅速打开Windows任务管理器,找到“iisexpress.exe”这个进程,右键“打开文件位置”,在资源管理器中定位到可执行程序位置,右键查看属性:
好嘛,这个Application.ProductVersion拿到IIS的版本了!!
看来在Web开发时拿WinForm的框架果然是一件很蠢的事情……
那我们就没有办法了吗?
当然不是。我们程序开发如果只依赖官方提供的类库未免有些太失败了吧,不是有句话是这么说的么:“自己动手丰衣足食”,那接下来就让我们自己动手吧。
首先刚刚我们已经看到了,我们的程序版本是写在一个名为“AssemblyInfo.cs”的文件里,它里面绿色的注释说明这个版本是当前程序集版本。
那如果我们拿到了当前执行的程序集对象,是不是就可以拿到版本了呢?结果是可以的,我们可以通过以下函数来获取当前程序集版本:(注:需要引用“System.Reflection”这个命名空间)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#region 获得当前Web应用的当前版本 + public string GetVersion() /// <summary> /// 获得当前Web应用的当前版本 /// </summary> /// <returns>当前版本</returns> public string GetVersion() { /* 一句话搞定: return Assembly.GetExecutingAssembly().GetName().Version.ToString(); */ Assembly assembly = Assembly.GetExecutingAssembly(); //获得当前正在执行的代码的程序集 AssemblyName assemblyName = assembly.GetName(); //获得程序集的完整描述程序集的唯一标识(AssemblyName) Version version = assemblyName.Version; //获得程序集版本(Version对象) string result = version.ToString(); //将Version对象转化为string类型 return result; //返回结果 } #endregion |
接下来我们来看一下运行效果:
完美!
二、获得最后更新时间
刚刚我们用Assembly.GetExecutingAssembly()这个方法会获取当前执行的代码的程序集,然后就用了GetName()这个方法来获了System.Reflection.AssemblyName,其实在用Assembly.GetExecutingAssembly()这个方法获取到Assembly对象之后,可以使用Assembly的Location属性来定位程序集的文件位置。一般我们的Web网站在发布后我们的代码就会被编译成一个程序集文件,我们可以通过读取这个程序集文件的创建时间来确定最后的更新时间。
下面是代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#region 获得当前Web应用的最后更新时间 + public string GetLastUpdateTime() /// <summary> /// 获得当前Web应用的最后更新时间 /// </summary> /// <returns>最后更新时间</returns> public string GetLastUpdateTime() { /* 一句话搞定: return (new FileInfo(Assembly.GetExecutingAssembly().Location)).LastWriteTime.ToString("yyyy年MM月dd日 HH时mm分ss秒"); */ Assembly assembly = Assembly.GetExecutingAssembly(); //获得当前正在执行的代码的程序集 string fileName = assembly.Location; //通过Assembly对象的Location属性获得程序集文件位置 FileInfo fi = new FileInfo(fileName); //新创建一个FileInfo对象 DateTime dt = fi.LastWriteTime; //获得最后写入时间 string result = dt.ToString("yyyy年MM月dd日 HH时mm分ss秒"); //将时间格式化为XXXX年XX月XX日 XX时XX分XX秒 return result; //返回结果 } #endregion |
运行效果:
写在最后:
之所以突然想起来写这篇文章,是因为之前在工作的时候遇到了很“神奇”的BUG:更新到服务器上的Web应用,新功能怎么都启用不了,本地代码都是对的。折腾了很久之后才发现由于一些特殊原因,用于更新的脚本没有正常运行起来,所以服务器上的Web应用压根没更新……所以后来就在那个Web系统的登录页加上了版本和更新日期。这篇文章也算得上是我的总结吧。
小柊
2016年2月21日 22:30:59