【问题标题】:Reload configuration settings from an external config file during run-time在运行时从外部配置文件重新加载配置设置
【发布时间】:2011-06-23 12:33:08
【问题描述】:

我正在用 C# 编写游戏服务器,并希望在服务器运行时从配置文件重新加载或刷新设置。

理想情况下,我想将设置保存在 XML 文件中,并且可以进行编辑 游戏服务器运行时的文件,然后向服务器发送命令以重新加载 文件中的设置。

我知道我也可以使用数据库来执行此操作,但游戏服务器相当小,我认为将设置保存在平面文件中会更实用。我将对运行服务器的机器拥有文件级访问权限。

我应该使用什么?

【问题讨论】:

  • 这个问题感觉比较主观。
  • 您可以进行设置,以便服务器使用System.IO.FileSystemWatcher 自动加载文件设置。如果您使用自定义 Settings 类,您可以简单地锁定该类,从文件中重新加载它,解锁它(如果您使用多个线程)。在 .NET 中读取/写入文件或序列化非常简单,这可能不是您需要帮助的。
  • 我过去也使用过 FileSystemWatcher。它快速、简单,可以完成工作。
  • @Jaroslav:您的评论可能应该作为答案发布。当它是评论时,他不能接受它作为答案。
  • yodaj007 我同意,很抱歉。但是检查 rene 的回答,我认为它可以帮助很多人。

标签: c# .net configuration configuration-files


【解决方案1】:

使用http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx

使用自定义配置部分,通过设置部分的位置属性将 app.config 中的部分连接到外部配置文件。所有 xml 加载和序列化都由这些自定义类完成

CarelZA提供的代码:

首先,ConfigurationManager通过config section缓存应用程序的配置,你可以调用ConfigurationManager.RefreshSection()来使特定section的缓存失效。

在 app.config 我添加了:

<configSections>
  <section name="gameSettings" 
           type="System.Configuration.NameValueSectionHandler,system , Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, Custom=null"/>
</configSections>
<gameSettings configSource="game.config"/>

我创建了一个名为“game.config”的文件并将“复制到输出目录”设置为“始终复制”。

在game.config中:

<gameSettings>
  <add key="SettingName" value="SettingValue" />
</gameSettings>

然后在代码中,为了访问任何设置:

settings = (NameValueCollection) ConfigurationManager.GetSection("gameSettings");
return settings["SettingName"];

并在重新加载命令发送到服务器时随时重新加载游戏配置:

ConfigurationManager.RefreshSection("gameSettings");

【讨论】:

    【解决方案2】:

    根据要求发布我的评论作为答案:

    您可以进行设置,以便服务器使用FileSystemWatcher 自动加载文件设置。如果您使用自定义 Settings 类,您可以简单地锁定该类,从文件中重新加载它并解锁它(如果您使用多个线程)。

    从/向文件读取/写入或序列化在 .NET 中是如此微不足道,这可能不是您需要帮助的,并且有很多选项可以做到这一点。

    【讨论】:

    • 您的回答告诉我如何检查更改的配置文件,但不告诉我应该使用什么来管理配置文件。另外,我指定我将使用命令重新加载配置文件,它不必自动发生。但它提供了丰富的信息,无论如何,谢谢。
    【解决方案3】:

    查看 System.Runtime.Caching (.NET 4.0) 中的 MemoryCache。您可以自己编写一个简单的类,执行以下步骤:

    • 加载 XML 文件
    • 将其内容解析为您想要的任何表示形式
    • 将输出存储在缓存中,HostFileChangeMonitor 监视它 - 这将导致文件更改时自动将其从缓存中删除

    在执行上述任何操作之前,您应检查缓存以查看是否存在先前缓存的设置副本,如果不存在则仅继续。

    像这样滚动您自己的方法的优势在于,您不会像存储在 web.config 或 app.config 文件中的 AppSettings 那样触发应用程序的重新启动。 (应该说这不是唯一的实现方式)

    【讨论】:

    • 您知道 HostFileChangeMonitor 是 .NET 4 的新功能,对吧?
    • 查看 rene 的答案。 ConfigurationManager 已经为此目的而存在,我想出了如何使用它来做我需要的事情。无需自己读取和解析 XML 文件。此外,ConfigurationManager 会按部分缓存配置,因此它会为我做所有事情。
    【解决方案4】:

    听起来像是 XML 序列化的工作!无需手动解析和编辑 XML,您可以通过创建设置对象,将其序列化为 XML,并在需要进行修改时对其进行反序列化,从而轻松实现相同的效果。这样,您可以热交换配置文件。

    using System.Xml.Serialization;

    例如,您可以拥有对象

    public class Settings
    {
      public string SomeProperty {get; set;}
      public string SomeProperty2 {get; set;}
    }
    

    将其保存到您的磁盘中,

    var settings = new Settings {SomeProperty="Hello", SomeProperty2="Joe"};
    var fs = new FileStream("settings.xml");
    var xs = new XmlSerializer(settings.GetType());
    xs.Serialize(fs,settings);
    

    把它读回来,

    var fs = new FileStream("settings.xml");
    var settings = (Settings)fs.Deserialize(fs);
    

    【讨论】:

    • 查看 rene 的答案。 ConfigurationManager 已经为此目的而存在,我想出了如何使用它来做我需要的事情。无需自己读取和解析 XML 文件。
    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2020-07-22
    • 2011-01-28
    相关资源
    最近更新 更多