Версии журнала всех использовали DLLs

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

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

6
задан Bob 6 April 2010 в 10:58
поделиться

6 ответов

Изменить: Я протестировал и подтвердил, что это работает на .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;
    }
}
6
ответ дан 17 December 2019 в 02:26
поделиться

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

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

0
ответ дан 17 December 2019 в 02:26
поделиться

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

0
ответ дан 17 December 2019 в 02:26
поделиться

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

например.

AppDomain.CurrentDomain.AssemblyLoad+=(s, e) => 
  Console.WriteLine("loaded: "+e.LoadedAssembly.FullName);
0
ответ дан 17 December 2019 в 02:26
поделиться
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
ответ дан 17 December 2019 в 02:26
поделиться

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

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

0
ответ дан 17 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: