Программа установки Project не заменяет файлы сборки - PullRequest
8 голосов
/ 03 ноября 2010
  1. У меня есть проект приложения Windows (A.exe), который вызывает другой проект библиотеки классов (B.dll).

  2. A.exe имеет кнопку(myButton), который вызывает метод Method1 из B.dll.

  3. Чтобы установить приложение, я создал проект установки ASetup.vdproj, основной вывод которого - проект A.

  4. После компиляции установки установка запускается без проблем, при запуске A.exe и нажатии myButton приложение не выдает ошибки.

  5. Затем я изменилB.dll и добавил новый метод Method2.

  6. myButton теперь вызывает Method2 из B.dll вместо Method1.

  7. Я увеличилверсию A.exe и увеличьте версию ASetup.vdproj, но не увеличивайте версию B.dll.

  8. После установки приложения я заметил, что у меня было две установки A.exe в панели управления -> Установка и удаление программ.

  9. При запуске A.exe иНажмите кнопку myButton. Я получаю сообщение об ошибке «Метод Method2 не найден в B.dll», это означает, что во время установки программа установки не заменяет B.dll.

  10. Я запустилудалите, и я заметил, что файлы не были удалены с диска.

Мой вопрос:

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

Я жду отзывов от всех вас.Спасибо за все внимание.

Ответы [ 2 ]

6 голосов
/ 03 ноября 2010

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

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

2 голосов
/ 03 ноября 2010

Помимо проблемы, упомянутой @Christopher Painter, скорее всего, есть еще одна проблема: проект установки, созданный с помощью Visual Studio (2008), будет заменять файлы только при увеличении номера версии.Очевидным решением будет просто увеличить все номера версий;однако это не всегда может быть тем, что вам нужно.

Поведение MSI-файла в основном определяется моментом выполнения действия RemoveExistingProducts .Установщики, созданные в VS 2008, планируют это действие после установки нового продукта.Модифицированные сборки, чья версия не была увеличена, поэтому не заменяются.Некоторые подробности о поведении обновления описаны в этой теме:

RemovePreviousVersions=True, но предыдущая версия не удаляется с целевого компьютера

Чтобы изменить поведение, вы можете пропатчить созданный MSI-файл, чтобы действие RemoveExistingProducts было выполнено до установки нового продукта (на самом деле это было поведение, если вы создали установкус Visual Studio 2005).Например, исправление можно выполнить с помощью небольшого VBScript, который выполняется как шаг после сборки:

Dim objInstaller
Dim objDatabase
Dim objView
Dim objResult

Dim strPathMsi 

If WScript.Arguments.Count <> 1 Then
    WScript.Echo "Usage: cscript fixRemovePreviousVersions.vbs <path to MSI>"
    WScript.Quit -1
End If

strPathMsi = WScript.Arguments(0)

Set objInstaller = CreateObject("WindowsInstaller.Installer")
Set objDatabase = objInstaller.OpenDatabase(strPathMsi, 1)
Set objView = objDatabase.OpenView("UPDATE InstallExecuteSequence SET Sequence=1450 WHERE Action='RemoveExistingProducts'")

WScript.Echo "Patching install sequence: UPDATE InstallExecuteSequence SET Sequence=1450 WHERE Action='RemoveExistingProducts'"
objView.Execute
objDatabase.Commit

WScript.Quit 0
...