代码之家  ›  专栏  ›  技术社区  ›  Bob

所有使用的DLL的日志版本

  •  6
  • Bob  · 技术社区  · 15 年前

    我想记录我的.NET应用程序使用的所有DLL的版本。不管日志输出是在启动时生成还是在第一次使用每个DLL时生成。

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

    6 回复  |  直到 15 年前
        1
  •  6
  •   Zach Johnson    15 年前

    我在.NETCompact框架上测试并验证了这一点。

    你可以用 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;
        }
    }
    
        2
  •  0
  •   leppie    15 年前

    我不确定它是否在CF上可用,但在正常的.NET中,我只会使用 AppDomain.GetAssemblies()

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

        3
  •  0
  •   Jason R. Coombs    15 年前

    你也许可以使用 Dependency Walker ,并仅使用命令行选项将其作为子进程执行。根据常见问题解答,它可以针对windowsce模块工作,尽管它不能在CE设备上运行,因此可能不适合您的需要。

        4
  •  0
  •   laktak    15 年前

    例如

    AppDomain.CurrentDomain.AssemblyLoad+=(s, e) => 
      Console.WriteLine("loaded: "+e.LoadedAssembly.FullName);
    
        5
  •  0
  •   ray2k    15 年前
    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
      }
    }
    

    EDIT:Woops,看起来AppDomain.GetAssemblies()不在压缩框架中。

        6
  •  0
  •   Will Marcouiller    15 年前

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

    记住,要考虑的最重要的事情是让事情做你需要做的事情。其他什么都不重要。一旦它完成了你需要的工作,也许还有改进的空间。但首先,让它工作起来!你只需看看以后需要改进的地方。