Как расширить параметры user.config при создании MSI с использованием проектов установщика Microsoft Visual Studio - PullRequest
0 голосов
/ 24 мая 2018

Как видно из заголовка, я пытаюсь расширить свой XML-файл user.config, который создается в моем основном проекте, на соседний проект установки.Я создаю MSI, используя Microsoft Visual Studio 2017 Projects Projects (ссылка) , а также использую Visual Studio 2017 для создания приложения с простой формой.

В качестве примера, вот мои два проекта -

enter image description here

В моем основном проекте Windows Form у меня есть свойство bool, которое называетсяtestBool по умолчанию имеет значение false.

enter image description here

В моей форме у меня есть кнопка, которая запускает следующий простой код и устанавливает для свойства testBool значениеtrue-

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Configuration;

namespace TestUserConfig
{

public partial class Form1 : Form
    {
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        MessageBox.Show("testBool = " + Properties.Settings.Default.testBool.ToString());

        //setting the property to true
        Properties.Settings.Default.testBool = true;

        MessageBox.Show("Test Bool = " + Properties.Settings.Default.testBool.ToString());

        //save the 
        Properties.Settings.Default.Save();

        //location of the user.config file (reference to System.Configuration required)
        Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal);
        MessageBox.Show(config.FilePath);
    }
    }
}

Это все работает должным образом и выводит файл user.config по следующему пути: C: \ Users \ USERNAME \ AppData \ Local \ Microsoft_Corporation \ PROJECTNAME_umi0kjiiephephcroktxjbzai0nh \ 14.0.7208.5000 \ user.config

Проблема, с которой я сталкиваюсь, заключается в том, что при создании MSI-кода тот же код не запускается так, как я ожидал.На самом деле MessageBox.Show даже не запускаются, за исключением последней строки кода - «MessageBox.Show (« Hello !! »);»

Я бы ожидал, что оставшиеся окна сообщений по крайней мере выведутпустое окно сообщения.

Кроме того, в каталоге сборки MSI (c: \ Program Files (x86) \ install dir) я вижу файл с именем «PROJECTNAME.dll.config», который содержит значение по умолчаниюдля testBool.
Если я опубликую приложение, запускаемое нажатием одной кнопки, приложение работает нормально. Есть ли что-то, что мне нужно добавить в мой проект установки, чтобы это работало?

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

1 Ответ

0 голосов
/ 28 мая 2018

У этого подхода есть пара проблем:

  1. Пользовательские действия управляемого кода не создаются так же, как при запуске в качестве приложения.Встроенный установщик Windows не поддерживает управляемый код, поэтому настройки Visual Studio включают C ++ Dll в качестве прокладки между работающим установщиком и вашим управляемым кодом.Эта оболочка загружает и создает экземпляр вашего управляемого кода с отражением, минуя настройки конфигурации.Это означает, что вам нужно использовать синтаксический анализ XML для доступа к файлу.

  2. Несмотря на то, что Visual Studio позволяет вам это делать, вы не должны отображать пользовательский интерфейс при настройке из настраиваемого действия Visual Studio.Это нарушает автоматическую установку, развертывание групповой политики, а архитектура установщика Windows не готова работать с пользовательским интерфейсом на этом этапе установки.Конкретная проблема с сообщением заключается в том, что в потоке квартир нет нужного потока пользовательского интерфейса.Так что ваши почтовые ящики не будут работать должным образом.Из вашего кода не очевидно, что вы пытаетесь сделать (потому что это похоже на тест, который просто устанавливает значение и сохраняет его), но если бы у вас была форма Windows с кнопками и т. Д., Они тоже не сработали бы.

Если вы хотите получить значение из пользовательского интерфейса во время установки, используйте одну из дополнительных форм пользовательского интерфейса (например, TextBoxes) и получите значение оттуда.Затем свойство (имя по умолчанию, такое как EDITA1) может быть передано в CustomActionData в пользовательское действие, которое устанавливает значение в файле с использованием классов Xml.С другой стороны, если этот тип настройки используется запущенным приложением, то обычно более целесообразно, чтобы приложение делало это при первом запуске.

Другая потенциальная проблема - это доступ: файлы в Program Files не могут быть созданы или обновлены ограниченным пользователем, поэтому при попытке обновить файлы настроек может возникнуть проблема.Поэтому я не буду хранить настройки в Program Files, если они не предназначены только для чтения.Если это проблема, просто поместите любые файлы конфигурации Xml в (скажем) папке «Данные приложения пользователя» (это расположение в представлении файловой системы проекта установки Visual Studio).

...