`
yidongkaifa
  • 浏览: 4071363 次
文章分类
社区版块
存档分类
最新评论

C#获取程序集信息

 
阅读更多

软件安装的点过多,有时候为特定某些点更新程序,而其它可能不更新,为了便于维护就加了个对话框,来显示当前软件的所有程序集版本,方便随时查看,或者将信息上传到服务器便于统一管理。

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();
}

通过反射机制,首先获取主程序集,然后获取它引用的程序集的信息。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics