.net 记录所有使用的DLL的版本

.net 记录所有使用的DLL的版本,.net,logging,compact-framework,.net,Logging,Compact Framework,我想记录.NET应用程序使用的所有DLL的版本。不管日志输出是在启动时生成还是在首次使用每个DLL时生成 我想到的第一个解决方案是迭代与程序集位于同一目录中的所有DLL文件。但这是我最好的选择吗?有没有更好的办法?解决方案也应在.NET Compact Framework上运行,这一点很重要。我不确定它是否在CF上可用,但在正常的.NET中,我只需使用AppDomain.getAssemblys() 您可以使用AppDomain.AssemblyLoad事件在加载程序集时通知您。您可以使用,只需

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


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

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


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

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

使用AppDomain.AssemblyLoad事件

e、 g


编辑:Woops,看起来AppDomain.GetAssemblys()不在compact framework中。

编辑:我测试并验证了它在.NET compact framework中有效

您可以使用一个强大的工具来完成此操作,该工具允许您在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;
    }
}

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


记住,要考虑的最重要的事情是让事情做你需要做的事情。没有别的事了。一旦它完成了你需要的工作,也许还有改进的余地。但首先,让它工作起来!您只需看看以后需要改进的地方。

不幸的是,方法和事件在CF上都不可用。不幸的是,AssemblyLoad事件在Compact Framework上不可用。根据这个问题的答案,似乎不存在简单的解决方案,@ctacke:Mono.Cecil不是Mono特定的库;您可以将其与应用程序一起部署。我已经证实它确实在CF上工作。
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
  }
}
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;
    }
}