diff --git a/Tank/Tank/CollectionGenericObjects/ListGenericObjects.cs b/Tank/Tank/CollectionGenericObjects/ListGenericObjects.cs index 6a6b319..668c2f7 100644 --- a/Tank/Tank/CollectionGenericObjects/ListGenericObjects.cs +++ b/Tank/Tank/CollectionGenericObjects/ListGenericObjects.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Tank.Exceptions; namespace Tank.CollectionGenericObjects; @@ -11,6 +12,7 @@ public class ListGenericObjects : ICollectionGenericObjects where T : clas private readonly List _collection; private int _maxCount; public int Count => _collection.Count; + public CollectionType GetCollectionType => CollectionType.List; public int MaxCount { @@ -23,8 +25,6 @@ public class ListGenericObjects : ICollectionGenericObjects where T : clas if (value > 0) _maxCount = value; } } - - public CollectionType GetCollectionType => CollectionType.List; /// /// Конструктор @@ -36,40 +36,33 @@ public class ListGenericObjects : ICollectionGenericObjects where T : clas public T? Get(int position) { - if (position >= 0 && position < Count) - { - return _collection[position]; - } - else - { - return null; - } - + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); + return _collection[position]; } public int Insert(T obj) { - if (Count == _maxCount) { return -1; } + if (Count == _maxCount) throw new CollectionOverflowException(Count); _collection.Add(obj); return Count; } public int Insert(T obj, int position) { - if (position < 0 || position >= Count || Count == _maxCount) - { - return -1; - } + if (position < 0 || position >= Count) + throw new PositionOutOfCollectionException(position); + + if (Count == _maxCount) + throw new CollectionOverflowException(Count); _collection.Insert(position, obj); return position; - } public T? Remove(int position) { - if (position >= Count || position < 0) return null; + if (position >= Count || position < 0) throw new PositionOutOfCollectionException(position); T? obj = _collection[position]; - _collection?.RemoveAt(position); + _collection.RemoveAt(position); return obj; } diff --git a/Tank/Tank/CollectionGenericObjects/MassiveGenericObjects.cs b/Tank/Tank/CollectionGenericObjects/MassiveGenericObjects.cs index 6adcad3..d30ab92 100644 --- a/Tank/Tank/CollectionGenericObjects/MassiveGenericObjects.cs +++ b/Tank/Tank/CollectionGenericObjects/MassiveGenericObjects.cs @@ -1,4 +1,6 @@ using Tank.CollectionGenericObjects; +using Tank.Exceptions; + namespace Tank.CollectionGenericObjects; /// @@ -8,10 +10,8 @@ namespace Tank.CollectionGenericObjects; public class MassiveGenericObjects : ICollectionGenericObjects where T : class { - /// - /// Массив объектов, которые храним - /// private T?[] _collection; + public int Count => _collection.Length; public int MaxCount { get @@ -24,16 +24,15 @@ public class MassiveGenericObjects : ICollectionGenericObjects { if (_collection.Length > 0) { - Array.Resize(ref _collection, value); + Array.Resize(ref _collection, value - 9); } else { - _collection = new T?[value]; + _collection = new T?[value - 9]; } } } } - public int Count => _collection.Length; public CollectionType GetCollectionType => CollectionType.Massive; @@ -45,19 +44,21 @@ public class MassiveGenericObjects : ICollectionGenericObjects _collection = Array.Empty(); } - public T? Get(int position) + public T Get(int position) { - if (position >= 0 && position < _collection.Length) + if (position < 0 || position >= _collection.Length) { - return _collection[position]; + throw new PositionOutOfCollectionException(); } - - return null; + if (_collection[position] == null) + { + throw new ObjectNotFoundException(position); ////////////// + } + return _collection[position]; } public int Insert(T obj) { - // вставка в свободное место набора for (int i = 0; i < _collection.Length; i++) { if (_collection[i] == null) @@ -66,76 +67,62 @@ public class MassiveGenericObjects : ICollectionGenericObjects return i; } } - - return -1; + throw new CollectionOverflowException(Count); } public int Insert(T obj, int position) { - // проверка позиции if (position < 0 || position >= _collection.Length) { - return -1; + throw new PositionOutOfCollectionException(position); } - // проверка, что элемент массива по этой позиции пустой, если нет, то - // ищется свободное место после этой позиции и идет вставка туда - // если нет после, ищем до - if (_collection[position] != null) + if (_collection[position] == null) { - bool pushed = false; - for (int index = position + 1; index < _collection.Length; index++) + _collection[position] = obj; + return position; + } + else + { + for (int i = position; i < _collection.Length; ++i) //ищем свободное место справа { - if (_collection[index] == null) + if (_collection[i] == null) { - position = index; - pushed = true; - break; + _collection[i] = obj; + return i; } } - - if (!pushed) + for (int i = 0; i < position; ++i) // иначе слева { - for (int index = position - 1; index >= 0; index--) + if (_collection[i] == null) { - if (_collection[index] == null) - { - position = index; - pushed = true; - break; - } + _collection[i] = obj; + return i; } } - - if (!pushed) - { - return position; - } } - - // вставка - _collection[position] = obj; - return position; + throw new CollectionOverflowException(Count); } public T? Remove(int position) { - // проверка позиции if (position < 0 || position >= _collection.Length) + throw new PositionOutOfCollectionException(position); + T? obj = _collection[position]; + if (_collection[position] == null) { - return null; + throw new ObjectNotFoundException(position); } - - if (_collection[position] == null) return null; - - T? temp = _collection[position]; - _collection[position] = null; - return temp; + if (_collection[position] != null) + { + _collection[position] = null; + } + return obj; } public IEnumerable GetItems() { - for (int i = 0; i < _collection.Length; i++) + for (int i = 0; i < _collection.Length; ++i) { yield return _collection[i]; } diff --git a/Tank/Tank/CollectionGenericObjects/StorageCollection.cs b/Tank/Tank/CollectionGenericObjects/StorageCollection.cs index f9e24bf..22ae500 100644 --- a/Tank/Tank/CollectionGenericObjects/StorageCollection.cs +++ b/Tank/Tank/CollectionGenericObjects/StorageCollection.cs @@ -1,6 +1,8 @@ -using Tank.CollectionGenericObjects; +using System.Text; +using Tank.CollectionGenericObjects; using Tank.Drawnings; using Tank.Drowings; +using Tank.Exceptions; namespace Tank.CollectionGenericObjects; @@ -99,36 +101,32 @@ public class StorageCollection /// /// Путь и имя файла /// true - сохранение прошло успешно, false - ошибка при сохранении данных - public bool SaveData(string filename) + public void SaveData(string filename) { if (_storages.Count == 0) { - return false; + throw new Exception("В хранилище отсутствуют коллекции для сохранения"); } - if (File.Exists(filename)) { File.Delete(filename); } - - using FileStream fs = new(filename, FileMode.Create); - using StreamWriter sw = new(fs); - sw.Write(_collectionKey); + StringBuilder sb = new(); + sb.Append(_collectionKey); foreach (KeyValuePair> value in _storages) { - sw.Write(Environment.NewLine); + sb.Append(Environment.NewLine); + // не сохраняем пустые коллекции if (value.Value.Count == 0) { continue; } - - sw.Write(value.Key); - sw.Write(_separatorForKeyValue); - sw.Write(value.Value.GetCollectionType); - sw.Write(_separatorForKeyValue); - sw.Write(value.Value.MaxCount); - sw.Write(_separatorForKeyValue); - + sb.Append(value.Key); + sb.Append(_separatorForKeyValue); + sb.Append(value.Value.GetCollectionType); + sb.Append(_separatorForKeyValue); + sb.Append(value.Value.MaxCount); + sb.Append(_separatorForKeyValue); foreach (T? item in value.Value.GetItems()) { string data = item?.GetDataForSave() ?? string.Empty; @@ -136,68 +134,72 @@ public class StorageCollection { continue; } - - sw.Write(data); - sw.Write(_separatorItems); + sb.Append(data); + sb.Append(_separatorItems); } } - return true; + using FileStream fs = new(filename, FileMode.Create); + byte[] info = new UTF8Encoding(true).GetBytes(sb.ToString()); + fs.Write(info, 0, info.Length); } + /// /// Загрузка информации по самолетам в хранилище из файла /// /// Путь и имя файла /// true - загрузка прошла успешно, false - ошибка при загрузке данных - public bool LoadData(string filename) + public void LoadData(string filename) { if (!File.Exists(filename)) { - return false; + throw new Exception("Файл не существует"); } - using FileStream fs = new(filename, FileMode.Open); - using StreamReader sr = new(fs); - - string str = sr.ReadLine(); - if (str == null || str.Length == 0) + using (StreamReader sr = new StreamReader(filename)) { - return false; - } - - if (!str.Equals(_collectionKey)) - { - return false; - } - _storages.Clear(); - - while (!sr.EndOfStream) - { - string[] record = sr.ReadLine().Split(_separatorForKeyValue, StringSplitOptions.RemoveEmptyEntries); - if (record.Length != 4) + string? str; + str = sr.ReadLine(); + if (str == null || str.Length == 0) + throw new Exception("В файле нет данных"); + if (str != _collectionKey.ToString()) + throw new Exception("В файле неверные данные"); + _storages.Clear(); + while ((str = sr.ReadLine()) != null) { - continue; - } - CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]); - ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionType); - if (collection == null) - { - return false; - } - collection.MaxCount = Convert.ToInt32(record[2]); - - string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); - foreach (string elem in set) - { - if (elem?.CreateDrawningMachine() is T drawningMachine) + string[] record = str.Split(_separatorForKeyValue); + if (record.Length != 4) { - if (collection.Insert(drawningMachine) == -1) - return false; + continue; } + CollectionType collectionType = (CollectionType)Enum.Parse(typeof(CollectionType), record[1]); + ICollectionGenericObjects? collection = StorageCollection.CreateCollection(collectionType); + if (collection == null) + { + throw new Exception("Не удалось создать коллекцию"); + } + + collection.MaxCount = Convert.ToInt32(record[2]) + 9; + + string[] set = record[3].Split(_separatorItems, StringSplitOptions.RemoveEmptyEntries); + foreach (string elem in set) + { + if (elem?.CreateDrawningMachine() is T machine) + { + try + { + if (collection.Insert(machine) == -1) + throw new Exception("Объект не удалось добавить в коллекцию: " + record[3]); + } + catch (CollectionOverflowException ex) + { + throw new Exception("Коллекция переполнена", ex); + } + } + } + _storages.Add(record[0], collection); } - _storages.Add(record[0], collection); } - return true; } /// @@ -205,7 +207,8 @@ public class StorageCollection /// /// /// - private static ICollectionGenericObjects? CreateCollection(CollectionType collectionType) + private static ICollectionGenericObjects? + CreateCollection(CollectionType collectionType) { return collectionType switch { diff --git a/Tank/Tank/Exceptions/CollectionOverflowException.cs b/Tank/Tank/Exceptions/CollectionOverflowException.cs new file mode 100644 index 0000000..b3da426 --- /dev/null +++ b/Tank/Tank/Exceptions/CollectionOverflowException.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Tank.Exceptions; + +/// +/// Класс, описывающий ошибку переполнения коллекции +/// +[Serializable] +public class CollectionOverflowException : ApplicationException +{ + public CollectionOverflowException(int count) : base("В коллекции превышено допустимое количество: " + count) { } + public CollectionOverflowException() : base() { } + public CollectionOverflowException(string message) : base(message) { } + public CollectionOverflowException(string message, Exception exception) : base(message, exception) { } + protected CollectionOverflowException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} \ No newline at end of file diff --git a/Tank/Tank/Exceptions/ObjectNotFoundException.cs b/Tank/Tank/Exceptions/ObjectNotFoundException.cs new file mode 100644 index 0000000..d1c674b --- /dev/null +++ b/Tank/Tank/Exceptions/ObjectNotFoundException.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Tank.Exceptions; + +/// +/// Класс, описывающий ошибку, что по указанной позиции нет элемента +/// +[Serializable] +public class ObjectNotFoundException : ApplicationException +{ + public ObjectNotFoundException(int i) : base("Не найден объект по позиции " + i){ } + public ObjectNotFoundException() : base() { } + public ObjectNotFoundException(string message) : base(message) { } + public ObjectNotFoundException(string message, Exception exception) : base(message, exception) { } + protected ObjectNotFoundException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} \ No newline at end of file diff --git a/Tank/Tank/Exceptions/PositionOutOfCollectionException.cs b/Tank/Tank/Exceptions/PositionOutOfCollectionException.cs new file mode 100644 index 0000000..4332366 --- /dev/null +++ b/Tank/Tank/Exceptions/PositionOutOfCollectionException.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Text; +using System.Threading.Tasks; + +namespace Tank.Exceptions; + +/// +/// Класс, описывающий ошибку выхода за границы коллекции +/// +[Serializable] +internal class PositionOutOfCollectionException : ApplicationException +{ + public PositionOutOfCollectionException(int i) : base("Выход за границы коллекции.Позиция " + i) { } + public PositionOutOfCollectionException() : base() { } + public PositionOutOfCollectionException(string message) : base(message) { } + public PositionOutOfCollectionException(string message, Exception exception) : base(message, exception) { } + protected PositionOutOfCollectionException(SerializationInfo info, StreamingContext contex) : base(info, contex) { } +} \ No newline at end of file diff --git a/Tank/Tank/FormTankCollection.Designer.cs b/Tank/Tank/FormTankCollection.Designer.cs index d45b602..3f51ce2 100644 --- a/Tank/Tank/FormTankCollection.Designer.cs +++ b/Tank/Tank/FormTankCollection.Designer.cs @@ -86,7 +86,7 @@ panelCompanyTools.Name = "panelCompanyTools"; panelCompanyTools.Size = new Size(365, 310); panelCompanyTools.TabIndex = 9; - panelCompanyTools.Paint += panelCompanyTools_Paint; + // // buttonAddTank // @@ -243,7 +243,7 @@ comboBoxSelectorCompany.Name = "comboBoxSelectorCompany"; comboBoxSelectorCompany.Size = new Size(342, 40); comboBoxSelectorCompany.TabIndex = 0; - comboBoxSelectorCompany.SelectedIndexChanged += ComboBoxSelectorCompany_SelectedIndexChanged; + comboBoxSelectorCompany.SelectedIndexChanged += comboBoxSelectorCompany_SelectedIndexChanged; // // pictureBox // diff --git a/Tank/Tank/FormTankCollection.cs b/Tank/Tank/FormTankCollection.cs index 85b4449..cd6f4fe 100644 --- a/Tank/Tank/FormTankCollection.cs +++ b/Tank/Tank/FormTankCollection.cs @@ -1,14 +1,19 @@ -using System; +using Microsoft.Extensions.Logging; +using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; +using System.Numerics; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using Tank; using Tank.CollectionGenericObjects; +using Tank.Drawnings; using Tank.Drowings; +using Tank.Exceptions; namespace Tank; @@ -24,6 +29,20 @@ public partial class FormTankCollection : Form /// private AbstractCompany? _company = null; + /// + /// Логер + /// + private readonly ILogger _logger; + /// + /// Конструктор + /// + public FormTankCollection(ILogger logger) + { + InitializeComponent(); + _storageCollection = new(); + _logger = logger; + } + /// /// /// @@ -38,7 +57,7 @@ public partial class FormTankCollection : Form /// /// /// - private void ComboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) + private void comboBoxSelectorCompany_SelectedIndexChanged(object sender, EventArgs e) { panelCompanyTools.Enabled = false; } @@ -51,15 +70,24 @@ public partial class FormTankCollection : Form private void SetMachine(DrawningMachine machine) { - if (_company == null || machine == null) return; - if (_company + machine != -1) + try { - MessageBox.Show("Объект добавлен"); - pictureBox.Image = _company.Show(); + if (_company == null || machine == null) + { + return; + } + if (_company + machine != -1) + { + MessageBox.Show("Объект добавлен"); + pictureBox.Image = _company.Show(); + _logger.LogInformation("Добавлен объект: " + machine.GetDataForSave()); + } } - else + catch (ObjectNotFoundException) { } + catch (CollectionOverflowException ex) { MessageBox.Show("Не удалось добавить объект"); + _logger.LogError("Ошибка: {Message}", ex.Message); } } @@ -79,14 +107,19 @@ public partial class FormTankCollection : Form return; } int pos = Convert.ToInt32(maskedTextBoxPosition.Text); - if (_company - pos != null) + try { - MessageBox.Show("Объект удален"); - pictureBox.Image = _company.Show(); + if (_company - pos != null) + { + MessageBox.Show("Объект удален"); + _logger.LogInformation("Удален объект - " + pos); + pictureBox.Image = _company.Show(); + } } - else + catch (Exception ex) { MessageBox.Show("Не удалось удалить объект"); + _logger.LogError("Ошибка: {Message}", ex.Message); } } @@ -115,31 +148,39 @@ public partial class FormTankCollection : Form } DrawningMachine? tank = null; int counter = 100; - while (tank == null) + try { - tank = _company.GetRandomObject(); - counter--; - if (counter <= 0) + while (tank == null) { - break; + tank = _company.GetRandomObject(); + counter--; + if (counter <= 0) + { + break; + } } + if (tank == null) + { + return; + } + FormTank form = new() + { + SetMachine = tank + }; + form.ShowDialog(); } - if (tank == null) + catch (Exception ex) { - return; + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); } - FormTank form = new() - { - SetMachine = tank - }; - form.ShowDialog(); } - /// - /// Перерисовка коллекции - /// - /// - /// - private void ButtonRefresh_Click(object sender, EventArgs e) + +/// +/// Перерисовка коллекции +/// +/// +/// +private void ButtonRefresh_Click(object sender, EventArgs e) { if (_company == null) { @@ -155,17 +196,26 @@ public partial class FormTankCollection : Form MessageBox.Show("Не все данные заполнены", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - CollectionType collectionType = CollectionType.None; - if (radioButtonMassive.Checked) + try { - collectionType = CollectionType.Massive; + CollectionType collectionType = CollectionType.None; + if (radioButtonMassive.Checked) + { + collectionType = CollectionType.Massive; + } + else if (radioButtonList.Checked) + { + collectionType = CollectionType.List; + } + + _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); + RefreshListBoxItems(); + _logger.LogInformation("Коллекция добавлена " + textBoxCollectionName.Text); } - else if (radioButtonList.Checked) + catch (Exception ex) { - collectionType = CollectionType.List; + _logger.LogError("Ошибка: {Message}", ex.Message); } - _storageCollection.AddCollection(textBoxCollectionName.Text, collectionType); - RefreshListBoxItems(); } private void buttonCollectionDel_Click(object sender, EventArgs e) @@ -175,12 +225,20 @@ public partial class FormTankCollection : Form MessageBox.Show("Коллекция не выбрана"); return; } - if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + try { - return; + if (MessageBox.Show("Удалить коллекцию?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) + { + return; + } + _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString()); + RefreshListBoxItems(); + _logger.LogInformation("Коллекция " + listBoxCollection.SelectedItem.ToString() + " удалена"); + } + catch (Exception ex) + { + _logger.LogError("Ошибка: {Message}", ex.Message); } - _storageCollection.DelCollection(listBoxCollection.SelectedItem.ToString() ?? string.Empty); - RefreshListBoxItems(); } /// /// Обновление списка в listBoxCollection @@ -214,11 +272,6 @@ public partial class FormTankCollection : Form } - private void panelCompanyTools_Paint(object sender, PaintEventArgs e) - { - - } - /// /// /// @@ -240,13 +293,16 @@ public partial class FormTankCollection : Form { if (saveFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.SaveData(saveFileDialog.FileName)) + try { + _storageCollection.SaveData(saveFileDialog.FileName); MessageBox.Show("Сохранение прошло успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Сохранение в файл: {filename}", saveFileDialog.FileName); } - else + catch (Exception ex) { - MessageBox.Show("Не сохранилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); } } } @@ -260,14 +316,19 @@ public partial class FormTankCollection : Form { if (openFileDialog.ShowDialog() == DialogResult.OK) { - if (_storageCollection.LoadData(openFileDialog.FileName)) + try { - MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _storageCollection.LoadData(openFileDialog.FileName); RefreshListBoxItems(); + MessageBox.Show("Загрузка прошла успешно", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Information); + _logger.LogInformation("Загрузка из файла: {filename}", + openFileDialog.FileName); } - else + catch (Exception ex) { - MessageBox.Show("Не загрузилось", "Результат", MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Результат", + MessageBoxButtons.OK, MessageBoxIcon.Error); + _logger.LogError("Ошибка: {Message}", ex.Message); } } } diff --git a/Tank/Tank/Program.cs b/Tank/Tank/Program.cs index 5db0562..a76b74b 100644 --- a/Tank/Tank/Program.cs +++ b/Tank/Tank/Program.cs @@ -1,17 +1,39 @@ -namespace Tank +using Tank; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using NLog.Extensions.Logging; + +namespace Tank; + + +internal static class Program { - internal static class Program + /// + /// + /// + [STAThread] + static void Main() { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + ServiceCollection services = new(); + ConfigureServices(services); + using ServiceProvider serviceProvider = + services.BuildServiceProvider(); + Application.Run(serviceProvider.GetRequiredService()); + } + /// + /// + /// + /// + private static void ConfigureServices(ServiceCollection services) + { + services.AddSingleton() + .AddLogging(option => { - // To customize application configuration such as set high DPI settings or default font, - // see https://aka.ms/applicationconfiguration. - ApplicationConfiguration.Initialize(); - Application.Run(new FormTankCollection()); - } + option.SetMinimumLevel(LogLevel.Information); + option.AddNLog("nlog.config"); + }); } } \ No newline at end of file diff --git a/Tank/Tank/Tank.csproj b/Tank/Tank/Tank.csproj index 13ee123..3aa8e06 100644 --- a/Tank/Tank/Tank.csproj +++ b/Tank/Tank/Tank.csproj @@ -8,6 +8,16 @@ enable + + + + + + + + + + True @@ -23,4 +33,10 @@ + + + Always + + + \ No newline at end of file diff --git a/Tank/Tank/nlog.config b/Tank/Tank/nlog.config new file mode 100644 index 0000000..63b7d65 --- /dev/null +++ b/Tank/Tank/nlog.config @@ -0,0 +1,14 @@ + + + + + + + + + + + \ No newline at end of file