using System; using System.Configuration; using System.IO; using System.Reflection; using XP.Common.Logging.Interfaces; namespace XP.Hardware.RaySource.Config { /// /// 配置加载器 | Configuration Loader /// 从App.config读取配置,适配.NET 8 ConfigurationManager | Load configuration from App.config, adapted for .NET 8 ConfigurationManager /// public class ConfigLoader { private const string CONFIG_SECTION = "RaySource"; /// /// 加载射线源配置 | Load X-ray source configuration /// /// 配置文件路径(可选,默认使用App.config)| Configuration file path (optional, defaults to App.config) /// 日志服务(可选)| Logger service (optional) /// 配置对象 | Configuration object public static RaySourceConfig LoadConfig(string configFilePath = null, ILoggerService logger = null) { var config = new RaySourceConfig(); try { // 如果指定了配置文件路径,使用自定义配置文件 // If a configuration file path is specified, use custom configuration file if (!string.IsNullOrEmpty(configFilePath) && File.Exists(configFilePath)) { var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFilePath }; var configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); LoadFromConfiguration(config, configuration.AppSettings.Settings, logger); } else { // 使用默认App.config | Use default App.config LoadFromAppSettings(config, logger); } } catch (Exception ex) { Console.WriteLine($"[配置加载警告 | Config Load Warning] 使用默认配置: {ex.Message}"); // 加载失败时返回默认配置 | Return default configuration on load failure } return config; } /// /// 从AppSettings加载配置 | Load configuration from AppSettings /// private static void LoadFromAppSettings(RaySourceConfig config, ILoggerService logger = null) { // PVI通讯参数 | PVI Communication Parameters config.SourceType = GetAppSetting(CONFIG_SECTION + ":" + "SourceType", config.SourceType); config.PlcIpAddress = GetAppSetting(CONFIG_SECTION + ":" + "PlcIpAddress", config.PlcIpAddress); config.PlcPort = GetAppSetting(CONFIG_SECTION + ":" + "PlcPort", config.PlcPort); config.StationNumber = GetAppSetting(CONFIG_SECTION + ":" + "StationNumber", config.StationNumber); config.PortNumber = GetAppSetting(CONFIG_SECTION + ":" + "PortNumber", config.PortNumber); config.CpuName = GetAppSetting(CONFIG_SECTION + ":" + "CpuName", config.CpuName); config.ConnectionTimeout = GetAppSetting(CONFIG_SECTION + ":" + "ConnectionTimeout", config.ConnectionTimeout); // 硬件参数范围 | Hardware Parameter Ranges config.MinVoltage = GetAppSetting(CONFIG_SECTION + ":" + "MinVoltage", config.MinVoltage); config.MaxVoltage = GetAppSetting(CONFIG_SECTION + ":" + "MaxVoltage", config.MaxVoltage); config.MinCurrent = GetAppSetting(CONFIG_SECTION + ":" + "MinCurrent", config.MinCurrent); config.MaxCurrent = GetAppSetting(CONFIG_SECTION + ":" + "MaxCurrent", config.MaxCurrent); // 外部程序配置 | External Program Configuration config.AdvanceExePath = GetAppSetting(CONFIG_SECTION + ":" + "AdvanceExePath", config.AdvanceExePath); // 操作超时配置 | Operation Timeout Configuration config.InitializationTimeout = GetAppSetting(CONFIG_SECTION + ":" + "InitializationTimeout", config.InitializationTimeout); config.WarmUpTimeout = GetAppSetting(CONFIG_SECTION + ":" + "WarmUpTimeout", config.WarmUpTimeout); config.StartUpTimeout = GetAppSetting(CONFIG_SECTION + ":" + "StartUpTimeout", config.StartUpTimeout); config.AutoCenterTimeout = GetAppSetting(CONFIG_SECTION + ":" + "AutoCenterTimeout", config.AutoCenterTimeout); config.FilamentAdjustTimeout = GetAppSetting(CONFIG_SECTION + ":" + "FilamentAdjustTimeout", config.FilamentAdjustTimeout); config.GeneralOperationTimeout = GetAppSetting(CONFIG_SECTION + ":" + "GeneralOperationTimeout", config.GeneralOperationTimeout); // 灯丝寿命配置 | Filament Lifetime Configuration config.SerialNumber = GetAppSetting(CONFIG_SECTION + ":" + "SerialNumber", config.SerialNumber); config.TotalLifeThreshold = GetAppSetting(CONFIG_SECTION + ":" + "TotalLifeThreshold", config.TotalLifeThreshold); } /// /// 从Configuration对象加载配置 | Load configuration from Configuration object /// private static void LoadFromConfiguration(RaySourceConfig config, KeyValueConfigurationCollection settings, ILoggerService logger = null) { config.SourceType = GetSetting(settings, CONFIG_SECTION + ":" + "SourceType", config.SourceType); config.PlcIpAddress = GetSetting(settings, CONFIG_SECTION + ":" + "PlcIpAddress", config.PlcIpAddress); config.PlcPort = GetSetting(settings, CONFIG_SECTION + ":" + "PlcPort", config.PlcPort); config.StationNumber = GetSetting(settings, CONFIG_SECTION + ":" + "StationNumber", config.StationNumber); config.PortNumber = GetSetting(settings, CONFIG_SECTION + ":" + "PortNumber", config.PortNumber); config.CpuName = GetSetting(settings, CONFIG_SECTION + ":" + "CpuName", config.CpuName); config.ConnectionTimeout = GetSetting(settings, CONFIG_SECTION + ":" + "ConnectionTimeout", config.ConnectionTimeout); config.MinVoltage = GetSetting(settings, CONFIG_SECTION + ":" + "MinVoltage", config.MinVoltage); config.MaxVoltage = GetSetting(settings, CONFIG_SECTION + ":" + "MaxVoltage", config.MaxVoltage); config.MinCurrent = GetSetting(settings, CONFIG_SECTION + ":" + "MinCurrent", config.MinCurrent); config.MaxCurrent = GetSetting(settings, CONFIG_SECTION + ":" + "MaxCurrent", config.MaxCurrent); // 外部程序配置 | External Program Configuration config.AdvanceExePath = GetSetting(settings, CONFIG_SECTION + ":" + "AdvanceExePath", config.AdvanceExePath); config.InitializationTimeout = GetSetting(settings, CONFIG_SECTION + ":" + "InitializationTimeout", config.InitializationTimeout); config.WarmUpTimeout = GetSetting(settings, CONFIG_SECTION + ":" + "WarmUpTimeout", config.WarmUpTimeout); config.StartUpTimeout = GetSetting(settings, CONFIG_SECTION + ":" + "StartUpTimeout", config.StartUpTimeout); config.AutoCenterTimeout = GetSetting(settings, CONFIG_SECTION + ":" + "AutoCenterTimeout", config.AutoCenterTimeout); config.FilamentAdjustTimeout = GetSetting(settings, CONFIG_SECTION + ":" + "FilamentAdjustTimeout", config.FilamentAdjustTimeout); config.GeneralOperationTimeout = GetSetting(settings, CONFIG_SECTION + ":" + "GeneralOperationTimeout", config.GeneralOperationTimeout); // 灯丝寿命配置 | Filament Lifetime Configuration config.SerialNumber = GetSetting(settings, CONFIG_SECTION + ":" + "SerialNumber", config.SerialNumber); config.TotalLifeThreshold = GetSetting(settings, CONFIG_SECTION + ":" + "TotalLifeThreshold", config.TotalLifeThreshold); } /// /// 保存配置到AppSettings | Save configuration to AppSettings /// public static void SaveConfigToAppSettings(RaySourceConfig config) { // 获取程序默认配置文件路径(对应 ConfigurationManager.AppSettings 的文件) Assembly entryAssembly = Assembly.GetEntryAssembly() ?? Assembly.GetExecutingAssembly(); string assemblyPath = entryAssembly.Location; string defaultConfigPath = Path.ChangeExtension(assemblyPath, ".config"); // 复用原有保存逻辑 SaveConfig(config, defaultConfigPath); // 刷新 ConfigurationManager,让 AppSettings 立即读取最新值 ConfigurationManager.RefreshSection("appSettings"); } /// /// 保存配置到文件 | Save configuration to file /// public static void SaveConfig(RaySourceConfig config, string configFilePath) { try { var fileMap = new ExeConfigurationFileMap { ExeConfigFilename = configFilePath }; var configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "SourceType", config.SourceType); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "PlcIpAddress", config.PlcIpAddress); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "PlcPort", config.PlcPort.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "StationNumber", config.StationNumber.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "PortNumber", config.PortNumber.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "CpuName", config.CpuName); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "ConnectionTimeout", config.ConnectionTimeout.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "MinVoltage", config.MinVoltage.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "MaxVoltage", config.MaxVoltage.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "MinCurrent", config.MinCurrent.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "MaxCurrent", config.MaxCurrent.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "AdvanceExePath", config.AdvanceExePath); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "InitializationTimeout", config.InitializationTimeout.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "WarmUpTimeout", config.WarmUpTimeout.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "StartUpTimeout", config.StartUpTimeout.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "AutoCenterTimeout", config.AutoCenterTimeout.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "FilamentAdjustTimeout", config.FilamentAdjustTimeout.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "GeneralOperationTimeout", config.GeneralOperationTimeout.ToString()); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "SerialNumber", config.SerialNumber); SetSetting(configuration.AppSettings.Settings, CONFIG_SECTION + ":" + "TotalLifeThreshold", config.TotalLifeThreshold.ToString()); configuration.Save(ConfigurationSaveMode.Modified); } catch (Exception ex) { throw new InvalidOperationException($"保存配置失败: {ex.Message}", ex); } } #region 辅助方法 | Helper Methods private static string GetAppSetting(string key, string defaultValue) { return ConfigurationManager.AppSettings[key] ?? defaultValue; } private static int GetAppSetting(string key, int defaultValue) { var value = ConfigurationManager.AppSettings[key]; return int.TryParse(value, out var result) ? result : defaultValue; } private static float GetAppSetting(string key, float defaultValue) { var value = ConfigurationManager.AppSettings[key]; return float.TryParse(value, out var result) ? result : defaultValue; } private static bool GetAppSetting(string key, bool defaultValue) { var value = ConfigurationManager.AppSettings[key]; return bool.TryParse(value, out var result) ? result : defaultValue; } private static string GetSetting(KeyValueConfigurationCollection settings, string key, string defaultValue) { return settings[key]?.Value ?? defaultValue; } private static int GetSetting(KeyValueConfigurationCollection settings, string key, int defaultValue) { var value = settings[key]?.Value; return int.TryParse(value, out var result) ? result : defaultValue; } private static float GetSetting(KeyValueConfigurationCollection settings, string key, float defaultValue) { var value = settings[key]?.Value; return float.TryParse(value, out var result) ? result : defaultValue; } private static bool GetSetting(KeyValueConfigurationCollection settings, string key, bool defaultValue) { var value = settings[key]?.Value; return bool.TryParse(value, out var result) ? result : defaultValue; } private static void SetSetting(KeyValueConfigurationCollection settings, string key, string value) { if (settings[key] == null) settings.Add(key, value); else settings[key].Value = value; } #endregion } }