По техническим причинам я не могу использовать ClickOnce для автоматического обновления моего приложения .NET и его сборок. Каков наилучший способ обработки автоматического обновления в .NET?
Какой лучший способ для .NET winforms приложения обновить себя, не используя ClickOnce?
Ответ 1
Я думаю, что Блок приложений Updater был чем-то вроде предшественника ClickOnce. Возможно, стоит исследовать. Глядя на его исходный код может быть достаточно, чтобы вызвать некоторые идеи.
Ответ 2
У нас есть продукт, который коммерчески/с открытым исходным кодом: wyBuild и wyUpdate. Он обладает способностью к исправлению и является простым в использовании.
Изменить: меня проголосовали за отрицательные числа, но мой пост был не просто вопиющей продажей. Наш updater, wyUpdate, является открытым исходным кодом, написанным на С# и лицензированным по лицензии BSD.
Я думал, что это может помочь любому, кто пытается создать обновитель с нуля, используя платформу .NET.
Но, проголосуйте, если вы должны.
Ответ 3
Около 3-4 лет назад я опубликовал пример, который находится вне приложения, если обнаружено обновление, приложение вызывает обновление и завершение обновления, затем обновления завершаются, и приложение перезапускается.
Я опубликовал пример на старом сайте GotDotNet... Я должен попытаться найти его.
Он работал идеально и занял около 1-2 часов, чтобы написать.
Ответ 4
Indigo Rose имеет продукт под названием TrueUpdate, который также делает это для вас. Я использовал их в прошлом как из управляемых, так и неуправляемых приложений. Это в основном файл, который вы кладете на свой сервер (http, ftp, все, что вам нравится). Затем вы вызываете клиентскую сторону EXE для проверки обновлений. Файл обновлений вытаскивается и имеет логику, чтобы определить, какая версия находится на клиенте (ваш выбор, обнаружение DLL, чтение ключа реестра и т.д.). Затем он найдет подходящий файл обновления для него и загрузит файл для выполнения. Он хорошо работает и с прокси.
Единственное, чего они не делают, это на самом деле создать патчи для вас. Вы должны сделать это вручную или с другим продуктом, который у них есть. Это коммерческое решение и работает достаточно хорошо, если вам это нужно.
Ответ 5
В качестве отправной точки для сворачивания собственных, вероятно, стоит посмотреть статью Алексея Фейнмана по MSDN, озаглавленную "Создание самонастраивающихся приложений с помощью .NET Compact Framework".
Ответ 6
Напишите свой собственный.
Я слышал, что их сложно записать в первый раз, но после этого все становится проще.
Так как я еще не написал (хотя и в моем списке), я могу дать вам некоторые из вещей, о которых я думал. Поддерживайте точные версии dll, так как это важно для самостоятельного обновления. И убедитесь, что программа обновления может обновить себя.
Ответ 7
В файле Program.cs сделайте что-то вроде этого:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Update();
Application.Run(new Form1());
}
private static void Update()
{
string mainFolder;
string updateFolder;
string backupFolder;
foreach (string file in
System.IO.Directory.GetFiles(updateFolder))
{
string newFile = file.Replace(
updateFolder, mainFolder);
if (System.IO.File.Exists(newFile))
{
System.IO.File.Replace(file, newFile, backupFolder);
}
else
{
System.IO.File.Move(file, newFile);
}
}
}
Кроме того, это может быть сделано рекурсивным, чтобы собрать структуру каталогов, если это необходимо. Это позволит вам обновить любую .dll в вашем проекте; все, фактически, вне основного .exe. Затем в другом месте вашего приложения вы можете иметь дело с получением файлов с вашего сервера (или где-либо), которые необходимо обновить, затем поместить в updateFolder и перезапустить приложение.
Ответ 8
В проекте давно, используя .NET Compact Framework 1.0, я написал приложение для автоматического обновления. Мы использовали функцию развертывания SqlCE CAB для получения файлов на устройстве (теперь вы должны использовать Sync Framework), и у нас был отдельный exe, который делал распаковку CAB и обновлял файлы.
Обновление будет выглядеть так: пользователю будет предложено обновить его, нажать кнопку и выйти из приложения пользовательского интерфейса. Экзаменатор exe возьмет на себя ответственность, доставит файл с сервера, резервное копирование текущих DLL и распакует файл кабины с помощью wceload. Затем пользовательский интерфейс будет перезапущен, и если он не удался, обновление будет отменено. Это по-прежнему интересный сценарий для компактных устройств, но теперь есть лучшие инструменты, чем просто SQL.
Я бы, конечно, посмотрел на блок приложений и рамки синхронизации, чтобы реализовать это, если clickonce не является вариантом. Но я предполагаю, что вам все равно понадобится отдельный исполняемый файл, потому что dll, который вы хотите перезаписать, вероятно, заблокирован файлом во время использования exe, как и один из предыдущих ответов.
Ответ 9
Я написал свой собственный autoupdater, autoupdater использует общий файл конфигурации для приложения, который содержит URL-адреса для загрузки последних версий из /check, если необходимо обновить.
Таким образом вы запускаете программу обновления, которая либо обновляет приложение, либо нет, а затем запускает приложение, которое как часть нормальной работы проверяет обновленный updater и исправляет это.