【问题标题】:Saving class library user settings in winforms .Net 3.5 SP1在 winforms .Net 3.5 SP1 中保存类库用户设置
【发布时间】:2011-03-13 10:34:13
【问题描述】:

不久前,我编写了自己的设置提供程序,因为在类库中持久化设置时遇到问题。 (注意 - 从应用程序中持久化设置没有问题)。

今天,我刚刚对持久类库设置进行了测试,它在没有我的自定义提供程序的情况下工作。 测试是:

(1) 创建类库
(2) 添加设置 - '名称'
(3) 添加一个具有公共共享属性“名称”的类,该属性可以读取和写入设置“名称”。
(4) 创建一个引用类库的应用程序,并使用共享属性来读写'Name'设置。

我确信在应用程序打开时“名称”设置会持续存在,但在我关闭它并重新打开它之后,该设置将恢复为默认设置。 现在不会发生这种情况,我想确定我以前是个白痴,而不是现在的白痴。

我现在得到的行为是预期的行为吗?

ETA:我注意到第一次创建测试应用程序时,更改设置、关闭并重新打开,设置没有保留。随后是。可能是我之前一次尝试后放弃了。任何想法为什么它没有第一次坚持?

ETA2:例如,我有一个名为“MyLibrary”的类库和一个名为“MyApp”的测试应用程序。我执行上面的步骤 1-4,下面是在 C:\Documents and Settings\User Name\Local Settings\Application Data\MyApp\MyApp.vshost.exe_Url_vi5gjcooahbdm2ma3dcay0mkexu2suul\1.0.0.0 找到的 user.config 文件的内容。注意:我没有触摸 MyApp 中的设置;-

<configuration>
<configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral >
        <section name="MyLibrary.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
</configSections>
<userSettings>
    <MyLibrary.My.MySettings>
        <setting name="Name" serializeAs="String">
            <value>New changed value</value>
        </setting>
    </MyLibrary.My.MySettings>
</userSettings>

【问题讨论】:

  • .settings / .config 文件(如果我没记错的话)绑定到您的 AppDomain,而不是特定程序集。当您从 lib 访问配置时,您实际上是在访问 APP 的配置。

标签: c# .net vb.net winforms settings


【解决方案1】:

我建议您研究一下 .NET 的 XML 序列化内容。它工作得非常好,我几乎所有的设置存储都使用它。

基本上,创建一个将存储您的设置的类,确保它有一个不带参数的构造函数。

public class Settings
{
    public Settings() { }

    public string MySetting { get; set; }
}

然后在您的应用程序中,使用这样的函数将其序列化为 XML 文件:

public static string Serialize<T>(T item) where T:class
{
    try
    {
        XmlSerializer serial = new XmlSerializer(typeof(T));
        StringBuilder sb = new StringBuilder();
        StringWriter writer = new StringWriter(sb);
        serial.Serialize(writer, item);
        writer.Close();
        return sb.ToString();
    }
    catch (Exception ex)
    {
        Debug.WriteLine("Failed to serialize object of type " + typeof(T).FullName + ": " + ex.Message);
        return "Failed to serialize";
    }
}

还有这样一个函数可以将 XML 文件反序列化到您的设置类中:

public static T Deserialize<T>(string FilePath) where T : class
{
    try
    {
        XmlSerializer xml = new XmlSerializer(typeof(T));
        FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read);
        XmlSerializer xml = new XmlSerializer(typeof(T));
                T res = (T)xml.Deserialize(fs);
        fs.Close();
        return res;
    }
    catch (Exception ex)
    {
        Debug.WriteLine("Failed to deserialize object of type " + typeof(T).FullName + ": " + ex.Message);
        return default(T);
    }
}

祝你好运,希望对你有所帮助

【讨论】:

    猜你喜欢
    • 2021-08-23
    • 2010-11-23
    • 2011-03-03
    • 2010-10-11
    • 2011-01-30
    • 2012-03-27
    • 2010-09-19
    • 2015-10-25
    • 2010-09-18
    相关资源
    最近更新 更多