Регистрация версий всех используемых DLL - PullRequest
6 голосов
/ 06 апреля 2010

Я хочу регистрировать версии всех библиотек DLL, которые использует мое .NET-приложение. Не имеет значения, генерируется ли вывод журнала при запуске или при первом использовании каждой DLL.

Первое решение, которое мне пришло в голову, - это перебирать все файлы DLL, которые находятся в том же каталоге, что и моя сборка. Но это лучший вариант, который у меня есть? Есть ли лучший способ сделать это? Важно, чтобы решение также работало на .NET-Compact-Framework.

Ответы [ 6 ]

6 голосов
/ 21 апреля 2010

Редактировать: Я проверил и убедился, что это работает на .NET Compact Framework.

Вы можете сделать это, используя Mono.Cecil , мощный инструмент, который позволяет открывать и проверять сборки .NET на уровне IL, даже не загружая их в домен приложений.

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;
    }
}
0 голосов
/ 21 апреля 2010

Полагаю, что интересным алгоритмом будет сериализация используемых вами сборок, а затем при запуске вы десериализуете свою конфигурацию и сравниваете, какая у вас версия каждой DLL. Затем, после обновления версии, вы сериализуете новую версию своей конфигурации и записываете имя и версию сборки в свой лог-файл или около того.

Имейте в виду, что самое важное, что нужно учитывать, - это заставить вещь делать то, что вам нужно. Остальное не важно. Как только он выполнит ту работу, которая вам требуется, возможно, есть место для улучшения. Но сначала, сделайте это! Вы просто увидите, что нужно улучшить после этого.

0 голосов
/ 16 апреля 2010
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 () не в компактной структуре.

0 голосов
/ 06 апреля 2010

Используйте событие AppDomain.AssemblyLoad.

, например

AppDomain.CurrentDomain.AssemblyLoad+=(s, e) => 
  Console.WriteLine("loaded: "+e.LoadedAssembly.FullName);
0 голосов
/ 06 апреля 2010

Возможно, вы сможете использовать Dependency Walker и просто использовать параметры командной строки, чтобы выполнить его в качестве подпроцесса. Согласно FAQ, он работает с модулями Windows CE, но не работает на устройствах CE, поэтому может не соответствовать вашим потребностям.

0 голосов
/ 06 апреля 2010

Я не уверен, доступен ли он на CF, но в обычном .NET я просто использовал бы AppDomain.GetAssemblies().

Вы можете использовать событие AppDomain.AssemblyLoad для уведомления о загрузке сборки.

...