Как установить функцию всегда

В моем установщике есть функция под названием «MyDatabase», которая показывает диалоговое окно для ввода «server, dbname, user, pwd» и создает указанную базу данных.

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

Мне удавалось каждый раз показывать диалог, чтобы получать информацию от пользователя. Но он не устанавливает db, кроме как в первый раз.

Как я могу заставить его устанавливать каждый раз?


person GaneshT    schedule 28.04.2015    source источник
comment
Есть ли в этом приложении сопутствующий файл application.exe? Если это так, установите копию базы данных, доступную только для чтения, скопируйте ее в место, доступное для записи, и инициализируйте через свое приложение, а не вашу установку. Вы можете делать это сколько угодно раз.   -  person Stein Åsmul    schedule 28.04.2015


Ответы (3)


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

Вы можете обойти это, установив компонент постоянным, как описано в этом ответе: Подсчет ссылок MSI: два продукта устанавливают одни и те же MSI. Однако лучшая концепция - установить только файлы, доступные только для чтения, и использовать само приложение для инициализации пользовательских данных (ini-файлов, баз данных, файлов настроек xml и т. Д.) ), скопировав шаблоны только для чтения в профиль пользователя и / или установив их с помощью внутренних значений по умолчанию приложения (определенных в исходном коде). Это отделяет развертывание пользовательских настроек и файлов данных от установщика, избегая случайного удаления пользовательских данных и позволяя обрабатывать все настройки пользовательских данных из приложения с повышенной гибкостью и контролировать это. И вы избегаете усложнения своей настройки, которая более чем достаточно сложна, как описано здесь: Каковы преимущества и реальная цель установки программы?

Многие люди считают, что их установка должна удалить все пользовательские данные. Не ходите туда. Я, как и многие другие, считаю, что все, что изменяет пользователь, является пользовательскими данными и должно оставаться в покое на случай, если пользователь переустановит продукт или если они хотят сохранить свои данные для импорта в другие приложения. Вместо этого вы можете задокументировать, где хранятся данные, и позволить людям или системным администраторам очистить это вручную. Очистка всех пользовательских данных повлечет за собой очистку всех пользовательских профилей. Хотя вы можете использовать такие концепции, как ActiveSetup для этого (другое объяснение ActiveSetup) обычно больше проблем, чем оно того стоит, и подвержено ошибкам.

Для более полного понимания концепции GUID компонента см. Этот ответ: Измените GUID моего компонента в wix ? (рекомендуется прочитать для вашего случая использования). Вот обсуждение installsite.net о том, как инициализировать и обновить профиль пользователя и данные пользователя: http://forum.installsite.net/index.php?showtopic=21552

Подобные ответы (для отслеживания) - я пишу одно и то же снова и снова ;-):

person Stein Åsmul    schedule 28.04.2015

Что касается диалогового окна, то диалоговые окна в этой установке будут управляться условиями, и обычно у вас будет что-то вроде диалогового окна приветствия в InstallUISequence с условием, которое включает «Не установлено», поэтому оно отображается только в первый раз. Так что это должно быть то, что у вас есть, что заставляет диалог БД отображаться только в первый раз. Вам нужно будет изменить условие и результирующий поток диалогов («Далее», «Назад» и т. Д.), Чтобы включать это диалоговое окно каждый раз, когда вы добавляете функцию или любое другое условие.

Другая половина состоит в том, что где-то должен быть код, настраиваемое действие, которое также должно запускаться только при первой установке с таким условием, как «Не установлено». Так что вы найдете это и зададите ему такое же условие, как и диалог. Возможно, вам придется подумать о том, что на самом деле означает «каждый раз при запуске установщика»? Вероятно, это не деинсталляция; во время ремонта? Когда функции удаляются?

Такие вещи обычно (по крайней мере, по моему опыту) выполняются с реальным приложением, а не через повторную установку. Вы не получаете этих вопросов «когда я запускаю это»; кодирование и отладка также намного проще.

person PhilDW    schedule 28.04.2015

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

Итак, я создал отдельное приложение C # для Windows и включил это приложение в установщик. Пользователь может запускать приложение столько раз, сколько необходимо, и запускать скрипты sql (встроенные как файл ресурсов в приложение) по мере необходимости.

person GaneshT    schedule 14.05.2015