English 中文(简体)
我如何在安装过程中通过安装程序类设置应用程序设置
原标题:
  • 时间:2009-02-07 11:20:10
  •  标签:

我有一个安装程序类的 Visual Studio 设置项目。在安装程序类中,我按照以下方式设置一个设置:

MessageBox.Show(Properties.Settings.Default.MySetting);

Properties.Settings.Default.MySetting = "Foo";
Properties.Settings.Default.Save();

MessageBox.Show(Properties.Settings.Default.MySetting);

问题是即使我知道这段代码正在被执行(我正在做其他事情),设置也从未被设置!

留言框确实建议该值已设置,但当我转到 `.config` 文件时,该值仍为空白!

有人有任何想法为什么和/或可能的解决方法吗?

最佳回答

我为我的安装程序所做的是使用 App.Config 中的“file”属性。appSettings 块取一个“file”属性,就像这样:

<appSettings file="user.config">
    <add key="foo" value="some value unchanged by setup"/>
</appSettings>

"file"属性有点像CSS,因为最具体的设置会胜出。如果在user.config和App.config中都定义了"foo",则使用user.config中的值。

然后,我有一个配置生成器,使用字典中的值将第二个appSettings块写入user.config(或您想要的任何名称)。

using System.Collections.Generic;
using System.Text;
using System.Xml;

namespace Utils
{
    public class ConfigGenerator
    {
        public static void WriteExternalAppConfig(string configFilePath, IDictionary<string, string> userConfiguration)
        {
            using (XmlTextWriter xw = new XmlTextWriter(configFilePath, Encoding.UTF8))
            {
                xw.Formatting = Formatting.Indented;
                xw.Indentation = 4;
                xw.WriteStartDocument();
                xw.WriteStartElement("appSettings");

                foreach (KeyValuePair<string, string> pair in userConfiguration)
                {
                    xw.WriteStartElement("add");
                    xw.WriteAttributeString("key", pair.Key);
                    xw.WriteAttributeString("value", pair.Value);
                    xw.WriteEndElement();
                }

                xw.WriteEndElement();
                xw.WriteEndDocument();
            }
        }
    }
}

在您的安装程序中,只需在安装方法中添加以下内容:

string configFilePath = string.Format("{0}{1}User.config", targetDir, Path.DirectorySeparatorChar);

IDictionary<string, string> userConfiguration = new Dictionary<string, string>();

userConfiguration["Server"] = Context.Parameters["Server"];
userConfiguration["Port"] = Context.Parameters["Port"];

ConfigGenerator.WriteExternalAppConfig(configFilePath, userConfiguration);

我们用它来管理我们的测试、培训和生产服务器,所以我们只需在安装过程中指定机器名和密码,一切都为我们搞定了。以前这是一个三小时的过程,要通过多个配置文件设置密码。现在几乎全部自动化了。

希望这可以帮到您。

问题回答

好吧,最后我放弃了,并采用了RunOnce类型的方法,在应用程序安装后执行这些操作。

我真的不知道是否在安装程序中支持此操作 - 但如果是的话,请确保您在Settings.Default上调用Save()函数。

简短的回答是,在安装程序类中不支持。您只需要了解,安装程序类方法是从运行在系统目录下的msiexec.exe调用的,该环境无法知道您在其完全不知道的目录中有一个设置文件。这就是为什么它与明确到文件的安装位置并在那里更新它的代码一起使用。





相关问题
热门标签