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

C# 在运行时从外部配置文件重新加载配置设置,c#,.net,configuration,configuration-files,C#,.net,Configuration,Configuration Files,我正在用C#编写一个游戏服务器,希望在服务器运行时从配置文件重新加载或刷新设置 理想情况下,我希望将设置保存在XML文件中,并具有编辑功能 在游戏服务器运行时删除该文件,然后向服务器发送重新加载命令 从文件中删除设置 我知道我也可以使用数据库来完成这项工作,但游戏服务器相当小,我认为只将设置保存在平面文件中更为实用。我将对服务器将运行的计算机具有文件级访问权限 我应该使用什么?听起来像是XML序列化的工作!与手动解析和编辑XML不同,您可以通过创建一个设置对象,将其序列化为XML,并在需要进行修

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

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

我知道我也可以使用数据库来完成这项工作,但游戏服务器相当小,我认为只将设置保存在平面文件中更为实用。我将对服务器将运行的计算机具有文件级访问权限


我应该使用什么?

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

使用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);
使用

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

代码由以下人员提供:

首先,ConfigurationManager按配置节缓存应用程序的配置,您可以调用ConfigurationManager.RefreshSection()使特定节的缓存无效

在app.config中,我添加了:


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

在game.config中:


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

settings = (NameValueCollection) ConfigurationManager.GetSection("gameSettings");
return settings["SettingName"];
以及在向服务器发送重新加载命令时随时重新加载游戏配置:

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

  • 加载XML文件
  • 将其内容解析为您想要的任何表示形式
  • 将输出存储在缓存中,并有一个监视它的程序-这将导致在文件更改时自动将其从缓存中删除
在执行上述任何操作之前,您需要检查缓存,以查看以前缓存的设置副本是否存在,并且只有在不存在时才继续


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

根据请求,将我的评论作为回答:


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


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

这个问题感觉相当主观。您可以设置它,以便服务器使用
System.IO.FileSystemWatcher
自动加载文件设置。如果使用自定义的
设置
类,只需锁定该类、从文件重新加载该类、解锁该类(如果使用多个线程)。在.NET中,从/到文件的读/写或序列化非常简单,您可能不需要帮助。我过去也使用过FileSystemWatcher。它快速、简单,并且完成了任务。@Jaroslav:你的评论可能应该作为答案发布。他不能接受作为评论的答案。yodaj007我同意,很抱歉。但是看看rene的答案,我认为它可以帮助很多人。你知道HostFileChangeMonitor是.NET4的新版本,对吗?看看rene的答案。ConfigurationManager已经存在用于此目的,我已经知道如何使用它来完成我需要的任务。不需要自己读取和解析XML文件。此外,ConfigurationManager按节缓存配置,因此它可以为我做所有事情。您的回答告诉我如何检查更改的配置文件,但不告诉我应该使用什么来管理配置文件。另外,我指定我将使用命令重新加载配置文件,这不必自动发生。但它是信息性的,无论如何谢谢你。看看雷内的答案。ConfigurationManager已经存在用于此目的,我已经知道如何使用它来完成我需要的任务。不需要自己读取和解析XML文件。