我有一个安装程序类的Visual Studio安装项目。在安装程序类中,我按如下方式设置了一个设置:
MessageBox.Show(Properties.Settings.Default.MySetting);
Properties.Settings.Default.MySetting = "Foo";
Properties.Settings.Default.Save();
MessageBox.Show(Properties.Settings.Default.MySetting);
问题是即使我知道这个代码正在执行(我正在做其他的事情),设置永远不会设置!!
消息框确实表明正在设置该值,但是当我转到.config文件时,该值仍为空白!
任何人都有任何想法和/或可能的解决方法吗?
答案 0 :(得分:5)
我为安装程序所做的是使用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();
}
}
}
}
在安装程序中,只需在Install方法中添加以下内容:
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小时的过程,包括通过多个配置文件来设置密码。现在它几乎完全自动化了。
希望这有帮助。
答案 1 :(得分:0)
老实说,我不知道安装程序是否支持此功能 - 但如果确实如此,请确保您在Save()
上拨打Settings.Default
。
答案 2 :(得分:0)
最后我放弃了并且在安装应用程序之后有一个RunOnce类型的方法来完成这些工作。
答案 3 :(得分:0)
简短的回答是安装程序类不支持它。您只需要了解从系统目录运行的msiexec.exe调用安装程序类方法,并且该环境可能无法知道您在完全不知道的目录中的某个位置具有设置文件。这就是为什么它适用于明确转到文件安装位置并在那里更新它的代码。