6

我有一个具有 Installer 类的 Visual Studio 安装项目。在安装程序类中,我设置如下:

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

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

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

问题是,即使我知道这段代码正在执行(我正在做其他事情),设置永远不会设置!

消息框确实表明正在设置该值,但是当我转到.config文件时,该值仍然是空白的!

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

4

4 回答 4

6

我为我的安装人员所做的是使用 App.Config 中的“文件”属性。appSettings 块采用“文件”属性,如下所示:

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

“文件”属性有点像 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);

我们将它用于我们的测试、训练和生产服务器,所以我们所要做的就是在安装过程中指定机器名称和密码,一切都为我们处理好了。它曾经是一个 3 小时的过程,包括通过多个配置文件来设置密码。现在它几乎完全自动化了。

希望这可以帮助。

于 2009-02-11T23:05:24.493 回答
0

老实说,我不知道在安装过程中是否支持此功能-但如果支持,请确保您正在调用Save().Settings.Default

于 2009-02-07T11:22:39.013 回答
0

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

于 2009-02-09T09:02:06.200 回答
0

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

于 2016-05-13T20:09:31.290 回答