安装项目,自定义安装程序,连接字符串

时间:2011-02-17 14:45:34

标签: c# setup-project

我正在开发一个安装项目。在一个单独的库项目中,我通过继承System.Configuration.Install.Installer创建了一个自定义安装程序,并将生成的.dll添加为自定义操作。(安装步骤)。我将一个app.config文件添加到库项目中,在那里我存储了一个连接字符串,我需要连接到Sql Server。

运行安装项目后,自定义安装程序不会检索存储在app.config文件中的connectionString。

我在哪里可以存储连接字符串?安装项目可以有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 个答案:

答案 0 :(得分:4)

如果你坚持这样做,你仍然可以重用app.config,但是你需要用自己的方式来解析它。

以下是此解决方法的必要步骤:

  1. 创建自己的机制 阅读appSettings使用 System.Xml.XmlReader或其他来自 将成为app.config文件 复制到应用程序文件夹中。
  2. 使用自定义xml解析器 提取值并将其用于您的 自定义动作。
  3. 标记 App.config作为Build Action属性中的Content 窗口(在自定义操作项目中)。
  4. 在“设置项目”中,在“应用程序文件夹”中添加“项目输出”,然后选择“内容文件” 而不是主要输出。您可以 验证app.config是输出 通过调用上下文菜单并选择 来自的内容文件的输出 ......项目。

    完成此操作后,您应该从Custom Installer类库项目获得2个输出(1个用于主输出,1个用于内容文件)。

  5. 以下是一个示例自定义安装程序操作,该操作将启动我的appSettings键中的所有内容,名为launch以及替换的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 :(得分:1)

我建议您不要尝试解析app.config,而是将configSource属性添加到app.config以外部化连接字符串,例如:

<connectionStrings configSource="connections.config" />

然后获取安装脚本以生成整个connections.config文件,类似于:

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

请确保使用.config作为文件的扩展名,以便在有人猜到文件名时无法将其提供给浏览器。