Как предотвратить запуск установщика при удалении файлов данных приложения? - PullRequest
1 голос
/ 31 августа 2011

У меня есть приложение, написанное на VB.Net с Visual Studio 2005. Приложение позволяет пользователю создавать и сохранять файлы проекта. Когда я распространяю приложение, я включаю некоторые демонстрационные файлы проекта, которые я устанавливаю в общую папку данных приложения.

XP - C: \ Documents and Settings \ Все пользователи \ Данные приложения

Vista & 7 - C: \ Program Data

Я обнаружил неожиданное поведение - если какой-либо файл в общей папке данных приложения удаляется, и приложение запускается из меню «Пуск», то запускается процедура установки и попытается восстановить отсутствующие файлы. Если файл MSI больше не существует в его исходном местоположении или был изменен, то приложение не будет работать. Я чувствую, что это «особенность», но я ее не хочу. Может кто-нибудь сказать мне, что происходит и как я могу избежать этого?

Некоторые подробности:

  • Я создал пакет установки с помощью развертывания Visual Studio проект.

  • Такое поведение не произойдет, если я запусту EXE-файл напрямую. я поэтому ожидать, что поведение как-то связано с ярлык меню Пуск. Я заметил, что ярлык не является нормальным ярлык - у него нет «Целевого местоположения».

Весь совет приветствуется.

-TC

1 Ответ

1 голос
/ 01 сентября 2011

Я узнал, что это поведение включает в себя то, что называется «Установка по требованию» (иначе «Самовосстановление»).Необычные ярлыки, созданные пакетом установки, называются «Advertised Shortcuts».Теперь, когда у меня есть название проблемы, легко найти информацию о том, как ее решить.В частности:

Эти страницы содержат огромное количество информации.Для удобства других, кто может наткнуться на этот пост, я суммирую то, что они говорят:

Рекламируемые ярлыки - это специальные ярлыки, которые делают некоторые причудливые вещи.В частности, они переустанавливают поврежденное приложение перед запуском своей цели.Есть некоторые споры о том, являются ли они добрыми, злыми или безвредными.По моему мнению, они делают то, чего большинство пользователей не ожидают, и это делает их злыми.Поэтому я хотел бы отключить их для своего приложения.

Проекты установки Visual Studio автоматически создают пакеты MSI, которые по умолчанию генерируют объявленные ярлыки.При установке пакета MSI легко изменить это значение по умолчанию, используя DISABLEADVTSHORTCUTS = 1 в качестве аргумента командной строки для Setup.exe.Кроме того, с помощью такой утилиты, как Orca, вы можете вручную изменить значение по умолчанию, вставив DISABLEADVTSHORTCUTS = 1 в качестве свойства MSI.Однако, если вы хотите, чтобы Visual Studio автоматически создавал пакеты MSI, которые не создают объявленные ярлыки, это сложнее.Я сделал это следующим образом:

  1. Сначала я создал файл VBS, используя код DisableAdvt, предоставленный Гэри Чангом в одной из ссылок выше (я повторил этот код ниже).Просто создайте текстовый файл, вставьте в код.и сохраните его как DisableAdvt.vbs.

  2. Затем создайте событие после сборки для своего проекта установки.Точный синтаксис зависит от расположения ваших файлов.Поскольку мой DisableAdvt.vbs находится в подпапке «Инструменты» папки решения, мое событие после сборки выглядит следующим образом:

    • "$ (ProjectDir) .. \ Tools \ DisableAdvt \ DisableAdvt.vbs"" $ (BuiltOuputPath) "

Это все, что мне нужно было сделать.Он работает как шарм.

-TC

Некоторые примечания:

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

Orca - это утилита, которую можно использовать для ручной вставки свойства DISABLEADVTSHORTCUTS в файл MSI.С моим подходом Орка не нужна.Тем не менее, это полезно для проверки того, что событие сборки вносит ожидаемые изменения.

В событии сборки ошибочное написание "BuiltOuputPath" является преднамеренным.

Вот код DisableAdvt.vbs Гэри Чанга (обратите внимание, что я исправил опечатку в строке 21 - Очень важно!):

Option Explicit

Const msiOpenDatabaseModeTransact = 1
Dim argNum, argCount:argCount = Wscript.Arguments.Count

Dim openMode : openMode =  msiOpenDatabaseModeTransact

' Connect to Windows installer object
On Error Resume Next
Dim installer : Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer") :
CheckError

' Open database
Dim databasePath:databasePath = Wscript.Arguments(0)
Dim database : Set database = installer.OpenDatabase(databasePath, openMode) : CheckError

' Process SQL statements
Dim query, view, record, message, rowData, columnCount, delim, column

query = "INSERT INTO Property(Property, Value) VALUES ('DISABLEADVTSHORTCUTS', '1')"  
Set view = database.OpenView(query) : CheckError
view.Execute : CheckError

database.Commit

If Not IsEmpty(message) Then Wscript.Echo message
Wscript.Quit 0

Sub CheckError
  Dim message, errRec
  If Err = 0 Then Exit Sub
  message = Err.Source & " " & Hex(Err) & ": " & Err.Description
  If Not installer Is Nothing Then
    Set errRec = installer.LastErrorRecord
    If Not errRec Is Nothing Then message = message & vbLf & errRec.FormatText
  End If
Fail message
End Sub

Sub Fail(message)
  Wscript.Echo message
  Wscript.Quit 2
End Sub
...