После долгих экспериментов и пошагового объединения различных онлайн-ресурсов я нашел полное рабочее решение.Поскольку есть очень много запутанных шагов для достижения конечного результата: для блага тех, кто заинтересован, я делюсь этим здесь.
В этом объяснении для обозначения имени приложения будет использоваться <app>
или [app]
.Я буду использовать последние скобки в тех случаях, когда использование первых может создать путаницу.
Предварительные требования для загрузки
Сначала убедитесь, что у вас есть только один работающий экземпляр Visual Studio.
Далее вам нужно будет открыть Инструменты> Расширения и обновления и загрузить, а затем установить Проекты установщика Microsoft Visual Studio 20xx .
После завершения загрузки установите его и перезапустите Visual Studio.
Создание базового установщика
Затем создайте новый проект установщика, добавив проект типа Установщик Visual Studio> Проект установки.Добавьте проект (ы), чьи результаты вы хотите в установщике, в проект установщика.Это создает предварительно настроенный простой установочный файл MSI при сборке.
Далее щелкните правой кнопкой мыши свое решение в обозревателе решений и перейдите к Зависимости проекта .Убедитесь, что ваш проект установщика зависит от вашего установленного проекта.
Затем щелкните правой кнопкой мыши свой проект установщика в обозревателе решений и откройте оттуда Configuration Manager (или откройте его из своего решения или из меню строки заголовка), затем включите для проекта установщика Build ,
Щелкните правой кнопкой мыши по проекту установщика и перейдите к Просмотр файловой системы .Откройте папку Application на левой панели, затем щелкните правой кнопкой мыши папку, чтобы Add> Project Output ... Выберите Primary Output вашего приложения.Здесь вы также можете добавить любые вспомогательные файлы, которые создаются как часть процесса сборки.
Теперь у вас есть рабочая, «тестируемая» 1 простая настройка после построения решения.
Добавление пользовательской переменной
В этом примере мы будем использовать пользовательское действие для передачи простого ввода текста в новое приложение <app>.exe.config
файл.
Наша пользовательская переменная будет путем к серверу SQL приложения.Я предполагаю, что эта переменная называется «Сервер» в файле <app>.exe.config
.
Щелкните правой кнопкой мыши пользовательский установщик и перейдите к Вид> Пользовательские действия .Добавьте пользовательское действие Install , щелкнув правой кнопкой мыши по этой папке и выбрав Add .Откроется довольно странное окно, в котором вас попросят «Выбрать элемент в проекте».Измените папку «Look In», чтобы она указала на Файловая система на целевом компьютере> Папка приложения> [приложение] .Нажмите Добавить вывод ... и добавьте вывод основного приложения, настройки которого вы хотите изменить. 2 В левом окне теперь должен быть элемент, обозначающий Первичный вывод из (Активно)
Выберите это и измените CustomActionData
в окне Свойства .Мы изменили это значение, чтобы оно было точно /SqlPath=[SQLPATH] /TargetDir="[TARGETDIR]\"
.Кодировка этих данных работает следующим образом: 3
Start with a single forward slash "/"
Encode the variables as [name-in-installer-class]=[name-in-installer-project]
If your name in the installer project contains spaces you must surround it with double quotes
Separate each variable with a space and forward-slash or " /"
TARGETDIR is a special variable and is encoded as [name-in-installer-class]="[TARGETDIR]\"
Перейдите к Вид> Интерфейс пользователя в проекте установщика.Под Install> Start добавьте новую форму типа Textboxes (A)
.В окне свойств отключите нижние 3 текстовых поля, затем установите следующие переменные:
BannerText
в качестве заголовка окна (например, «База данных») BodyText
,необязательное дополнительное описание этого шага установки Edit1Label
, «путь к серверу SQL» Edit1Property
, в точности «SQLPATH» Edit1Value
Значение по умолчанию дляПуть к SQL-серверу.
Затем добавьте класс установщика в проект, для которого мы хотим изменить настройки. Добавить> Новый элемент , затем поискать в шаблонах «Класс установщика».Настройте его следующим образом.(Замените «APPNAME» в коде именем исполняемого файла):
Imports System.ComponentModel
Imports System.Configuration
Public Class clsInstaller
Inherits System.Configuration.Install.Installer
Public Sub New()
MyBase.New()
'This call is required by the Component Designer.
InitializeComponent()
'Add initialization code after the call to InitializeComponent
End Sub
Public Overrides Sub Install(ByVal stateServer As System.Collections.IDictionary)
MyBase.Install(stateServer)
' Change the Application settings' 'database connection' setting.
' Note: targetDirectory contains an extra '\' at the end.
Dim targetDirectory As String = Context.Parameters("TargetDir")
Dim str As String = ""
'For some reason custom fields are sent escaped to the installer class.
'This undoes the escaping of the directory slashes.
Dim sqlServerPath As String = Context.Parameters("SqlPath").Replace("\\", "\")
Dim executablePath As String = String.Format("{0}APPNAME.exe",
targetDirectory.Substring(0, targetDirectory.Length - 1))
Dim config As Configuration =
ConfigurationManager.OpenExeConfiguration(executablePath)
If config Is Nothing Then
MessageBox.Show("Failed to load configuration file", "Error",
MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Dim sectionGroup As ConfigurationSectionGroup =
config.GetSectionGroup("applicationSettings")
Dim configSection As ConfigurationSection =
sectionGroup.Sections("APPNAME.My.MySettings")
Dim settingsSection As ClientSettingsSection =
CType(configSection, ClientSettingsSection)
Dim serverSetting As SettingElement =
settingsSection.Settings.Get("Server")
serverSetting.Value.ValueXml.InnerText = sqlServerPath
configSection.SectionInformation.ForceSave = True
config.Save()
End Sub
End Class
Постройте решение, и установщик должен теперь изменить файл настроек приложения!
Примечания
1 : в том смысле, что вы можете запустить его вручную.На самом деле отладка требует его создания из установки.См. этот вопрос .
2 : здесь также можно добавить отдельный проект для создания отдельной библиотеки DLL, целью которой является предоставление пользовательской точки ввода кода.Это имеет лучшие характеристики производительности, но в этом примере его избегают из-за повышенной сложности (вам потребуется одна программа для изменения файла настроек другой программы).
3 : для получения дополнительной информации об этомо кодировке см. статью о CustomActionData Property в MSDN.
4 : Имена групп и разделов ConfigurationManager
чувствительны к регистру, поэтому убедитесь, что они точно совпадают с фактическими настройками XML-файла.