Перезагрузите настройки конфигурации из внешнего файла конфигурации во время выполнения

Я пишу игровой сервер на С# и хочу перезагрузить или обновить настройки из файла конфигурации во время работы сервера.

В идеале я хотел бы сохранить настройки в файле XML, иметь возможность редактировать файл во время работы игрового сервера, а затем отправить сервер для перезагрузки настройки из файла.

Я знаю, что я могу использовать базу данных для этого, но игровой сервер довольно мал, и я думаю, было бы более практично просто сохранять настройки в плоском файле. У меня будет доступ к файловому файлу на машине, на которой будет работать сервер.

Что я должен использовать?

Ответ 1

Используйте http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.aspx

Используйте раздел "Пользовательская настройка", подключите разделы из файла 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");

Ответ 2

В соответствии с запросом отправкой моего комментария в качестве ответа:

Вы можете настроить его, чтобы сервер автоматически загружал параметры файла с помощью FileSystemWatcher. Если вы используете собственный класс Settings, вы можете просто заблокировать класс, перезагрузить его из файла и разблокировать его (если вы используете несколько потоков).

Чтение/запись из/в файл или сериализация в .NET настолько тривиальны, что это, вероятно, не то, что вам нужно, и есть много вариантов, как это сделать.

Ответ 3

Звучит как задание для 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);

Ответ 4

Просмотрите MemoryCache в System.Runtime.Caching(.NET 4.0). Вы можете написать себе простой класс, который выполняет следующие шаги:

  • Загрузите файл XML
  • Разделите его содержимое на любое представление, которое вы хотите, в
  • Сохраните вывод в кеше с HostFileChangeMonitor, наблюдая за ним - это приведет к тому, что он будет удален из кэша автоматически, когда файл изменяется

Прежде чем выполнять какие-либо из вышеперечисленных действий, вы должны проверить кеш, чтобы узнать, существует ли ранее сохраненная копия настроек, и продолжать ее, только если это не так.

Преимущество вашего собственного подхода в том, что вы не запускаете перезапуска приложения, как это происходит с AppSettings, хранящимся в файлах web.config или app.config. (Следует сказать, что это не единственный способ добиться этого)