在运行时从外部配置文件重新加载配置设置

时间:2011-02-08 15:23:33

标签: c# .net configuration configuration-files

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

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

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

我应该使用什么?

4 个答案:

答案 0 :(得分:13)

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

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

完成

CarelZA提供的代码:

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

在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");

答案 1 :(得分:4)

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

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

在.NET中读取/写入文件或序列化是非常简单的,这可能不是您需要帮助的,并且有很多选项可以做到。

答案 2 :(得分:0)

听起来像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);

以as,

的形式阅读
var fs = new FileStream("settings.xml");
var settings = (Settings)fs.Deserialize(fs);

答案 3 :(得分:0)

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

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

在执行上述任何操作之前,您需要检查缓存以查看先前缓存的设置副本是否存在,只有在不存在时才会继续。

像这样滚动自己的方法的好处是你不会像存储在web.config或app.config文件中的AppSettings那样触发应用程序的重启。 (应该说这不是实现这一目标的唯一方法)