Обновление FileVersionInfo в каталоге Program Files

У меня есть программа с FileSystemWatcher, которая следит за тем, чтобы внешняя программа обновлялась до новой версии (что включает переименование текущего исполняемого файла и копирование его на место).

Проблема в том, что когда файл, который он просматривает, находится в каталоге Program Files, FileVersionInfo.GetVersionInfo() не получает информацию о новой версии, он возвращает то же самое, что и в первый раз. Поэтому, если бы он обновился с 1.1 до 1.2, он сказал бы "Обновлен с 1.1 до 1.1" вместо "Обновлен с 1.1 до 1.2". Он правильно работает в каталоге отладки, но в Program Files он не получит правильное значение.

Вот суть того, что он делает, без всякой обработки и удаления исключений, регистрации и вызова потоков, и тому подобное:

string oldVersion;
long oldSize;
DateTime oldLastModified;
FileSystemWatcher fs;
string fullpath;

public void Watch()
{
    fullpath = Assembly.GetEntryAssembly().Location;
    oldVersion = FileVersionInfo.GetVersionInfo(fullpath).ProductVersion;
    var fi = new FileInfo(fullpath);
    oldSize = fi.Length;
    oldLastModified = fi.LastWriteTime;

    fs = new FileSystemWatcher(
        Path.GetDirectoryName(fullpath), Path.GetFileName(file));
    fs.Changed += FileSystemEventHandler;
    fs.Created += FileSystemEventHandler;
    fs.EnableRaisingEvents = true;
}

void FileSystemEventHandler(object sender, FileSystemEventArgs e)
{
    if (string.Equals(e.FullPath, fullpath, StringComparison.OrdinalIgnoreCase))
    {
        var fi = new FileInfo(fullpath);
        if (fi.Length != oldSize
            || fi.LastWriteTime != oldLastModified)
        {
            var newversion = FileVersionInfo.GetVersionInfo(fullpath).ProductVersion;
            NotifyUser(oldVersion, newversion);
        }
    }
}

Как заставить GetVersionInfo () обновиться, чтобы увидеть новую версию? Есть ли что-то еще, что я должен звонить вместо этого?

1 ответ

Решение

Я отвечаю на свой вопрос, потому что, кажется, нет большого интереса. Если у кого-то есть лучший ответ, я приму это...

Насколько я могу судить, нет способа заставить его обновиться. Вместо этого я работал над вопросом:

return AssemblyName.GetAssemblyName(fullpath).Version.ToString();

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

Другие вопросы по тегам