C# 在两个应用程序之间共享配置的技术?

C# 在两个应用程序之间共享配置的技术?,c#,.net,configuration,C#,.net,Configuration,我的应用程序分为一个配置工具和一个查看器,前者编写配置,后者只读取和使用配置中的设置 在此场景中,建议使用哪些存储属性的技术?不同类别的XML是个好主意吗 这些应用程序是在C#、在.NET3.5上开发的,并使用WinForms。XML似乎是实现这一目标的理想选择 在WinForms中,用户设置通过XML持久化,因此您拥有所需的所有类和助手方法。我将拥有一个共享程序集,其中包含您的设置类。然后,您可以将此类序列化/反序列化到硬盘上的公共位置: [XmlRoot()] public class Se

我的应用程序分为一个配置工具和一个查看器,前者编写配置,后者只读取和使用配置中的设置

在此场景中,建议使用哪些存储属性的技术?不同类别的XML是个好主意吗


这些应用程序是在C#、在.NET3.5上开发的,并使用WinForms。

XML似乎是实现这一目标的理想选择


在WinForms中,用户设置通过XML持久化,因此您拥有所需的所有类和助手方法。

我将拥有一个共享程序集,其中包含您的设置类。然后,您可以将此类序列化/反序列化到硬盘上的公共位置:

[XmlRoot()]
public class Settings
{
    private static Settings instance = new Settings();

    private Settings() {}

    /// <summary>
    /// Access the Singleton instance
    /// </summary>
    [XmlElement]
    public static Settings Instance
    {
        get
        {
            return instance;
        }
    }

    /// <summary>
    /// Gets or sets the height.
    /// </summary>
    /// <value>The height.</value>
    [XmlAttribute]
    public int Height { get; set; }

    /// <summary>
    /// Main window status (Maximized or not)
    /// </summary>
    [XmlAttribute]
    public FormWindowState WindowState
    {
        get;
        set;
    }

    /// <summary>
    /// Gets or sets a value indicating whether this <see cref="Settings"/> is offline.
    /// </summary>
    /// <value><c>true</c> if offline; otherwise, <c>false</c>.</value>
    [XmlAttribute]
    public bool IsSomething
    {
        get;
        set;
    }

    /// <summary>
    /// Save setting into file
    /// </summary>
    public static void Serialize()
    {
        // Create the directory
        if (!Directory.Exists(AppTmpFolder))
        {
            Directory.CreateDirectory(AppTmpFolder);
        }

        using (TextWriter writer = new StreamWriter(SettingsFilePath))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(Settings));
            serializer.Serialize(writer, Settings.Instance);
        }
    }

    /// <summary>
    /// Load setting from file
    /// </summary>
    public static void Deserialize()
    {
        if (!File.Exists(SettingsFilePath))
        {
            // Can't find saved settings, using default vales
            SetDefaults();
            return;
        }
        try
        {
            using (XmlReader reader = XmlReader.Create(SettingsFilePath))
            {
                XmlSerializer serializer = new XmlSerializer(typeof(Settings));
                if (serializer.CanDeserialize(reader))
                {
                    Settings.instance = serializer.Deserialize(reader) as Settings;
                }
            }
        }
        catch (System.Exception)
        {
            // Failed to load some data, leave the settings to default
            SetDefaults();
        }
    }
}
[XmlRoot()]
公共类设置
{
私有静态设置实例=新设置();
私有设置(){}
/// 
///访问Singleton实例
/// 
[XmlElement]
公共静态设置实例
{
得到
{
返回实例;
}
}
/// 
///获取或设置高度。
/// 
///高度。
[XmlAttribute]
公共整数高度{get;set;}
/// 
///主窗口状态(最大化或未最大化)
/// 
[XmlAttribute]
公共窗体窗口状态窗口状态
{
得到;
设置
}
/// 
///获取或设置一个值,该值指示此操作是否脱机。
/// 
///如果脱机,则为true;否则为false。
[XmlAttribute]
公共图书馆是什么
{
得到;
设置
}
/// 
///将设置保存到文件中
/// 
公共静态void Serialize()
{
//创建目录
如果(!Directory.Exists(AppTmpFolder))
{
CreateDirectory(AppTmpFolder);
}
使用(TextWriter writer=新StreamWriter(设置文件路径))
{
XmlSerializer serializer=新的XmlSerializer(类型(设置));
serializer.Serialize(writer、Settings.Instance);
}
}
/// 
///从文件加载设置
/// 
公共静态void反序列化()
{
如果(!File.Exists(设置文件路径))
{
//使用默认值找不到保存的设置
SetDefaults();
返回;
}
尝试
{
使用(XmlReader=XmlReader.Create(设置文件路径))
{
XmlSerializer serializer=新的XmlSerializer(类型(设置));
if(序列化器.CanDeserialize(读卡器))
{
Settings.instance=序列化程序。反序列化(读取器)为设置;
}
}
}
捕获(系统异常)
{
//无法加载某些数据,请保留默认设置
SetDefaults();
}
}
}
然后,您的xml文件将如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Settings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Height="738" WindowState="Maximized" IsSomething="false" >
</Settings>


好主意,谢谢。如何序列化复选框的状态?添加布尔属性IsFooChecked。加载表单时,调用Settings.Instance.Deserialize(),然后将控件的Checked属性设置为IsFooChecked。在OnFormClosing中,将IsFooChecked设置为复选框的Checked属性,并调用Settings.Instance.Serialize()。非常感谢,是否有方法改进该类以生成category,而不是将所有属性存储在一个标记中?您可以将属性分组到类中(每个类别一个类)。例如,FooClass。然后,在名为Foo的设置类中有一个属性,类型为FooClass-并具有xmlement属性。新类:设置类:[xmlement]公共外观视图中的公共类外观{public bool FullscreenMode{get;set;}public bool TrayTooltipActive{get;set;}public Appearance(){}{get;set;}通过以下方式访问:Util.Settings.Instance.View.FullscreenMode=false;Util.Settings.Instance.View.TrayTooltipActive=true;