Releases: SimplifyNet/Simplify
Releases · SimplifyNet/Simplify
Release list
Simplify.Xml 1.4.1
Added
- .NET 10 support
Changed
RemoveAllXmlNamespacesnow removes all namespace declarations in a single regex pass instead of an O(n²) per-match string replacement loop (same result)- Duplicate converter classes (
IObjectConverter,ObjectConverter,ChainedObjectConverter) removed from Simplify.Xml; project now references Simplify.System converters to eliminate DRY violation
Simplify.Xml 1.4.1
Added
- .NET 10 support
Changed
RemoveAllXmlNamespacesnow removes all namespace declarations in a single regex pass instead of an O(n²) per-match string replacement loop (same result)- Duplicate converter classes (
IObjectConverter,ObjectConverter,ChainedObjectConverter) removed from Simplify.Xml; project now references Simplify.System converters to eliminate DRY violation
Simplify.WindowsServices 2.16
Fixed
- Crontab job timers were never stopped/disposed on service stop/dispose, leaking timers that kept firing during and after shutdown; all job timers are now stopped before waiting for running tasks and on dispose
- Data race in
CrontabProcessorbetweenIsMatchingandCalculateNextOccurrencesover the shared occurrences list; access is now synchronized - Lifetime scope leak in basic job execution when resolving or invoking the job throws; the scope is now disposed on failure
- Exceptions thrown from the crontab timer callback (
OnCronTimerTick/OnStartWork) escaped to a thread-pool thread and terminated the service process; they are now routed to theOnExceptionevent - Unhandled job exceptions were rethrown from inside the worker task, surfacing as an
AggregateExceptionfromTask.WaitAlland aborting graceful shutdown; they are no longer rethrown - Basic (long-running) job blocked
OnStart(causing Service Control Manager start timeouts) and its lifetime scope was registered for disposal only after the job method returned, leaking the scope; the job now runs as a background task and the scope is registered before it runs
Dependencies
- Simplify.DI bump to 4.3
- Simplify.System bump to 1.6.3
- Microsoft.Extensions.Configuration bump to 10.0.9
Simplify.Templates 2.0.3
Added
- .NET 10 support
Fixed
TemplateBuilder.BuildAsyncignored the preprocessing result, soFixLineEndingsHtmlhad no effect in the asynchronous build path
Dependencies
- Internal Simplify.Xml.Sources bump to 1.4.1
- Internal Simplify.System.Sources 1.6.3 added
Simplify.System.Sources 1.6.3
Added
- .NET 10 support
Fixed
WeakSingleton<T>was not fully thread-safe: the lock-freeTryGetTargetfast path could race with target re-creation (WeakReference<T>instance members are not guaranteed thread-safe); reads and writes are now fully synchronized under a single lockApplicationEnvironment.Name,TimeProvider.Current,AssemblyInfo.Entrylazy initialization was not thread-safe (??=) and could return different instances under concurrent first access; initialization is now synchronized with double-checked lockingObjectConverter<T>parameterless protected constructor leftConvertFuncnull;Convertnow guards against null with a descriptive exceptionBytesExtensions.GetStringsilently dropped the last byte of an odd-length array; it now throwsArgumentNullException/ArgumentExceptioninstead of returning truncated dataAssemblyInfo.Titlefallback resolved the name of the executing assembly (Simplify.System) instead of the wrapped assembly; it now returns the wrapped assembly name and no longer relies onAssembly.Location(empty in single-file/AOT)DateTimeExtensions.TrimMillisecondsresetDateTimeKindtoUnspecified; it now preserves the originalUtc/Local/Unspecifiedkind
Simplify.System 1.6.3
Added
- .NET 10 support
Fixed
WeakSingleton<T>was not fully thread-safe: the lock-freeTryGetTargetfast path could race with target re-creation (WeakReference<T>instance members are not guaranteed thread-safe); reads and writes are now fully synchronized under a single lockApplicationEnvironment.Name,TimeProvider.Current,AssemblyInfo.Entrylazy initialization was not thread-safe (??=) and could return different instances under concurrent first access; initialization is now synchronized with double-checked lockingObjectConverter<T>parameterless protected constructor leftConvertFuncnull;Convertnow guards against null with a descriptive exceptionBytesExtensions.GetStringsilently dropped the last byte of an odd-length array; it now throwsArgumentNullException/ArgumentExceptioninstead of returning truncated dataAssemblyInfo.Titlefallback resolved the name of the executing assembly (Simplify.System) instead of the wrapped assembly; it now returns the wrapped assembly name and no longer relies onAssembly.Location(empty in single-file/AOT)DateTimeExtensions.TrimMillisecondsresetDateTimeKindtoUnspecified; it now preserves the originalUtc/Local/Unspecifiedkind
Simplify.String.Sources 1.2.3
Changed
- Documented
StringHelper.StripHtmlTagsas a cosmetic tag remover (simple<.*?>regex), explicitly not an HTML/XSS sanitizer
Added
- .NET 10 explicit support
Simplify.Scheduler 1.7
Fixed
- Crontab job timers were never stopped/disposed on shutdown, leaking timers that kept firing during and after stop; all job timers are now stopped before waiting for running tasks and on dispose
- Data race in
CrontabProcessorbetweenIsMatchingandCalculateNextOccurrencesover the shared occurrences list; access is now synchronized - Lifetime scope leak in basic job execution when resolving or invoking the job throws; the scope is now disposed on failure
MultitaskSchedulernow unsubscribes from the staticConsole.CancelKeyPressevent on dispose, preventing the disposed instance from being rooted and from receiving Ctrl+C after disposal- Exceptions thrown from the crontab timer callback (
OnCronTimerTick/OnStartWork) escaped to a thread-pool thread and terminated the process; they are now routed to theOnExceptionevent - Unhandled job exceptions were rethrown from inside the worker task, surfacing as an
AggregateExceptionfromTask.WaitAlland aborting graceful shutdown; they are no longer rethrown - Basic (long-running) job lifetime scope was registered for disposal only after the job method returned, leaking the scope for never-completing jobs and blocking startup; the scope is now registered before the job runs and the job is executed without blocking startup
Added
- .NET 10 support
Dependencies
- Simplify.DI bump to 4.3
- Simplify.System bump to 1.6.3
- Microsoft.Extensions.Configuration bump to 10.0.9
Simplify.Resources 1.1
Added
- .NET 10 support
ResourcesStringTable.GetRequiredString, throwsKeyNotFoundExceptionif key is not found
Fixed
ResourcesStringTablenow throws a descriptiveInvalidOperationExceptioninstead of aNullReferenceExceptionwhen the entry assembly cannot be resolved (e.g. in unmanaged/host scenarios)ResourcesStringTable(Assembly, ...)constructor now validates the assembly parameter withArgumentNullExceptionStringTable.Entrysetter now usesnameof(value)inArgumentNullExceptioninstead of an empty parameter nameStringTable.Entrylazy initialization was not thread-safe (??=) and could allocate duplicate instances under concurrent first access; initialization is now synchronized with double-checked locking
Simplify.Repository.FluentNHibernate 1.7.4
Added
- .NET 10 support
Dependencies
- Simplify.FluentNHibernate bump to 3.3.1
- Simplify.DI bump to 4.3