using System; using System.Linq; using System.Windows.Forms; using DCIT.App.Forms; using DCIT.App.Presentation; using DCIT.Core.Services; namespace DCIT.App { internal static class Program { [STAThread] private static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); try { var startupDirectory = AppContext.BaseDirectory; var runtimeValidationService = new RuntimeEnvironmentValidationService(startupDirectory); var runtimeValidationResult = runtimeValidationService.Validate(); if (runtimeValidationResult.HasBlockingIssues) { MessageBox.Show( BuildRuntimeValidationMessage(runtimeValidationResult), "WORD 2007 格式调整软件", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } var logService = new LogService(startupDirectory); LogRuntimeValidation(logService, runtimeValidationResult); var configurationService = new ConfigurationService(startupDirectory); var configurationLoadResult = configurationService.Load(); var fileScanService = new FileScanService(); var ruleService = new RuleService(); var docConversionService = new OfficeDocConversionService(startupDirectory); var wordTextExtractionService = new WordTextExtractionService(docConversionService); var autoExtractService = new AutoExtractService(wordTextExtractionService); var bmpDiffCodec = new BmpDiffCodec(); var diffSerializationService = new DiffSerializationService(bmpDiffCodec); var documentProcessingService = new DocumentProcessingService(diffSerializationService, docConversionService); var dialogService = new UserDialogService(); var temporaryFileCleanupService = new TemporaryFileCleanupService(); var cleanupResult = temporaryFileCleanupService.Cleanup(configurationLoadResult.Config); if (cleanupResult.RemovedFiles.Count > 0) { logService.Info("TEMP_CLEANUP", string.Format("启动时已清理 {0} 个遗留临时文件。", cleanupResult.RemovedFiles.Count)); } foreach (var failure in cleanupResult.Failures) { logService.Warning("TEMP_CLEANUP_FAIL", failure); } Application.Run( new MainForm( configurationService, logService, fileScanService, ruleService, autoExtractService, documentProcessingService, dialogService)); } catch (Exception ex) { MessageBox.Show( "程序启动失败: " + ex.Message, "WORD 2007 格式调整软件", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private static string BuildRuntimeValidationMessage(DCIT.Core.Models.RuntimeEnvironmentValidationResult validationResult) { var lines = validationResult.BlockingIssues.Select(issue => "- " + issue).ToList(); return "程序启动前环境检查未通过:" + Environment.NewLine + string.Join(Environment.NewLine, lines); } private static void LogRuntimeValidation(LogService logService, DCIT.Core.Models.RuntimeEnvironmentValidationResult validationResult) { logService.Info("ENV_STARTUP", "启动目录可写: " + validationResult.StartupDirectory); if (!string.IsNullOrWhiteSpace(validationResult.ResolvedAutomationProgId)) { logService.Info("ENV_AUTOMATION", "检测到可自动化组件: " + validationResult.ResolvedAutomationProgId); } if (!string.IsNullOrWhiteSpace(validationResult.ResolvedDocToPath)) { logService.Info("ENV_DOCTO", "检测到 docto.exe: " + validationResult.ResolvedDocToPath); } foreach (var warning in validationResult.Warnings) { logService.Warning("ENV_WARNING", warning); } } } }