
[英]Is it possible during run-time to modify and save an XML file inside a program and not as external file?
[英]Reload configuration settings from an external config file during run-time
我正在用C#编写游戏服务器,并希望在服务器运行时从配置文件重新加载或刷新设置。
理想情况下,我想将设置保存在XML文件中,能够在游戏服务器运行时编辑文件,然后向服务器发送命令以从文件重新加载设置。
我知道我也可以使用数据库来做到这一点,但游戏服务器相当小,我认为将设置保存在平面文件中会更实用。 我将对服务器将运行的机器进行文件级访问。
我该怎么用?
使用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");
根据要求发布我的评论作为答案:
您可以对其进行设置,以便服务器使用FileSystemWatcher自动加载文件设置。 如果使用自定义Settings
类,则只需锁定类,从文件重新加载它并解锁(如果使用多个线程)。
从/到文件或序列化的读/写在.NET中是如此微不足道,这可能不是你需要帮助的,并且有很多选项如何做。
听起来像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 。 您可以自己编写一个执行以下步骤的简单类:
在执行上述任何操作之前,您需要检查缓存以查看先前缓存的设置副本是否存在,并且只有在不存在时才会继续。
像这样滚动自己的方法的好处是,您不会触发应用程序的重新启动,就像存储在web.config或app.config文件中的AppSettings一样。 (应该说这不是实现这一目标的唯一方法)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.