2015-05-07 2 views
9

Возникла проблема:Доступ к информации о папке о приложении clickonce

У меня есть два приложения. Одним из них является приложение clickonce, к которому у меня нет доступа, а другой - программа C#, которую я разрабатываю. Мне нужен способ отследить папку приложения, в которой приложение установлено либо файлом .appref-ms в меню «Пуск», либо идентификатором/именем токена, найденным внутри этого файла.

Возможно ли это? Есть ли способ запросить хранилище clickonce для списка приложений и где они установлены? Все, что я нашел, это открытие списка процессов и переход к месту образа процесса, но это невозможно, если программа не запущена.

+0

Может быть, это поможет вам найти применение http://stackoverflow.com/questions/908850/get -installed-applications-in-a-system – MrWombat

+0

Я не думаю, что есть простой способ сделать это, имена запутаны по дизайну. Вы можете найти папку 'C: \ Users \ xxxx \ AppData \ Local \ Apps \ 2.0', чтобы узнать, что находится в подпапках. –

ответ

2

Я не знаю способа запроса в хранилище ClickOnce.

Но как @ Vojtěch Dohnal сказал. Все приложения ClickOnce будут храниться в C:\Users\xxxx\AppData\Local\Apps\2.0

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

Ниже приведен пример фрагмент код (одного пользователя):

var exes = Directory.EnumerateFiles(@"C:\Users\<user>\AppData\Local\Apps\2.0", "*.exe", 
    SearchOption.AllDirectories); 

var apps = new Dictionary<String, Tuple<String, Version>>(); 

foreach (var file in exes) 
{ 
    var fileName = Path.GetFileName(file); 

    Version v = null; 
    Version.TryParse(FileVersionInfo.GetVersionInfo(file).FileVersion, out v); 

    if (fileName == null || v == null) continue; 

    if (!apps.ContainsKey(fileName)) 
    { 
     apps.Add(fileName, new Tuple<string, Version>(file, v));  
    } 
    else if (v > apps[fileName].Item2) 
    { 
     apps[fileName] = new Tuple<string, Version>(file, v); 
    } 
} 

Вы найдете в приложениях словарь всех приложений имен в качестве ключей, а также значение Кортежа, содержащего полный путь к исполняемому файлу и это версия.

Не нашли другой способ получить информацию, но я надеюсь, что он будет делать работу

Пробовал на моем компьютере, и это, кажется, работает нормально

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

Если нет, но вы знаете, где .appref-ms, вы будете иметь, чтобы открыть его, получить манифест приложения (файл .application опубликованных ClickOnce) и получить имя исполняемого файла из assemblyIdentity узла.

4

ClickOnce хранят данные в разделе реестра Windows: ключ HKEY_CURRENT_USER\Software\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment

реестра со списком приложений: HKEY_CURRENT_USER\Software\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment\SideBySide\2.0\StateManager\Applications

+0

Из любопытства: этот метод является общесистемным или только для текущего пользователя? – Sidewinder94

Смежные вопросы