软件安装的点过多,有时候为特定某些点更新程序,而其它可能不更新,为了便于维护就加了个对话框,来显示当前软件的所有程序集版本,方便随时查看,或者将信息上传到服务器便于统一管理。
C#生成的.net DLL程序集与C++成生的DLL共享库作用是一样的,但其本质是不同的,C#生成的DLL包含的是中间语言IL,其实只是与C#更低级一些的高级语言,并不是机器码,而C++生成的DLL动态库却是机器码,这导致两者的表现也不同,例如使用System.Diagnostics.Process.Modules得不到.net 动态库的信息,而只能得到主程序模块,代码为:
foreach (ProcessModule m in Process.GetCurrentProcess().Modules) { FileInfo f = new FileInfo(m.FileName); sb.AppendFormat("{0}/t/t{1}/t/t{2}/t/t({3})" , m.ModuleName, m.FileVersionInfo.FileVersion.ToString() , f.LastWriteTime, m.FileName); sb.AppendLine(); }
而如果想获取.NET程序集则需要用别的方法:
System.Reflection.Assembly ma = System.Reflection.Assembly.GetEntryAssembly(); FileInfo fi = new FileInfo(ma.Location); FileVersionInfo mfv = FileVersionInfo.GetVersionInfo(ma.Location); System.Reflection.Module mm = ma.ManifestModule; sb.AppendFormat("{0}/t {1}/t {2}/t {3}({4})", mm.Name, ma.GetName().Version, // 这个是在工程的属性里设置的Assembly Version fi.LastWriteTime, ma.Location , mfv.FileVersion); // 这个是在工程的属性里设置的File Version sb.AppendLine();
foreach (var aName in ma.GetReferencedAssemblies()) { Assembly a = Assembly.Load(aName); FileInfo f = new FileInfo(a.Location); FileVersionInfo fv = FileVersionInfo.GetVersionInfo(a.Location); System.Reflection.Module m = a.ManifestModule; sb.AppendFormat("{0}/t {1}/t {2}/t {3}({4})" , m.Name, a.GetName().Version, f.LastWriteTime, a.Location, fv.FileVersion); sb.AppendLine(); }
通过反射机制,首先获取主程序集,然后获取它引用的程序集的信息。