release_3.0.0
·
45 commits
to master
since this release
What's New in v3.0.0
Major Changes
CHDSharp Integration — No More chdman for Extraction & Verification
CHD verification and extraction now use the CHDSharp library instead of spawning external chdman.exe processes. This means:
- Faster verification — in-process checksum validation (SHA1/MD5) without process overhead
- Faster extraction — direct sector reads via CHDSharp instead of subprocess I/O
- Fewer dependencies —
chdman.exeis now only needed for conversion (creating new CHD files) - Better error messages — precise CHD error codes instead of parsing console output
WPF-UI Modern Theme
The entire UI has been migrated to WPF-UI v4.3.0:
- Mica backdrop — native Windows 11 acrylic effect on the main window and About dialog
- Rounded corners — modern window chrome on Windows 11
- Consistent button styling — Primary, Success, Danger, Info appearances replace hand-rolled templates
- Symbol icons — vector icons replace bitmap PNG images for toolbar buttons
- Dark theme — enforced at startup for a consistent look
- Title bar integration — custom content drawn in the window title bar area
New Features
- Logs button — Opens the AppData logs folder directly from the title bar
- SSL certificate tolerance — Name-mismatch errors (common with proxies/firewalls) are logged as warnings instead of blocking connections
- 7za fallback for ZIP — If the built-in .NET ZIP extractor fails (e.g. Deflate64, LZMA, PPMd compression), the app falls back to
7za.exe - Per-file timeout for PBP extraction — PSXPackager now respects the same timeout limit as CHD conversion
- PSXPackager error capture — stdout/stderr are captured and shown on extraction failure
- Access keys — All buttons now have keyboard shortcuts (Alt+underlined letter)
Improvements
- Thread safety — Stat counters now use
volatileandInterlocked.Increment;SafeFireAndForgetwrapper logs task failures - Bug report sink — Fires on Warning level (was Error-only); uses interlocked flag to prevent API flood
- Path sanitization — Two additional mojibake ellipsis variants detected (Shift-JIS, Windows-1251); names that become all-underscores fall back to a GUID
- Archive error messages — Unsupported compression methods (Deflate64, LZMA, PPMd) now produce clear guidance
- GDI resource cleanup — ScreenshotService properly releases GDI handles in a
finallyblock - File operation retries —
TryDeleteFileAsyncandTryDeleteDirectoryAsyncnow retry up to 3 times - CRC error detection —
IsCrcErrorExceptionchecks both HRESULT and message content - Cancellation awareness — Operation summary uses "canceled" vs "completed" based on actual outcome
- Release notes rendering —
\r\nsequences in GitHub release bodies are now properly converted to newlines - Log directory — Moved from app folder to
%LocalAppData%\BatchConvertToCHD\logs - Mutex ownership — Handles
AbandonedMutexExceptionfrom crashed previous instances - GitHub rate limit detection — Also handles HTTP 429 (Too Many Requests) in addition to 403
Internals & Refactoring
HttpClientinjection —UpdateService,StatsService, andBugReportServiceacceptHttpClientvia constructor for testabilityPbpExtractionResult— Sealed class withinit-only propertyBugReportService.SendBugReportAsync— Made virtual for test mockingArchiveService—ExtractZipWith7ZaFallbackAsyncextracted as a dedicated methodMainWindow.xaml.cs— MonolithicProcessSingleFileForConversionAsyncrefactored into specialized helpers (ProcessCsoFileForConversionAsync,ProcessArchiveFileForConversionAsync,ProcessPbpFileForConversionAsync,ValidateDependentFilesAsync,TryDirectConversionAsync,TryRetryConversionViaTempCopyAsync,HandleConversionResultAsync)- XML documentation added across service classes and models
Updated Dependencies
| Package | Old | New |
|---|---|---|
| CHDSharp | — | 1.2.0 (new) |
| WPF-UI | — | 4.3.0 (new) |
| Microsoft.NET.Test.Sdk | 18.7.0 | 18.8.1 |
SharpCompress 0.50.0, Serilog 4.4.0, xUnit 2.9.3 unchanged.
Breaking Changes
- The
DropShadowEffectglow on the terminal log has been removed.
Full Changelog: release_2.11.0...release_3.0.0