Получение даты последнего изменения сборки в GAC - PullRequest
1 голос
/ 30 декабря 2010

Я реализовал оболочку fusion.dll, упомянутую во многих постах, и теперь обнаружил, что по крайней мере один dll, который мне нужен, чтобы определить, нужно ли его обновлять, не использует номера сборки и ревизии.Следовательно, я не могу сравнить по номерам версий, и мне нужно сравнить по дате последнего изменения.

fusion.dll или его обертки не имеют такого метода, который, я думаю, достаточно справедлив, но как определить «реальный» путьdll, чтобы я мог обнаружить, что это последняя Дата изменения.

Мой код пока:

private DateTime getGACVersionLastModified(string DLLName)
{
  FileInfo fi = new FileInfo(DLLName);
  string dllName = fi.Name.Replace(fi.Extension, "");

  DateTime versionDT = new DateTime(1960,01,01);

  IAssemblyEnum ae = AssemblyCache.CreateGACEnum();
  IAssemblyName an;
  AssemblyName name;
  while (AssemblyCache.GetNextAssembly(ae, out an) == 0)
  {
    try
    {
      name = GetAssemblyName(an);

      if (string.Compare(name.Name, dllName, true) == 0)
      {
        FileInfo dllfi = new FileInfo(string.Format("{0}.dll", name.Name));
        if (DateTime.Compare(dllfi.LastWriteTime, versionDT) >= 0)
          versionDT = dllfi.LastWriteTime;
      }
    }
    catch (Exception ex)
    {
      logger.FatalException("Unable to get version number: ", ex);
    }
  }
  return versionDT;
}

1 Ответ

1 голос
/ 30 декабря 2010

Из описания проблемы в вашем вопросе я вижу, что на самом деле есть две основные задачи, которые вы пытаетесь выполнить:

1) Определите, можно ли загрузить данное имя сборки из GAC.2) Вернуть дату изменения файла для данной сборки.

Я полагаю, что эти 2 пункта могут быть выполнены гораздо проще и без необходимости работать с неуправляемым API Fusion .Более простой способ выполнения этой задачи может быть следующим:

static void Main(string[] args)
{
  // Run the method with a few test values
  GetAssemblyDetail("System.Data"); // This should be in the GAC
  GetAssemblyDetail("YourAssemblyName");  // This might be in the GAC
  GetAssemblyDetail("ImaginaryAssembly"); // This just plain doesn't exist
}

private static DateTime? GetAssemblyDetail(string assemblyName)
{
  Assembly a;
  a = Assembly.LoadWithPartialName(assemblyName);
  if (a != null)
  {
    Console.WriteLine("'{0}' is in GAC? {1}", assemblyName, a.GlobalAssemblyCache);
    FileInfo fi = new FileInfo(a.Location);
    Console.WriteLine("'{0}' Modified: {1}", assemblyName, fi.LastWriteTime);
    return fi.LastWriteTime;
  }
  else
  {
    Console.WriteLine("Assembly '{0}' not found", assemblyName);
    return null;
  }
}

Пример полученного результата:

«System.Data» находится в GAC?Правда«System.Data» изменено: 01.10.2010 9:32:27'YourAssemblyName' находится в GAC?Ложь'YourAssemblyName' Изменено: 30.12.2010 4:25:08Сборка 'Воображаемая сборка' не найдена

...