Проект установки, Пользовательский установщик, Строка подключения - PullRequest
1 голос
/ 17 февраля 2011

Я работаю над проектом установки.В отдельном проекте библиотеки я создал пользовательский установщик, унаследовав его от System.Configuration.Install.Installer, и добавил сгенерированный файл .dll в качестве настраиваемого действия (шаг установки).Я добавил файл app.config в проект библиотеки, где храню строку подключения, которая необходима для подключения к Sql Server.

После запуска проекта установки пользовательский установщик не извлекает connectionStringхранится в файле app.config.

Где я могу сохранить строку подключения?Может ли проект установки иметь app.config?Может ли кто-нибудь порекомендовать книгу по проектам развертывания / настройки?

Спасибо

ОБНОВЛЕНИЕ

Привет, Спасибо.На основании ответов, которые я обновил в своем коде, это то, что я делаю сейчас:

-> В проекте установки я добавил настраиваемое действие на шаг установки, выбрав папку приложения и первичный вывод (проект библиотеки).-> Добавил app.config в проект библиотеки и установил его действие по сборке «content».-> Добавлены файлы содержимого проекта библиотеки в проект установки.

Таким образом, файл app.config появляется в папке установки.

В обработчике установки из моего пользовательского класса установки я делаюследующее: (в этом случае я получаю доступ к настройкам приложения)

           string appPath = "";
        appPath = Path.Combine(new DirectoryInfo(Context.Parameters["assemblypath"].ToString()).Parent.FullName, "App.config");

        ExeConfigurationFileMap map = new ExeConfigurationFileMap();
        map.ExeConfigFilename = appPath;
        System.Configuration.Configuration c = null;
        c = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
        string result = c.AppSettings.Settings["test"].Value;

Ответы [ 2 ]

4 голосов
/ 17 февраля 2011

Вы все еще можете повторно использовать app.config, если вы настаиваете на этом, но вам нужно найти свой собственный способ его анализа.

Вот необходимые шаги для этого обходного пути:

  1. Создайте свой собственный механизм для чтения настроек приложения с помощью System.Xml.XmlReader или чего-либо еще из файла app.config, который будет скопирован в папку приложения.
  2. Используйте свой собственный анализатор xml для извлеченияцените и используйте его в своих пользовательских действиях.
  3. Пометьте App.config как Контент в окне свойства Build Action (в проекте настраиваемого действия).
  4. В проекте установки добавьте вывод проекта в папку приложения и выберите «Файлы содержимого» вместо первичного вывода.Вы можете проверить, что app.config является выводом, вызвав контекстное меню и выбрав «Выводы для файлов содержимого из ...».

    После того, как вы это сделали, у вас должно быть 2 выхода из проекта библиотеки классов Custom Installer (1 для первичного вывода и 1 для файлов содержимого).

Вот пример пользовательского действия установщика, которое запускает все, что у меня есть в моем ключе appSettings, называемом запуск, вместе с моей заменой реализации ConfigurationManager:

using System;
using System.Configuration.Install;
using System.Xml;
using System.IO;
using System.Reflection;
using System.ComponentModel;
using System.Collections;

namespace ClassLibrary1
{
    [RunInstaller(true)]
    public partial class Installer1 : System.Configuration.Install.Installer
    {
        public Installer1()
        {
            InitializeComponent();
        }

        [System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
        public override void Commit(IDictionary savedState)
        {
            base.Commit(savedState);
            System.Diagnostics.Process.Start(ConfigurationManager.AppSettings["launch"]);
        }
    }

    public class ConfigurationManager
    {
        private static AppSetting _appSettings = new AppSetting();

        public static AppSetting AppSettings
        {
            get { return _appSettings; }
        }

        public class AppSetting
        {
            public string this[string key]
            {
                get
                {
                    var path = Path.Combine(Path.GetDirectoryName(Assembly.GetCallingAssembly().Location), "app.config");
                    var xpath = string.Format("/configuration/appSettings/add[@key='{0}']", key);
                    var doc = new XmlDocument();

                    doc.Load(path);
                    var node = doc.SelectSingleNode(xpath);

                    if (node == null) 
                        return string.Empty;

                    return node.Attributes["value"].Value;
                }
            }
        }
    }
}
1 голос
/ 17 февраля 2011

Вместо того, чтобы пытаться проанализировать app.config, я бы предложил добавить атрибут configSource к вашему app.config для вывода строк подключения, что-то вроде:

<connectionStrings configSource="connections.config" />

Затем получите скрипт установки для генерации всего файла connections.config, похожего на:

<connectionStrings>
  <clear />
  <add name="...." connectionString="...." providerName="...." />
</connectionStrings>

Убедитесь, что вы используете .config в качестве расширения вашего файла, чтобы его нельзя было передать браузеру, если кто-то угадает имя файла.

...