синхронизация пользовтаелей
This commit is contained in:
parent
356c8a6d02
commit
ba47e48eeb
@ -0,0 +1,31 @@
|
||||
using ModuleTools.Interfaces;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ModuleTools.BusinessLogics
|
||||
{
|
||||
/// <summary>
|
||||
/// Основа всех бизнес-логик
|
||||
/// </summary>
|
||||
public class CoreBusinessLogic
|
||||
{
|
||||
/// <summary>
|
||||
/// Менеджер безопасности
|
||||
/// </summary>
|
||||
protected readonly ISecurityManager _security;
|
||||
|
||||
/// <summary>
|
||||
/// Перечень ошибок при выполнении операции
|
||||
/// </summary>
|
||||
public List<(string Title, string Message)> Errors { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// Основа всех бизнес-логик
|
||||
/// </summary>
|
||||
/// <param name="service"></param>
|
||||
public CoreBusinessLogic()
|
||||
{
|
||||
_security = DependencyManager.Instance.Resolve<ISecurityManager>();
|
||||
Errors = new();
|
||||
}
|
||||
}
|
||||
}
|
@ -4,7 +4,6 @@ using ModuleTools.Interfaces;
|
||||
using ModuleTools.Models;
|
||||
using ModuleTools.ViewModels;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace ModuleTools.BusinessLogics
|
||||
{
|
||||
@ -15,27 +14,17 @@ namespace ModuleTools.BusinessLogics
|
||||
/// <typeparam name="S"></typeparam>
|
||||
/// <typeparam name="L"></typeparam>
|
||||
/// <typeparam name="E"></typeparam>
|
||||
public class GenericBusinessLogic<G, S, L, E>
|
||||
public class GenericBusinessLogic<G, S, L, E> : CoreBusinessLogic
|
||||
where G : GetBindingModel
|
||||
where S : SetBindingModel
|
||||
where L : ListViewModel<E>
|
||||
where E : ElementViewModel
|
||||
{
|
||||
/// <summary>
|
||||
/// Перечень ошибок при выполнении операции
|
||||
/// </summary>
|
||||
public List<(string Title, string Message)> Errors { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// Сервис с хранилищем данных
|
||||
/// </summary>
|
||||
protected IGenerticEntityService<G, S> Service { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Менеджер безопасности
|
||||
/// </summary>
|
||||
protected ISecurityManager Security { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Тип операции, скоторым работает логика
|
||||
/// </summary>
|
||||
@ -54,8 +43,6 @@ namespace ModuleTools.BusinessLogics
|
||||
public GenericBusinessLogic(IGenerticEntityService<G, S> service, string entity, AccessOperation serviceOperation)
|
||||
{
|
||||
Service = service;
|
||||
Errors = new List<(string Title, string Message)>();
|
||||
Security = DependencyManager.Instance.Resolve<ISecurityManager>();
|
||||
_entity = entity;
|
||||
_serviceOperation = serviceOperation;
|
||||
}
|
||||
@ -68,11 +55,11 @@ namespace ModuleTools.BusinessLogics
|
||||
/// <returns></returns>
|
||||
protected bool NoAccess(AccessBindingModel model, AccessType type)
|
||||
{
|
||||
if (Security.CheckAccess(new SecurityManagerCheckAccessModel(model, _serviceOperation, type, _entity)))
|
||||
if (_security.CheckAccess(new SecurityManagerCheckAccessModel(model, _serviceOperation, type, _entity)))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Errors.Add(("Ошибка безопасности", Security.ErrorMessage));
|
||||
Errors.Add(("Ошибка безопасности", _security.ErrorMessage));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -19,6 +19,8 @@
|
||||
ПользователиРоли = 5,
|
||||
|
||||
РаботасБекапом = 10,
|
||||
|
||||
Синхронизация = 11,
|
||||
#endregion
|
||||
|
||||
#region База
|
||||
|
@ -1,12 +1,10 @@
|
||||
using ModuleTools.BusinessLogics;
|
||||
using ModuleTools.Enums;
|
||||
using ModuleTools.Extensions;
|
||||
using ModuleTools.Interfaces;
|
||||
using ModuleTools.Models;
|
||||
using SecurityBusinessLogic.BindingModels;
|
||||
using SecurityBusinessLogic.Interfaces;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace SecurityBusinessLogic.BusinessLogics
|
||||
@ -14,33 +12,18 @@ namespace SecurityBusinessLogic.BusinessLogics
|
||||
/// <summary>
|
||||
/// Логика работы с бекапом
|
||||
/// </summary>
|
||||
public class BackupBusinessLogic
|
||||
public class BackupBusinessLogic : CoreBusinessLogic
|
||||
{
|
||||
/// <summary>
|
||||
/// Серивс для работы с бекапом
|
||||
/// </summary>
|
||||
private readonly IBackupService _service;
|
||||
|
||||
/// <summary>
|
||||
/// Менеджер безопасности
|
||||
/// </summary>
|
||||
private readonly ISecurityManager _security;
|
||||
|
||||
/// <summary>
|
||||
/// Перечень ошибок при выполнении операции
|
||||
/// </summary>
|
||||
public List<(string Title, string Message)> Errors { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// Логика работы с бекапом
|
||||
/// </summary>
|
||||
/// <param name="service"></param>
|
||||
public BackupBusinessLogic(IBackupService service)
|
||||
{
|
||||
_service = service;
|
||||
_security = DependencyManager.Instance.Resolve<ISecurityManager>();
|
||||
Errors = new();
|
||||
}
|
||||
public BackupBusinessLogic(IBackupService service) => _service = service;
|
||||
|
||||
/// <summary>
|
||||
/// Создание бекапа с данными
|
||||
|
@ -0,0 +1,67 @@
|
||||
using ModuleTools.BusinessLogics;
|
||||
using ModuleTools.Enums;
|
||||
using ModuleTools.Models;
|
||||
using SecurityBusinessLogic.Interfaces;
|
||||
using System;
|
||||
|
||||
namespace SecurityBusinessLogic.BusinessLogics
|
||||
{
|
||||
/// <summary>
|
||||
/// Логика синхронизации пользователей
|
||||
/// </summary>
|
||||
public class SynchronizationBusinessLogic : CoreBusinessLogic
|
||||
{
|
||||
/// <summary>
|
||||
/// Серивс для работы с бекапом
|
||||
/// </summary>
|
||||
private readonly ISynchronizationService _service;
|
||||
|
||||
/// <summary>
|
||||
/// Логика работы с бекапом
|
||||
/// </summary>
|
||||
/// <param name="service"></param>
|
||||
public SynchronizationBusinessLogic(ISynchronizationService service) => _service = service;
|
||||
|
||||
/// <summary>
|
||||
/// Запуск синхронизации
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
public bool RunSynchronization()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (NoAccess())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
var result = _service.RunSynchronization();
|
||||
if (!result.IsSucceeded)
|
||||
{
|
||||
Errors.AddRange(result.Errors);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Errors.Add(("Ошибка", ex.Message));
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Проверка доступности операции для пользователя
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private bool NoAccess()
|
||||
{
|
||||
if (_security.CheckAccess(new SecurityManagerCheckAccessModel(null, AccessOperation.Синхронизация, AccessType.Delete, "Синхронизация")))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
Errors.Add(("Ошибка безопасности", _security.ErrorMessage));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
using ModuleTools.Models;
|
||||
|
||||
namespace SecurityBusinessLogic.Interfaces
|
||||
{
|
||||
/// <summary>
|
||||
/// Синхронизация пользователей (преподаватели, сотрудники, студенты)
|
||||
/// </summary>
|
||||
public interface ISynchronizationService
|
||||
{
|
||||
/// <summary>
|
||||
/// Синхронизация
|
||||
/// </summary>
|
||||
/// <param name="model"></param>
|
||||
/// <returns></returns>
|
||||
OperationResultModel RunSynchronization();
|
||||
}
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
using ModuleTools.Models;
|
||||
using SecurityBusinessLogic.Interfaces;
|
||||
|
||||
namespace SecurityDatabaseImplementation.Implementations
|
||||
{
|
||||
/// <summary>
|
||||
/// Реализация ISynchronizationService
|
||||
/// </summary>
|
||||
public class SynchronizationService : ISynchronizationService
|
||||
{
|
||||
public OperationResultModel RunSynchronization()
|
||||
{
|
||||
// пока нечего синхронизировать
|
||||
return OperationResultModel.Success(null);
|
||||
}
|
||||
}
|
||||
}
|
@ -16,6 +16,7 @@ namespace SecurityDatabaseImplementation
|
||||
DependencyManager.Instance.RegisterType<IUserRoleService, UserRoleService>();
|
||||
|
||||
DependencyManager.Instance.RegisterType<IBackupService, BackupJsonContractService>();
|
||||
DependencyManager.Instance.RegisterType<ISynchronizationService, SynchronizationService>();
|
||||
}
|
||||
}
|
||||
}
|
@ -76,7 +76,8 @@ namespace SecurityWindowsDesktop
|
||||
};
|
||||
List<IControl> _controls = new()
|
||||
{
|
||||
new BackupControl()
|
||||
new BackupControl(),
|
||||
new SynchronizationControl()
|
||||
};
|
||||
|
||||
foreach (var cntrl in _controls)
|
||||
|
@ -131,7 +131,6 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
this.toolStripHeader.Size = new System.Drawing.Size(708, 25);
|
||||
this.toolStripHeader.TabIndex = 1;
|
||||
this.toolStripHeader.Text = "toolStrip1";
|
||||
this.toolStripHeader.ItemClicked += new System.Windows.Forms.ToolStripItemClickedEventHandler(this.ToolStripHeader_ItemClicked);
|
||||
//
|
||||
// toolStripButtonClose
|
||||
//
|
||||
|
@ -17,7 +17,7 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
public partial class BackupControl : UserControl, IControl
|
||||
{
|
||||
/// <summary>
|
||||
/// Класс с бизнес-лоникой работы с бекапом
|
||||
/// Класс с бизнес-логикой работы с бекапом
|
||||
/// </summary>
|
||||
private readonly BackupBusinessLogic _businessLogic;
|
||||
|
||||
@ -36,6 +36,11 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
Title = "Работа с бекапом";
|
||||
ControlId = new Guid("cc9844e6-5d92-4c89-b817-4c17ec382bc1");
|
||||
AccessOperation = AccessOperation.РаботасБекапом;
|
||||
toolStripButtonClose.Click += (object sender, EventArgs e) =>
|
||||
{
|
||||
CloseEvent?.Invoke(ControlId);
|
||||
Dispose();
|
||||
};
|
||||
}
|
||||
|
||||
#region IControl
|
||||
@ -71,17 +76,6 @@ namespace SecurityWindowsDesktop.SpecialControls
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Закрытие контрола
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void ToolStripHeader_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
|
||||
{
|
||||
CloseEvent?.Invoke(ControlId);
|
||||
Dispose();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Выбор пути для папки сохранения бекапа
|
||||
/// </summary>
|
||||
|
89
DepartmentPortal/Security/SecurityWindowsDesktop/SpecialControls/SynchronizationControl.Designer.cs
generated
Normal file
89
DepartmentPortal/Security/SecurityWindowsDesktop/SpecialControls/SynchronizationControl.Designer.cs
generated
Normal file
@ -0,0 +1,89 @@
|
||||
|
||||
namespace SecurityWindowsDesktop.SpecialControls
|
||||
{
|
||||
partial class SynchronizationControl
|
||||
{
|
||||
/// <summary>
|
||||
/// Обязательная переменная конструктора.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Освободить все используемые ресурсы.
|
||||
/// </summary>
|
||||
/// <param name="disposing">истинно, если управляемый ресурс должен быть удален; иначе ложно.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Код, автоматически созданный конструктором компонентов
|
||||
|
||||
/// <summary>
|
||||
/// Требуемый метод для поддержки конструктора — не изменяйте
|
||||
/// содержимое этого метода с помощью редактора кода.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.toolStripHeader = new System.Windows.Forms.ToolStrip();
|
||||
this.toolStripButtonClose = new System.Windows.Forms.ToolStripButton();
|
||||
this.buttonRunSynchronization = new System.Windows.Forms.Button();
|
||||
this.toolStripHeader.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// toolStripHeader
|
||||
//
|
||||
this.toolStripHeader.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.toolStripButtonClose});
|
||||
this.toolStripHeader.Location = new System.Drawing.Point(0, 0);
|
||||
this.toolStripHeader.Name = "toolStripHeader";
|
||||
this.toolStripHeader.Size = new System.Drawing.Size(647, 25);
|
||||
this.toolStripHeader.TabIndex = 0;
|
||||
this.toolStripHeader.Text = "toolStrip1";
|
||||
//
|
||||
// toolStripButtonClose
|
||||
//
|
||||
this.toolStripButtonClose.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right;
|
||||
this.toolStripButtonClose.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image;
|
||||
this.toolStripButtonClose.Image = global::SecurityWindowsDesktop.Properties.Resources.Close;
|
||||
this.toolStripButtonClose.ImageTransparentColor = System.Drawing.Color.Magenta;
|
||||
this.toolStripButtonClose.Name = "toolStripButtonClose";
|
||||
this.toolStripButtonClose.Size = new System.Drawing.Size(23, 22);
|
||||
this.toolStripButtonClose.Text = "Закрыть";
|
||||
//
|
||||
// buttonRunSynchronization
|
||||
//
|
||||
this.buttonRunSynchronization.Location = new System.Drawing.Point(124, 59);
|
||||
this.buttonRunSynchronization.Name = "buttonRunSynchronization";
|
||||
this.buttonRunSynchronization.Size = new System.Drawing.Size(375, 151);
|
||||
this.buttonRunSynchronization.TabIndex = 1;
|
||||
this.buttonRunSynchronization.Text = "Сделай за**ись";
|
||||
this.buttonRunSynchronization.UseVisualStyleBackColor = true;
|
||||
this.buttonRunSynchronization.Click += new System.EventHandler(this.ButtonRunSynchronization_Click);
|
||||
//
|
||||
// SynchronizationControl
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.Controls.Add(this.buttonRunSynchronization);
|
||||
this.Controls.Add(this.toolStripHeader);
|
||||
this.Name = "SynchronizationControl";
|
||||
this.Size = new System.Drawing.Size(647, 508);
|
||||
this.toolStripHeader.ResumeLayout(false);
|
||||
this.toolStripHeader.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
this.PerformLayout();
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private System.Windows.Forms.ToolStrip toolStripHeader;
|
||||
private System.Windows.Forms.ToolStripButton toolStripButtonClose;
|
||||
private System.Windows.Forms.Button buttonRunSynchronization;
|
||||
}
|
||||
}
|
@ -0,0 +1,98 @@
|
||||
using DesktopTools.Helpers;
|
||||
using DesktopTools.Interfaces;
|
||||
using DesktopTools.Models;
|
||||
using ModuleTools.BusinessLogics;
|
||||
using ModuleTools.Enums;
|
||||
using SecurityBusinessLogic.BusinessLogics;
|
||||
using System;
|
||||
using System.Windows.Forms;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace SecurityWindowsDesktop.SpecialControls
|
||||
{
|
||||
/// <summary>
|
||||
/// Контрол для работы с синхронизацией
|
||||
/// </summary>
|
||||
public partial class SynchronizationControl : UserControl, IControl
|
||||
{
|
||||
/// <summary>
|
||||
/// Класс с бизнес-логикой работы с синхронизацией
|
||||
/// </summary>
|
||||
private readonly SynchronizationBusinessLogic _businessLogic;
|
||||
|
||||
/// <summary>
|
||||
/// Событие, вызываемое при закрытии контрола
|
||||
/// </summary>
|
||||
private event Action<Guid> CloseEvent;
|
||||
|
||||
/// <summary>
|
||||
/// Контрол для работы с синхронизацией
|
||||
/// </summary>
|
||||
public SynchronizationControl()
|
||||
{
|
||||
InitializeComponent();
|
||||
_businessLogic = DependencyManager.Instance.Resolve<SynchronizationBusinessLogic>();
|
||||
Title = "Синхронизация";
|
||||
ControlId = new Guid("c392818b-9036-4c4b-8a57-8ff935115e6a");
|
||||
AccessOperation = AccessOperation.Синхронизация;
|
||||
toolStripButtonClose.Click += (object sender, EventArgs e) =>
|
||||
{
|
||||
CloseEvent?.Invoke(ControlId);
|
||||
Dispose();
|
||||
};
|
||||
}
|
||||
|
||||
#region IControl
|
||||
public Guid ControlId { get; private set; }
|
||||
|
||||
public string Title { get; private set; }
|
||||
|
||||
public AccessOperation AccessOperation { get; private set; }
|
||||
|
||||
public IControl GetInstance() => new SynchronizationControl() { ControlId = Guid.NewGuid() };
|
||||
|
||||
public void Open(ControlOpenModel model)
|
||||
{
|
||||
if (model.CloseList != null)
|
||||
{
|
||||
CloseEvent += model.CloseList;
|
||||
}
|
||||
Dock = DockStyle.Fill;
|
||||
}
|
||||
|
||||
public string SaveToXml() => new XElement("Control",
|
||||
new XAttribute("Type", GetType().FullName),
|
||||
new XAttribute("ControlId", ControlId),
|
||||
new XAttribute("Title", Title),
|
||||
new XAttribute("AccessOperation", AccessOperation)).ToString();
|
||||
|
||||
public void LoadFromXml(string xml)
|
||||
{
|
||||
var control = XElement.Parse(xml);
|
||||
ControlId = new Guid(control.Attribute("ControlId").Value.ToString());
|
||||
Title = control.Attribute("Title").Value.ToString();
|
||||
AccessOperation = (AccessOperation)Enum.Parse(typeof(AccessOperation), control.Attribute("AccessOperation").Value.ToString());
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Запуск синхронизации
|
||||
/// </summary>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="e"></param>
|
||||
private void ButtonRunSynchronization_Click(object sender, EventArgs e)
|
||||
{
|
||||
var cursor = Cursor.Current;
|
||||
Cursor.Current = Cursors.WaitCursor;
|
||||
if (_businessLogic.RunSynchronization())
|
||||
{
|
||||
DialogHelper.MessageInformation("Синхронизация прошла успешно", "Результат");
|
||||
}
|
||||
else
|
||||
{
|
||||
DialogHelper.MessageException(_businessLogic.Errors, "Ошибки при синхронизации");
|
||||
}
|
||||
Cursor.Current = cursor;
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
<root>
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
</root>
|
Loading…
Reference in New Issue
Block a user