Вопрос о написании фонового/автоматического/беззвучного загрузчика/установщика для приложения в С#
Фон:
У меня есть основное приложение, которое должно быть в состоянии пойти в Интернет и загрузить связанные с ним DLL файлы (те, которые мы пишем, расположенные на нашем сервере). Это действительно необходимо, чтобы загрузить эти файлы DLL в папку приложения в "C:\Program Files". Раньше я использовал System.Net.WebClient
для загрузки любых файлов, которые я хотел получить в Интернете.
Проблема
У меня было много проблем с загрузкой данных в прошлом и сохранением файлов на жестком диске пользователя. Я получаю много сообщений о том, что пользователи не работают, и обычно это связано с проблемами прав пользователя в программе.
В тех случаях, когда это была проблема с правами пользователя программы, каждый пользователь мог перейти в точное местоположение файла в Интернете, загрузить его, а затем сохранить его в нужном месте вручную.
Я хочу, чтобы это работало, как и все другие программы, которые я видел для загрузки/установки в этом fassion (т.е. Firefox Pluign Updates, Flash Player, JAVA, Adobe Reader и т.д.). Все они работают без заминок.
Вопрос
Есть ли какой-то код, который мне нужно использовать, чтобы предоставить моим программам программы загрузки специальные права на папку Program Files? Могу ли я это сделать? Есть ли лучший класс или библиотека, которую я должен использовать? Есть ли другой подход к загрузке файлов, которые я должен использовать, например, используя потоки или что-то еще для загрузки данных?
Любая помощь здесь ценится. Я хочу попытаться держаться подальше от сторонних приложений/библиотек, если это вообще возможно, кроме Microsoft, конечно, из-за проблем с лицензированием, но все равно отправляйте любые предложения по-моему.
Опять же, другие программы, похоже, имеют проблемы с правами и возможность загрузки. Я хочу эту же возможность.
Ответы
Ответ 1
Обычный способ сделать это будет следующим:
- Ваше приложение обнаруживает необходимость обновления.
- Ваше приложение запустит другое приложение (updater), которое загрузит необходимые файлы и установит их в
Program Files
. Это приложение для обновления должно выполняться с правами администратора (т.е. Запрашивать повышение UAC в Vista/Win7). Самый простой способ обеспечить это: добавить манифест приложения к этому приложению обновления.
Если пользователь является администратором с включенным UAC, точка 2 вызовет приглашение UAC, которое должно быть принято (обратите внимание, что это верно для Firefox/Acrobat/etc. updaters). Если пользователь не является администратором, ему будет предложено ввести учетные данные администратора. (Обратите внимание, что это хорошо: только администратору разрешено обновлять приложения, установленные для всех пользователей.)
Ваше приложение для обновления не нужно писать специальным способом: он может использовать System.Net.WebClient
так же, как и раньше. В манифесте приложения будет указано, что он запрашивает необходимые предпосылки для записи в Program Files
.
Обратите внимание, что эта проблема (Program Files
недоступна для записи администраторами без повышения UAC) - это функция операционной системы, а не ограничение языка программирования, поэтому вы не решите эту проблему, просто "используя другую библиотеку". Если вы хотите, чтобы ваше приложение запускалось в Vista/Win7 и записывалось в Program Files
, вам потребуется высота UAC.
Ответ 2
Проверьте службу BITS:
http://msdn.microsoft.com/en-us/magazine/cc188766.aspx
Ответ 3
Для записи в каталог Program Files требуется высота UAC (если это разрешено пользователем) в Vista/Win7. См. Этот пример кода о том, как запрашивать разрешение пользователей: http://msdn.microsoft.com/en-us/library/aa970890.aspx
На самом деле, пожалуйста, подумайте о разработке своего приложения, чтобы он записывал в более подходящее место, где это не опасно перезаписывать критический файл программы.
Ответ 4
Как насчет попытки http://netsparkle.codeplex.com/. Порт очень успешной среды Mac Sparkle http://sparkle.andymatuschak.org/.
Ответ 5
Нужно ли действительно быть в Program Files? У меня была аналогичная проблема в приложении, и мы написали класс для устранения не установленных сборок, сначала попробовав их загрузить из подпапки% usersprofile%, а затем попытавшись загрузить. Это может быть легко, если вы добавите метод разрешения в текущее событие AssemblyResolve домена приложения.
AppDomain.CurrentDomain.AssemblyResolve+= AssemblyResolve;
public Assembly AssemblyResolve(object sender, ResolveEventArgs args)
{
//try to get locally
//try to download
return assembly;
}
Ответ 6
Не делай этого.
Теоретически это можно сделать легко. вы просто ждёте другое приложение, которое работает с правами администратора - вы можете запросить их в конфигурации. В приложении для обновления вы просто подключаетесь к защищенному (ssl) веб-сайту, загружаете все, что вам нужно, файлы, которые вы загружаете должны, должны быть криптографически подписаны.
Это также можно легко решить с помощью ClickOnce или другого веб-установщика, способного обновлять.
Что вы не должны делать, это просто загрузить небезопасную DLL из непроверенного источника и выполнить их.