Установщик не будет перезаписывать существующее приложение - PullRequest
27 голосов
/ 10 июня 2011

У меня есть решение Visual Studio 2010 с 8 проектами.Он также имеет проект установки, который я создаю для создания установки.

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

Если они запускают установку, не удаляя ее, кажется, что она не перезаписывает существующие файлы (например, какну как дллс).Обычно это просто exe, который изменяется.Однако, это не перезаписывает это.Версия на клиентском компьютере, кажется, остается прежней.

Есть ли способ заставить его перезаписать?

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

Ответы [ 8 ]

34 голосов
/ 22 июня 2011

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

Если у вас есть проект установки Visual Studio, у вас есть несколькосвойства, которые участвуют в процессе обновления

1) Код обновления - это ссылка между установщиками того же рода, и вы не должны менять этот код без необходимости

2) Номер версии- странно, что для сравнения используются только первые 3 цифры (major.minor.build) (это распространенная ошибка, которую допускают многие разработчики)

3) Код продукта - Как только вы измените версиюNumber VS предложит вам изменить это число - сделайте это - если вы автоматизируете изменение номера, не забудьте также сделать это

4) DetectNewerInstalledVersion - установить в True

5) RemovePreviousVersions - установить вПравда

Лично я бы посмотрел на использование WiX для такой небольшой установки, т.е. если вы можете сделать это в VisualStudio, тогда версия WiX

Мой установщик для OpenCover выглядит следующим образом

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi" >

<Product Id="*" Name="OpenCover" Language="1033" Version="!(bind.FileVersion.OPENCOVER_FRAMEWORK_DLL)" 
        Manufacturer="OpenCover @ GitHub" UpgradeCode="2250c3f1-d9ba-44d8-b4db-25f91fe92dc6">

    <Package InstallerVersion="200" Compressed="yes" />

    <Upgrade Id="2250c3f1-d9ba-44d8-b4db-25f91fe92dc6">
        <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND" Minimum="1.0.0.0" IncludeMinimum="yes"
                        Maximum="!(bind.FileVersion.OPENCOVER_FRAMEWORK_DLL)" IncludeMaximum="no" />

        <UpgradeVersion OnlyDetect="yes" Property="NEWERFOUND" Minimum="!(bind.FileVersion.OPENCOVER_FRAMEWORK_DLL)"
                        IncludeMinimum="yes" />
    </Upgrade>

    <Media Id="1" Cabinet="media1.cab" EmbedCab="yes" />

...

</Wix>

Надеюсь, вы найдете вышеуказанное полезным

5 голосов
/ 19 июня 2011

В свойствах проекта установки измените номера версий / сборок. Это предложит вам разрешить создание нового GUID. Это говорит установщику, что у вас есть новая версия, и позволит автоматически удалить старую версию программы и установить новую систему MSI.

4 голосов
/ 17 июня 2015

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

1) Перейдите в Свойства проекта> Приложение> Информация о сборке ...

2) Увеличьте сборку иНомера версий файлов

3) Снова соберите установку, и установка должна перезаписать старый .exe

Надеюсь, это кому-нибудь поможет.

4 голосов
/ 26 июня 2013

Это старая запись, но добавляющая ее для людей, которые могут прийти к ответу.

Я столкнулся с этой самой проблемой даже после того, как следовал всем данным здесь письму. Моя проблема заключалась в том, что версия программы на C # не будет увеличиваться при каждой сборке, несмотря ни на что. Даже после того, как я вручную отредактировал AssemblyInfo.cs, версия сгенерированного exe-файла все равно будет 1.0.0.0. В результате установка не заменит файл.

Обходной путь - добавить условие запуска в узел «Первичный вывод из проекта XYZ» (или что-то еще, что вы хотите перезаписать) в проекте установки. Это приводит к тому, что установщик удаляет файл при запуске новой установки. Теперь, когда пользователь запускает приложение, появляется окно о том, что приложение настраивается, новые файлы копируются в папку приложения и приложение запускается. Это простой метод проб и ошибок. Я понятия не имею, почему это работает таким образом (и мне нужно немного кофе, потратив всю ночь на попытки выяснить это:)).

  1. Щелкните правой кнопкой мыши по вашему проекту установки >> Просмотр >> Условия запуска
  2. Щелкните правой кнопкой мыши «Требования к целевому компьютеру» >> Добавить условие запуска файла
  3. Узел («Поиск файла1») появится в разделе «Поиск целевой машины», а другой узел («Условие1») появится в разделе «Условия запуска»
  4. Нажмите «Найти файл1» и измените его свойство FileName на что-то, что должно существовать ранее (например, «Notepad.exe», почти всегда)
  5. Обратите внимание, что "Папка" установлена ​​в "[SystemFolder]", а "Свойство" установлена ​​в "FILEEXISTS1"
  6. Теперь нажмите «Основной вывод» из проекта XYZ или любого другого узла и в окне свойств установите «Условие» на «FILEEXISTS1» в точности так, как оно было показано выше
1 голос
/ 22 марта 2018

AssemblyVersion & AssemblyFileVersion следует увеличивать для перезаписи сборки (exe / dll) вместе с другими настройками, о которых упоминал @shaun wilde

0 голосов
/ 15 апреля 2016

Были похожие проблемы с файлами, которые не перезаписывались.Проверенные номера версий, коды продуктов / обновлений, все.Наконец мне помогло это сообщение на MSDN .В частности, здесь, при использовании Orca для проверки файла msi:

Я также изменил последовательность RemoveExistingProducts в таблице> InstallExecuteSequence с 6550 на 1525 (после InstallExecute to after> InstallInitialize).

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

Если кто-то еще столкнется с этой проблемой, как я недавно, надеюсь, этот обходной путь поможет.

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

Немного уточняя ответы, вы должны увеличить версию файла, чтобы установщик Windows перезаписывал во время обновления.Это не обязательно то же самое, что увеличение версии сборки, как указали некоторые.Только версия файла требует приращения, и с помощью управляемого кода вы делаете это с AssemblyFileVersion.В качестве версии файла по умолчанию используется версия сборки, но AssemblyFileVersion позволяет вам сделать их разными, если у вас есть клиентские сборки, которые зависят от конкретного AssemblyFileVersion.

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

У меня была такая же проблема. Лучший способ убедиться в этом - убедиться, что ваш исполняемый файл, т.е. сам Application.exe, имеет более высокую версию, чем предыдущая.

Просто нажмите на свойства проекта (не на проект установки) и установите более высокую версию приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...