Вопрос о написании фонового / автоматического / тихого загрузчика / установщика для приложения на C # - PullRequest
12 голосов
/ 11 февраля 2011

Справочная информация: У меня есть основное приложение, которое должно иметь возможность выходить в Интернет и загружать связанные с ним DLL-файлы (которые мы пишем, расположенные на нашем сервере).Это действительно должно быть в состоянии загрузить эти файлы DLL в папку приложения в "C: \ Program Files \".В прошлом я использовал System.Net.WebClient для загрузки любых файлов, которые я хотел из Интернета.

Проблема У меня было много проблем с загрузкой данных в прошлом и сохранением в файлы на жестком диске пользователя.Я получаю много сообщений о том, что это не работает и, как правило, из-за проблем с правами пользователя в программе.

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

Я хочу, чтобы это работало так же, как и все другие программы, которые я видел, загружал / устанавливал в этой версии (например, обновления Firefox Pluign, Flash Player, JAVA, Adobe Reader и т. Д.).Все это работает без помех.

Вопрос Есть ли какой-то код, который мне нужно использовать, чтобы дать моей программе-загрузчику особые права на папку Program Files?Могу ли я даже сделать это?Есть ли лучший класс или библиотека, которую я должен использовать?Есть ли другой подход к загрузке файлов, который я должен использовать, например, использование потоков или что-то еще для загрузки данных?

Любая помощь здесь приветствуется.Я хочу стараться держаться подальше от сторонних приложений / библиотек, если это вообще возможно, кроме Microsoft, конечно, из-за проблем с лицензированием, но все же отправлять любые предложения в мою сторону.

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

Ответы [ 6 ]

3 голосов
/ 13 февраля 2011

Обычный способ сделать это выглядит так:

  1. Ваше приложение обнаруживает, что требуется обновление.
  2. Ваше приложение запускает другое приложение (средство обновления), которое загрузит необходимые файлы и установит их в Program Files. Это приложение для обновления должно работать с правами администратора (т. Е. Запрашивать повышение прав UAC в Vista / Win7). Самый простой способ убедиться в этом - добавить манифест приложения в это приложение обновления .

Если пользователь является администратором с включенным UAC, пункт 2 приведет к появлению приглашения UAC, которое должно быть принято (обратите внимание, что то же самое относится и к обновлениям Firefox / Acrobat / и т. Если пользователь не является администратором, его попросят ввести учетные данные администратора. (Обратите внимание, что это хорошо: только администратору должно быть разрешено обновлять приложения, установленные для всех пользователей.)

Ваше приложение для обновления не нужно писать специальным образом: оно может использовать System.Net.WebClient, как и раньше. Манифест приложения гарантирует, что он запрашивает необходимые разрешения для записи в Program Files.

Обратите внимание, что эта проблема (Program Files недоступна для записи администраторам без повышения UAC) является функцией операционной системы, а не ограничением языка программирования, поэтому вы не сможете решить эту проблему, просто "используя другую библиотеку". Если вы хотите, чтобы ваше приложение работало в Vista / Win7 и записывало в Program Files, вам понадобится повышение прав UAC.

1 голос
/ 11 февраля 2011

Ознакомьтесь с услугой BITS:

http://msdn.microsoft.com/en-us/magazine/cc188766.aspx

0 голосов
/ 13 февраля 2011

Действительно ли это должно быть в программных файлах?У меня была похожая проблема в приложении, и мы написали класс для разрешения неустановленных сборок, сначала пытаясь загрузить их из подпапки% usersprofile%, а затем пытаясь загрузить.Это может быть беспрепятственно, если вы добавите метод разрешения в событие AssemblyResolve текущего домена приложения.

    AppDomain.CurrentDomain.AssemblyResolve+= AssemblyResolve;
    public Assembly AssemblyResolve(object sender, ResolveEventArgs args)
    {
         //try to get locally

         //try to download
         return assembly;
    }
0 голосов
/ 11 февраля 2011

Не делай этого.

Теоретически это можно сделать легко. Вы просто запускаете другое приложение, которое запускается с правами администратора - вы можете запросить их в конфигурации. В приложении для обновления вы просто подключаетесь к безопасному (ssl) веб-сайту, загружаете все, что вам нужно, загружаемые файлы должны иметь криптографическую подпись

Эту проблему также можно легко решить с помощью ClickOnce или другого веб-установщика с возможностью обновлений.

Чего не следует делать, так это просто загружать небезопасные библиотеки DLL из непроверенного источника и запускать их.

0 голосов
/ 11 февраля 2011

Как насчет попытки http://netsparkle.codeplex.com/. Порт очень успешного фреймворка Mac Sparkle http://sparkle.andymatuschak.org/.

0 голосов
/ 11 февраля 2011

Запись в каталог Program Files требует повышения UAC (если у пользователя это включено) в Vista / Win7. Посмотрите этот пример кода о том, как запросить у пользователей разрешение: http://msdn.microsoft.com/en-us/library/aa970890.aspx

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

...