Программная загрузка файла .NET для развертывания/обновления

Последние несколько дней я пытался настроить домашний FTP-сервер, но мой брандмауэр доставляет мне массу хлопот.

Моя цель — эмулировать функциональность приложения Click-Once в приложении Portable .NET. У меня есть готовый переносимый EXE-файл с несколькими папками данных для чтения/записи в одном каталоге, доступ к которым осуществляется во время выполнения с помощью My.Application.info.directorypath. По этой причине я не хочу делать опубликованное приложение с установкой, потому что многие пользователи не имеют прав на запись в каталог своих программных файлов. Кроме того, у меня есть пользователи, использующие WINE на Mac/Linux, а также пользователи XP. Я думаю, что будет проблематично попытаться получить ту же совместимость, что и сейчас, если я откажусь от портативности.

Мой план состоит в том, чтобы написать второе приложение, которое будет функционировать как средство запуска/обновления. Он будет использовать веб-клиент для чтения размещенного файла с текущим номером версии программного обеспечения. Если он устарел, он предложит пользователю и затем использует WebClient.DownloadFile для загрузки заархивированного пакета новейшего программного обеспечения. Замените старое на новое, а затем запустите приложение.

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

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

Я рассматриваю возможность использования Squirrel.Windows, но тогда ни один из моих пользователей WINE или XP не сможет использовать его.


person Matt    schedule 10.05.2017    source источник
comment
В фоновом режиме означает тайно? Это может быть невозможно в зависимости от модели развертывания; модуль обновления может потребоваться запустить от имени администратора. В этом нет ничего плохого — пользователи должны знать, когда их программное обеспечение что-то обновляет в их системе.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 10.05.2017
comment
ClickOnce не устанавливает приложение в папку Program Files, оно устанавливает приложение в папку данных приложения пользователя в разделе Мои документы.   -  person Jason Bayldon    schedule 10.05.2017
comment
@Plutonix Я не согласен с тем, что предоставление доступа администратору приложения просто для предупреждения пользователей о необходимости обновления является правильным (безопасным) способом обновления приложения.   -  person Jason Bayldon    schedule 10.05.2017
comment
Как я уже сказал, в зависимости от того, как он развернут, он может потребоваться.   -  person Ňɏssa Pøngjǣrdenlarp    schedule 10.05.2017
comment
@Plutonix Я не обязательно имею в виду секрет. Я не хочу вызывать «Process.Start(URL)» и заставлять пользователей вручную размещать файл архива. Просто хотите получить подсказку MessageBox с ответом «Да/Нет», если вы хотите обновить.   -  person Matt    schedule 10.05.2017
comment
@Matt Я бы по-прежнему был неравнодушен к развертыванию ClickOnce, поскольку вы могли бы все упростить и развернуть прямо в Azure через VS. VS развертывает новый манифест, и ваше приложение пингует конечную точку манифеста для проверки и обновления до последней версии (возможно, запрашивая у пользователя). Однако вам придется протестировать его на разных устройствах, похоже, ClickOnce поддерживается в WINE, вам просто нужно установить .NET. Я знаю, что ClickOnce отлично работает на XP, Win 7 и Win 10. Но что бы вы ни выбрали, удачи!   -  person Jason Bayldon    schedule 10.05.2017
comment
Спасибо, сэр. Развертывание очень запутанное.   -  person Matt    schedule 10.05.2017


Ответы (1)


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

SomeLauncher.exe
-> application sub-folder -> TheAppToRun.exe

Я думаю, что таким образом вы избежите проблем с блокировкой файлов.

Изменить: WebClient https://msdn.microsoft.com/en-us/library/ez801hhe(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2

    Dim client As New System.Net.WebClient()
    client.DownloadFile("http://path/to/file.zip", "c:\some\path")
    client.Dispose();
person Jason Bayldon    schedule 10.05.2017
comment
Джейсон, это именно то, что я пытался описать выше. Проблема в части загрузки. Как реализовать «WebClient.DownloadFile» из приложения .NET? У меня возникли проблемы с получением чего-либо, кроме html для файлов, а не фактического файла RAW. Возможно, это было просто ограничение используемого мной файлообменника. - person Matt; 10.05.2017
comment
@Matt Я не знаю, как обращаться с этим типом файлов, но я связался с документацией для MSDN. Посмотрите, работает ли он для вашего типа файла. - person Jason Bayldon; 10.05.2017
comment
Вот как я реализовал это в своем приложении Launcher. Это должен быть мой файлообменник. Можете ли вы порекомендовать файловый хост, который позволяет программную загрузку файлов? Сейчас смотрю на Azure. - person Matt; 10.05.2017
comment
Я не думаю, что хосты заботятся конкретно о программных загрузках файлов, просто ваш текущий провайдер, вероятно, блокирует загрузку этого расширения. В зависимости от ваших потребностей вы можете обратить внимание на Azure, так как ваши расходы на пропускную способность, вероятно, будут относительно дешевыми. Виртуальный хостинг может быть более выгодным с экономической точки зрения, если вам нужно больше функциональности, чем простой файловый хостинг. Обязательно используйте калькуляторы цен для облачных вариантов, но IMO сначала попробуйте Azure, так как вы, вероятно, получите бесплатную пробную версию. - person Jason Bayldon; 10.05.2017