Как обновить EXE от удаленного хоста - C # 4.0 - WPF приложение

StackOverflow https://stackoverflow.com/questions/8409236

  •  29-10-2019
  •  | 
  •  

Вопрос

Я хочу обновить свой exe с удаленного сервера.Поэтому, когда кнопка нажала на моем приложении WPF, он загрузит пульт дистанционного управления, а также удаленный файл TXT и замените текущие в той же папке, которая EXE работает.Так что он перезаписывает текущий файл TXT и EXE, а мой EXE работает.Как я могу добиться этого?

Удаленный хост является URL, как www.mydomain.com/MyAPP.exe

Приложение WPF, C # 4.0

Это было полезно?

Решение

Способ, которым мы решили эту проблему, заключался в создании исполняемой оболочки, которая была установлена и развернута изначально на клиентских машинах.

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

Вот ядро «настоящего» приложения, запускаемого из оболочки:

родовое слово

Обратите внимание, что в нашей версии приложение оболочки собирает имя пользователя и пароль от пользователя для правильного доступа к веб-сайту обновления.Затем эти данные передаются в «настоящее» приложение с помощью метода SetData в домене приложения.

Другие советы

Решение зависит от вашего конкретного случая. Но нет прямого решения, потому что вы не можете обновлять сборки, пока они загружаются в память и используются. Я могу предложить 2 решения: с использованием Теневое копирование и используя какой-то помощник исполняемый. Я использовал оба из них.

<Сильные> теневые копия.

Очевидный способ - сделать ваш основной исполняемый файл, чтобы его копировали тень, заменить его, пока ваше приложение запущено, а затем перезагрузите приложение. Но вы не можете сделать свой домен приложения по умолчанию , чтобы быть тенью скопированы, могут быть только вторичные домены приложений. Но вы все равно можете переместить весь свой код в другую сборку (скажем, MainaPPlib.dll) и переписать основной исполняемый файл приложения (Mainapp.exe), чтобы он содержит только «код загрузки». Этот код загрузчика должен создать еще один домен приложений, установите его, чтобы его копировали тень, а затем запустить логику программы во вторичном домене приложения. Остерегайтесь, чтобы не иметь никаких прямых ссылок из основного домена приложения в MainaPPlib.dll, потому что тогда эта сборка будет загружена в ваш основной домен приложений, который не копирован тень, и файл сборки будет заблокирован. В большинстве случаев вы можете пойти с appdomain.executeass см. () Методы.

HELPER исполняемый

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

p.s. лично я предпочитаю прежнее решение, потому что он включает в себя какую-то волшебство Voodoo, используя домены приложений, отражение, сборки E.T.C. И это может быть превращено в использование плагинов, если вам нужно (например, через MEF Framework ). Но последнее проще понять, особенно если вы никогда не работали с доменами приложений и ручной сборки, это довольно просто.

Возможно, вы можете использовать clickOnce (на основе вашего комментария вышеВы будете готовы иметь другую сборку получить EXE .... Как упомянул другой плакат, вы не можете заменить бегущую сборку).Вы можете настроить его, чтобы проверить в разное время (например, на Startup) для новых версий, и он автоматически загружает их.Это очень надежное решение, и вы можете многое сделать с монтажами развертывания.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top