在运行时从外部配置文件重新加载配置设置
我正在用C#编写游戏服务器,并希望在服务器运行时从配置文件重新加载或刷新设置。在运行时从外部配置文件重新加载配置设置
理想我想保存在一个XML文件中的设置,让游戏服务器运行时编辑 文件,然后向服务器发送命令重新加载 从文件中设置的功能。
我知道我也可以使用数据库来做到这一点,但游戏服务器相当小,我认为将设置保存在平面文件中会更实用。我将对服务器运行的计算机拥有文件级访问权限。
我应该使用什么?
使用http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx
使用自定义配置部分,通过设置节的位置attrib将app.config中的节连接到外部配置文件。所有XML加载和系列化由
代码由CarelZA提供的自定义类进行:
首先,通过ConfigurationManager中配置部分缓存的应用程序的配置,你可以调用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");
听起来像是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);
查看System.Runtime.Caching(.NET 4.0)中的MemoryCache。你可以自己写一个简单的类,它执行以下步骤:
- 加载XML文件
- 在缓存中的输出解析其内容成任何表示你希望他们在
- 存储与HostFileChangeMonitor看着它 - 这将导致文件被更改时自动从缓存中删除
在执行上述任何操作之前,您需要检查缓存以查看是否存在以前缓存的设置副本,如果它能继续下去sn't。
像这样滚动您自己的方法的优点是,您不会像存储在web.config或app.config文件中的AppSettings那样触发重新启动应用程序。 (应该说,这是不是实现这一目标的唯一途径)
根据要求发布我的评论作为一个答案:
你可以设置它与FileSystemWatcher所以服务器自动加载的文件设置。如果您使用自定义类Settings
,则可以简单地锁定类,从文件中重新加载并解锁它(如果使用多个线程)。
在.NET中读取/写入文件或序列化是如此微不足道,这可能不是您需要的帮助,并且有许多选项可以做到。
这个问题相当主观。 – Amy 2011-02-08 15:27:50
您可以进行设置,以便服务器使用System.IO.FileSystemWatcher自动加载文件设置。如果使用自定义的`Settings`类,则可以简单地锁定类,从文件中重新加载它,解锁它(如果使用多个线程)。从.NET读写文件或序列化在.NET中如此微不足道,这可能不是您需要的帮助。 – 2011-02-08 15:32:09
我也在过去使用过FileSystemWatcher。这是快速,简单,并完成工作。 – 2011-02-08 15:35:08