繁体   English   中英

记录所有使用的DLL的版本

[英]Log versions of all used DLLs

我想记录我的.NET应用程序使用的所有DLL的版本。 如果在启动时或首次使用每个DLL时生成日志输出并不重要。

我想到的第一个解决方案是迭代所有DLL文件,这些文件与我的程序集位于同一目录中。 但这是我最好的选择吗? 有没有更好的方法来做到这一点? 重要的是,该解决方案也应该适用于.NET-Compact-Framework。

编辑:我测试并验证了这适用于.NET Compact Framework。

您可以使用Mono.Cecil执行此操作,这是一个功能强大的工具,允许您在IL级别打开和检查.NET程序集,甚至无需将它们加载到AppDomain中。

string path = System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase;

// If using Mono.Cecil 0.6.9.0:
AssemblyDefinition myAssembly = AssemblyFactory.GetAssembly(path);

// If using Mono.Cecil 0.9.1.0:
AssemblyDefinition myAssembly = AssemblyDefinition.ReadAssembly(path);

// from there, you can inspect the assembly's references
foreach (ModuleDefinition module in myAssembly.Modules)
{
    foreach (AssemblyNameReference assemblyReference in module.AssemblyReferences)
    {
        // do something with the reference e.g get name, version, etc
        string fullName = assemblyReference.FullName;
        Version version = assemblyReference.Version;
    }
}

我不确定它是否可用于CF,但在普通的.NET中,我只是使用AppDomain.GetAssemblies()

您可以使用AppDomain.AssemblyLoad事件在加载程序集时通知您。

您可以使用Dependency Walker ,只需使用命令行选项将其作为子进程执行。 根据常见问题解答,它适用于Windows CE模块,但它不能在CE设备上运行,因此可能不适合您的需求。

使用AppDomain.AssemblyLoad事件。

例如

AppDomain.CurrentDomain.AssemblyLoad+=(s, e) => 
  Console.WriteLine("loaded: "+e.LoadedAssembly.FullName);
public void LogAssemblies()
{
  foreach(Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
   { 
     AssemblyName assemblyName = asm.GetName();
     string simpleName = assemblyName.Name;
     string version = assemblyName.Version.ToString();
     // do something with these
  }
}

编辑:Woops,看起来像AppDomain.GetAssemblies()不在紧凑的框架中。

我想一个有趣的算法是序列化你正在使用的程序集,然后,在启动时,你反序列化你的配置,并与每个DLL的版本进行比较。 然后,在版本更新时,您序列化新版本的配置并将程序集名称和版本记录到日志文件中。

请记住,最重要的事情是让事情做你需要做的事情。 别的都无所谓。 一旦它完成了你所需要的工作,就有改进的余地。 但首先,让它运作! 您只需看看之后需要改进的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM