Releases: SimplifyNet/Simplify
Releases · SimplifyNet/Simplify
Release list
Simplify.Mail 2.2
Added
- BCC recipient support on all multi-recipient overloads
IAntiSpamPool/AntiSpamPoolextracted fromMailSenderwith O(m) queue-based expiry and configurable max-items eviction (default 10 000) to prevent OOMMailSender.DefaultAntiSpamPoolstatic property to swap the pool implementation without constructor injection- Port validation in
MailSenderSettings(throwsArgumentOutOfRangeExceptionon out-of-range values)
Fixed
- Double-checked locking in
SmtpClientgetter replaced withLazy<SmtpClient>(ExecutionAndPublication)for correct thread-safety on all architectures Disposeno longer disposesSemaphoreSlimwhile another thread may hold it; blocks until in-flight send completes, then disposes cleanlyCheckAntiSpamPoolredundantContainsKeycheck removed- Integration test assertions added for construction and port default
Performance
SendSeparately/SendSeparatelyAsyncnow holds the SMTP lock for the entire batch instead of per-recipient acquire/release- Anti-spam pool expiry uses queue-based O(m) scan instead of full O(n) dictionary enumeration
Simplify.FluentNHibernate 3.4
Added
Encrypt/TrustServerCertificateconnection settings, readable from config asEncrypt/TrustServerCertificateand applied byInitializeFromConfigMsSqlMicrosoftDriver— needed becauseMicrosoft.Data.SqlClientdefaults to mandatory encryption with certificate validation, unlike the deprecatedSystem.Data.SqlClient, which broke connections to servers with self-signed/mismatched certificates
Simplify.FluentNHibernate 3.4-pre01
Added
Encrypt/TrustServerCertificateconnection settings, readable from config asEncrypt/TrustServerCertificateand applied byInitializeFromConfigMsSqlMicrosoftDriver— needed becauseMicrosoft.Data.SqlClientdefaults to mandatory encryption with certificate validation, unlike the deprecatedSystem.Data.SqlClient, which broke connections to servers with self-signed/mismatched certificates
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