diff --git a/.docfx/Dockerfile.docfx b/.docfx/Dockerfile.docfx
index c6698efce..0046ae317 100644
--- a/.docfx/Dockerfile.docfx
+++ b/.docfx/Dockerfile.docfx
@@ -1,4 +1,4 @@
-ARG NGINX_VERSION=1.31-alpine
+ARG NGINX_VERSION=1.31-alpine
FROM --platform=$BUILDPLATFORM nginx:${NGINX_VERSION} AS base
RUN rm -rf /usr/share/nginx/html/*
diff --git a/.docfx/includes/availability-all.md b/.docfx/includes/availability-all.md
index 1046c70ea..3aa5b59f0 100644
--- a/.docfx/includes/availability-all.md
+++ b/.docfx/includes/availability-all.md
@@ -1 +1 @@
-Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0
\ No newline at end of file
+Availability: .NET 11, .NET 10, .NET Standard 2.1 and .NET Standard 2.0
\ No newline at end of file
diff --git a/.docfx/includes/availability-default.md b/.docfx/includes/availability-default.md
index fa28d0ef3..09123378e 100644
--- a/.docfx/includes/availability-default.md
+++ b/.docfx/includes/availability-default.md
@@ -1 +1 @@
-Availability: .NET 10, .NET 9 and .NET Standard 2.0
\ No newline at end of file
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
\ No newline at end of file
diff --git a/.docfx/includes/availability-hybrid.md b/.docfx/includes/availability-hybrid.md
index 6884bfe84..eeb0ad21c 100644
--- a/.docfx/includes/availability-hybrid.md
+++ b/.docfx/includes/availability-hybrid.md
@@ -1 +1 @@
-Availability: .NET 10, .NET 9 and .NET Standard 2.0 (when applicable) or .NET Standard 2.1 (when applicable)
\ No newline at end of file
+Availability: .NET 11, .NET 10, and .NET Standard 2.0 (when applicable) or .NET Standard 2.1 (when applicable)
\ No newline at end of file
diff --git a/.docfx/includes/availability-modern.md b/.docfx/includes/availability-modern.md
index af5cf4b94..db9549d40 100644
--- a/.docfx/includes/availability-modern.md
+++ b/.docfx/includes/availability-modern.md
@@ -1 +1 @@
-Availability: .NET 10 and .NET 9
\ No newline at end of file
+Availability: .NET 11 and .NET 10
\ No newline at end of file
diff --git a/.docfx/templates/cuemon/partials/namespace.tmpl.partial b/.docfx/templates/cuemon/partials/namespace.tmpl.partial
index 173b006cb..53bd779d2 100644
--- a/.docfx/templates/cuemon/partials/namespace.tmpl.partial
+++ b/.docfx/templates/cuemon/partials/namespace.tmpl.partial
@@ -8,7 +8,9 @@
{{#children}}
{{>partials/namespaceSubtitle}}
{{#children}}
-
-
+
+
+ {{{summary}}}
+
{{/children}}
-{{/children}}
\ No newline at end of file
+{{/children}}
diff --git a/.editorconfig b/.editorconfig
index a083db5c7..0aeae8c00 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -13,45 +13,45 @@ tab_width = 2
# This style rule concern the use of the range operator, which is available in C# 8.0 and later.
# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0057
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0057.severity = none
# This style rule concerns the use of switch expressions versus switch statements.
# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0066
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0066.severity = none
# Performance rules
# https://docs.microsoft.com/da-dk/dotnet/fundamentals/code-analysis/quality-rules/performance-warnings
-[*.{cs,vb}]
+[*.cs]
dotnet_analyzer_diagnostic.category-Performance.severity = none # Because many of the suggestions by performance analyzers are not compatible with .NET Standard 2.0
# This style rule concerns the use of using statements without curly braces, also known as using declarations. This alternative syntax was introduced in C# 8.0.
# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0063
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0063.severity = none
# This style rule concerns with simplification of interpolated strings to improve code readability. It recommends removal of certain explicit method calls, such as ToString(), when the same method would be implicitly invoked by the compiler if the explicit method call is removed.
# https://docs.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0071
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0071.severity = none
# S3267: Loops should be simplified with "LINQ" expressions
-# https://rules.sonarsource.com/csharp/RSPEC-3267
+# https://sonarcloud.io/organizations/sonarcloud/rules?open=csharpsquid:S3267&rule_key=csharpsquid:S3267
dotnet_diagnostic.S3267.severity = none
# CA1859: Use concrete types when possible for improved performance
# This is a violation of Framework Design Guidelines.
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1859
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.CA1859.severity = none
# IDE0008: Use explicit type
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0007-ide0008
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0008.severity = none
-[*.{cs,vb}]
+[*.cs]
indent_style = space
indent_size = 4
@@ -74,75 +74,75 @@ indent_size = 2
# IDE0078: Use pattern matching
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0078
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0078.severity = none
# IDE0290: Use primary constructor
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0290
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0290.severity = none
# IDE0305: Use collection expression for fluent
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0305
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0305.severity = none
# IDE0011: Add braces
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0011
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0011.severity = none
# IDE0028: Use collection initializers or expressions
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0028
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0028.severity = none
# IDE0039: Use collection expression for array
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0300
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0300.severity = none
# IDE0031: Use collection expression for empty
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0301
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0301.severity = none
# IDE0046: Use conditional expression for return
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0046
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0046.severity = none
# IDE0047: Parentheses preferences
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0047-ide0048
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0047.severity = none
# CA1716: Identifiers should not match keywords
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1716
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.CA1716.severity = none
# CA1720: Identifiers should not contain type names
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1720
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.CA1720.severity = none
# CA1846: Prefer AsSpan over Substring
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1846
# Excluded while TFMs include netstandard2.0
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.CA1846.severity = none
# CA1847: Use String.Contains(char) instead of String.Contains(string) with single characters
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1847
# Excluded while TFMs include netstandard2.0
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.CA1847.severity = none
# CA1865-CA1867: Use 'string.Method(char)' instead of 'string.Method(string)' for string with single char
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1865-ca1867
# Excluded while TFMs include netstandard2.0
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.CA1865.severity = none
dotnet_diagnostic.CA1866.severity = none
dotnet_diagnostic.CA1867.severity = none
@@ -150,27 +150,43 @@ dotnet_diagnostic.CA1867.severity = none
# CA2263: Prefer generic overload when type is known
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca2263
# Excluded while TFMs include netstandard2.0
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.CA2263.severity = none
# CA2249: Consider using String.Contains instead of String.IndexOf
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca2249
# Excluded while TFMs include netstandard2.0
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.CA2249.severity = none
# IDE0022: Use expression body for methods
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0022
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0022.severity = none
# IDE0032: Use auto-property
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0032
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0032.severity = none
# Order modifiers
# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0036
# Excluded becuase of inconsistency with other analyzers
-[*.{cs,vb}]
+[*.cs]
dotnet_diagnostic.IDE0036.severity = none
+
+# Use collection expression for new
+# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/style-rules/ide0306
+# Excluded becuase of inconsistency with other analyzers
+[*.cs]
+dotnet_diagnostic.IDE0306.severity = none
+
+# CA1016: Mark assemblies with AssemblyVersionAttribute
+# https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1016
+[*.cs]
+dotnet_diagnostic.CA1016.severity = none
+
+# Sonar rule csharpsquid:S8970
+# https://sonarcloud.io/organizations/sonarcloud/rules?open=csharpsquid:S8970&rule_key=csharpsquid:S8970
+[*.cs]
+dotnet_diagnostic.S8970.severity = none
diff --git a/.github/workflows/test-net11-workaround.yml b/.github/workflows/test-net11-workaround.yml
new file mode 100644
index 000000000..e3ecfdad4
--- /dev/null
+++ b/.github/workflows/test-net11-workaround.yml
@@ -0,0 +1,533 @@
+# Temporary Cuemon-local copy of codebeltnet/jobs-dotnet-test default.yml@v3.
+# Remove this file and restore the remote workflow calls once CI uses an SDK
+# with https://github.com/dotnet/sdk/issues/56196 fixed.
+name: .NET Test
+
+on:
+ workflow_call:
+ inputs:
+ ref:
+ description: Exact source SHA to verify; empty retains the triggering ref.
+ required: false
+ type: string
+ default: ''
+ projects:
+ description: Optional path to the project(s) file to build. Supports globbing. Default is an empty string.
+ required: false
+ type: string
+ default: ''
+ configuration:
+ description: Defines the build configuration. Default is Release (to reduce risk of surprises when transitioning to Production).
+ required: false
+ type: string
+ default: 'Release'
+ runs-on:
+ description: The type of machine to run the job on. Default is ubuntu-24.04.
+ required: false
+ type: string
+ default: 'ubuntu-24.04'
+ include-preview:
+ description: When set to true, includes preview versions of .NET. Default is false.
+ required: false
+ type: boolean
+ default: false
+ verbosity-level:
+ description: Sets the verbosity level of the command. Allowed values are quiet, minimal, normal, detailed, and diagnostic. Default is quiet.
+ required: false
+ type: string
+ default: 'quiet'
+ coverage-report-folder-name:
+ description: The name of the folder where the coverage report will be written. Default is Coverage.
+ required: false
+ type: string
+ default: 'Coverage'
+ test-results-folder-name:
+ description: The name of the folder where the test results will be written. Default is TestResults.
+ required: false
+ type: string
+ default: 'TestResults'
+ build:
+ description: Whether to build the project(s) before testing. Default is false.
+ required: false
+ type: boolean
+ default: false
+ build-switches:
+ description: Provides a way to fully customize the build. Default is an empty string. See https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-command-line-reference?view=vs-2022#switches for more information.
+ required: false
+ type: string
+ default: ''
+ restore:
+ description: Whether to restore the project(s) before testing. Default is false.
+ required: false
+ type: boolean
+ default: false
+ restore-cache-key:
+ description: When set, the current workspace will be overwritten with the content of the restore cache. Default is an empty string.
+ required: false
+ type: string
+ default: ''
+ blame-hang-timeout:
+ description: The time to wait for a test to complete before collecting a dump. Default is 10 minutes.
+ required: false
+ type: string
+ default: '10m'
+ blame-hang-dump-type:
+ description: The type of dump to collect when a test hangs. Default is mini.
+ required: false
+ type: string
+ default: 'mini'
+ test-arguments:
+ description: Additional arguments to pass to the test runner. Default is an empty string.
+ required: false
+ type: string
+ default: ''
+ timeout-minutes:
+ description: The maximum time in minutes to allow the job to run. Default is 15 minutes.
+ required: false
+ type: number
+ default: 15
+ download-pattern:
+ description: The pattern to use when downloading build artifacts. Default is '*-' suffix with the configuration.
+ required: false
+ type: string
+ default: ''
+
+jobs:
+ test:
+ name: 🧪 Test
+ runs-on: ${{ inputs.runs-on }}
+ timeout-minutes: ${{ inputs.timeout-minutes }}
+ steps:
+ - name: Checkout
+ uses: codebeltnet/git-checkout@v1
+ with:
+ ref: ${{ inputs.ref || github.ref }}
+
+ - name: Install .NET
+ uses: codebeltnet/install-dotnet@v3
+ with:
+ includePreview: ${{ inputs.include-preview }}
+
+ - name: Install .NET Tool - Report Generator
+ uses: codebeltnet/dotnet-tool-install-reportgenerator@v1
+
+ - if: inputs.restore-cache-key != ''
+ name: Restore Cache
+ uses: actions/cache/restore@v5
+ with:
+ path: |
+ ${{ github.workspace }}
+ !${{ github.workspace }}/.git
+ ~/.nuget/packages
+ key: ${{ inputs.restore-cache-key }}
+ restore-keys: |
+ dotnet-restore-
+ enableCrossOsArchive: true
+ fail-on-cache-miss: true
+
+ - name: Download Build Artifacts
+ uses: actions/download-artifact@v8
+ with:
+ pattern: ${{ inputs.download-pattern != '' && inputs.download-pattern || format('*-{0}', inputs.configuration) }}
+ merge-multiple: true
+
+ - if: inputs.restore
+ name: Restore Dependencies
+ uses: codebeltnet/dotnet-restore@v3
+ with:
+ projects: ${{ inputs.projects }}
+ verbosity-level: ${{ inputs.verbosity-level }}
+
+ - if: inputs.build
+ name: Build with ${{ inputs.configuration }} configuration
+ uses: codebeltnet/dotnet-build@v4
+ with:
+ projects: ${{ inputs.projects }}
+ configuration: ${{ inputs.configuration }}
+ verbosity-level: ${{ inputs.verbosity-level }}
+ build-switches: ${{ inputs.build-switches }}
+
+ - if: runner.os == 'Linux'
+ name: Fix Linux test apphost permissions
+ run: |
+ set -euo pipefail
+
+ VERBOSITY="${{ inputs.verbosity-level }}"
+
+ echo "Linux test executable handling"
+ echo "Verbosity level: $VERBOSITY"
+ echo
+
+ echo "=== Brute-force chmod (all bin + obj) ==="
+ find . -type f \( -path "*/bin/*" -o -path "*/obj/*" \) -exec chmod a+x {} + 2>/dev/null || true
+ echo "chmod completed."
+ echo
+
+ case "$VERBOSITY" in
+ diag|diagnostic)
+ echo "=== Diagnostic mode enabled ==="
+ echo
+
+ echo "--- Runner / context ---"
+ echo "Runner: $RUNNER_OS / $RUNNER_ARCH"
+ echo "Workspace: $GITHUB_WORKSPACE"
+ echo "PWD: $(pwd)"
+ echo "Event: $GITHUB_EVENT_NAME"
+ echo "Ref: $GITHUB_REF"
+ echo "SHA: $GITHUB_SHA"
+ echo
+
+ echo "--- .NET info ---"
+ dotnet --info || true
+ echo
+
+ echo "--- Git state ---"
+ git rev-parse HEAD || true
+ git status --porcelain || true
+ git rev-parse --is-shallow-repository || true
+ echo
+
+ echo "--- Mount options (noexec check) ---"
+ mount | head -n 200 || true
+ echo
+
+ echo "--- Candidate executables (bin + obj) ---"
+ find . -type f \( -path "*/bin/*" -o -path "*/obj/*" \) \
+ ! -name "*.dll" ! -name "*.pdb" ! -name "*.json" ! -name "*.xml" \
+ -printf "%m %u:%g %s %p\n" 2>/dev/null | head -n 200 || true
+ echo
+
+ echo "--- Likely test hosts / apphosts ---"
+ find . -type f \( -path "*/bin/*" -o -path "*/obj/*" \) \( \
+ -name "testhost*" -o \
+ -name "*xunit*" -o \
+ -name "*Tests*" -o \
+ -name "*Tests" \
+ \) -printf "%m %u:%g %s %p\n" 2>/dev/null | head -n 200 || true
+ echo
+
+ echo "--- Deep diagnostics (file / ELF / shebang) ---"
+ find . -type f \( -path "*/bin/*" -o -path "*/obj/*" \) \( \
+ -name "testhost*" -o \
+ -name "*xunit*" -o \
+ -name "*Tests*" -o \
+ -name "*Tests" \
+ \) 2>/dev/null | head -n 50 | while IFS= read -r f; do
+ echo ">>> $f"
+ ls -la "$f" 2>/dev/null || true
+ file -L "$f" 2>/dev/null || true
+
+ if file -L "$f" 2>/dev/null | grep -q "ELF"; then
+ echo "readelf -l:"
+ readelf -l "$f" 2>/dev/null | head -n 80 || true
+ echo "ldd:"
+ ldd "$f" 2>/dev/null || true
+ fi
+
+ if head -c 2 "$f" 2>/dev/null | grep -q "#!"; then
+ echo "shebang:"
+ head -n 1 "$f" | cat -A || true
+ fi
+
+ echo
+ done || true
+
+ echo "=== End diagnostic mode ==="
+ ;;
+ *)
+ echo "Diagnostic mode disabled (verbosity-level != diag|diagnostic)."
+ ;;
+ esac
+ shell: bash
+
+ # Temporary .NET 11 RC1 workaround: relative --project paths are duplicated.
+ # https://github.com/dotnet/sdk/issues/56196
+ # Expand GITHUB_WORKSPACE in the action's Bash shell on the actual test runner.
+ # Keep inputs.projects relative for the artifact hashes below.
+ - name: Test with ${{ inputs.configuration }} build
+ uses: codebeltnet/dotnet-test@v4
+ with:
+ configuration: ${{ inputs.configuration }}
+ projects: $GITHUB_WORKSPACE/${{ inputs.projects }}
+ verbosity-level: ${{ inputs.verbosity-level }}
+ test-results-folder-name: ${{ inputs.test-results-folder-name }}
+ build-switches: ${{ inputs.build-switches }}
+ blame-hang-timeout: ${{ inputs.blame-hang-timeout }}
+ blame-hang-dump-type: ${{ inputs.blame-hang-dump-type }}
+ test-arguments: ${{ inputs.test-arguments }}
+ build: ${{ inputs.build }}
+ restore: ${{ inputs.restore }}
+
+ - name: Write Failed Test Details
+ if: failure()
+ shell: pwsh
+ run: |
+ $testResultsPath = Join-Path $env:RUNNER_TEMP '${{ inputs.test-results-folder-name }}'
+ $trxFiles = @(Get-ChildItem -LiteralPath $testResultsPath -Filter '*.trx' -Recurse -File -ErrorAction SilentlyContinue)
+
+ if ($trxFiles.Count -eq 0) {
+ Write-Host "No TRX files found in '$testResultsPath'."
+ exit 0
+ }
+
+ function Get-NodeText {
+ param([System.Xml.XmlNode] $Node)
+
+ if ($null -eq $Node -or [string]::IsNullOrWhiteSpace($Node.InnerText)) {
+ return ''
+ }
+
+ return $Node.InnerText.Trim()
+ }
+
+ function Limit-Text {
+ param(
+ [string] $Text,
+ [int] $MaxLength = 12000
+ )
+
+ if ([string]::IsNullOrWhiteSpace($Text)) {
+ return ''
+ }
+
+ $trimmed = $Text.Trim()
+ if ($trimmed.Length -le $MaxLength) {
+ return $trimmed
+ }
+
+ return "$($trimmed.Substring(0, $MaxLength))`n... truncated ..."
+ }
+
+ function Add-CodeBlock {
+ param(
+ [string] $Path,
+ [string] $Text
+ )
+
+ $safeText = Limit-Text -Text $Text
+ if ([string]::IsNullOrWhiteSpace($safeText)) {
+ Add-Content -LiteralPath $Path -Value '_No details were written to the TRX file._'
+ return
+ }
+
+ Add-Content -LiteralPath $Path -Value '```text'
+ Add-Content -LiteralPath $Path -Value ($safeText -replace '```', '`` `')
+ Add-Content -LiteralPath $Path -Value '```'
+ }
+
+ function ConvertTo-WorkflowCommandData {
+ param([string] $Text)
+
+ if ($null -eq $Text) {
+ return ''
+ }
+
+ return $Text.Replace('%', '%25').Replace("`r", '%0D').Replace("`n", '%0A')
+ }
+
+ function ConvertTo-WorkflowCommandProperty {
+ param([string] $Text)
+
+ return (ConvertTo-WorkflowCommandData -Text $Text).Replace(':', '%3A').Replace(',', '%2C')
+ }
+
+ function Write-FailedTestLog {
+ param([object] $Failure)
+
+ $name = ($Failure.Name -replace "`r?`n", ' ').Trim()
+ $message = Limit-Text -Text $Failure.Message
+ $stackTrace = Limit-Text -Text $Failure.StackTrace
+
+ Write-Host "::group::Failed test: $name"
+ $stopToken = [guid]::NewGuid().ToString('N')
+ Write-Host "::stop-commands::$stopToken"
+ try {
+ Write-Host "Duration: $($Failure.Duration)"
+ Write-Host "Results file: $($Failure.TrxFile)"
+ Write-Host ''
+
+ if (-not [string]::IsNullOrWhiteSpace($message)) {
+ Write-Host 'Message:'
+ Write-Host $message
+ Write-Host ''
+ }
+ else {
+ Write-Host 'Message: No details were written to the TRX file.'
+ Write-Host ''
+ }
+
+ if (-not [string]::IsNullOrWhiteSpace($stackTrace)) {
+ Write-Host 'Stack trace:'
+ Write-Host $stackTrace
+ Write-Host ''
+ }
+ else {
+ Write-Host 'Stack trace: No stack trace was written to the TRX file.'
+ Write-Host ''
+ }
+ }
+ finally {
+ Write-Host "::$stopToken::"
+ Write-Host '::endgroup::'
+ }
+
+ $annotation = @(
+ $name
+ ''
+ 'Message:'
+ if (-not [string]::IsNullOrWhiteSpace($message)) { $message } else { 'No details were written to the TRX file.' }
+ ''
+ 'Stack trace:'
+ if (-not [string]::IsNullOrWhiteSpace($stackTrace)) { $stackTrace } else { 'No stack trace was written to the TRX file.' }
+ ) -join "`n"
+
+ $title = ConvertTo-WorkflowCommandProperty -Text "Failed test: $name"
+ $details = ConvertTo-WorkflowCommandData -Text (Limit-Text -Text $annotation)
+ Write-Host "::error title=$title::$details"
+ }
+
+ $failures = [System.Collections.Generic.List[object]]::new()
+
+ foreach ($trxFile in $trxFiles) {
+ try {
+ [xml] $trx = Get-Content -LiteralPath $trxFile.FullName -Raw
+ }
+ catch {
+ Write-Warning "Could not read TRX file '$($trxFile.FullName)': $_"
+ continue
+ }
+
+ $testDefinitions = @{}
+ foreach ($unitTest in @($trx.SelectNodes("//*[local-name()='UnitTest']"))) {
+ $method = $unitTest.SelectSingleNode("./*[local-name()='TestMethod']")
+ if ($null -ne $method -and -not [string]::IsNullOrWhiteSpace($unitTest.id)) {
+ $testDefinitions[$unitTest.id] = [pscustomobject]@{
+ ClassName = $method.className
+ MethodName = $method.name
+ }
+ }
+ }
+
+ foreach ($result in @($trx.SelectNodes("//*[local-name()='UnitTestResult' and @outcome='Failed']"))) {
+ $definition = $null
+ if (-not [string]::IsNullOrWhiteSpace($result.testId) -and $testDefinitions.ContainsKey($result.testId)) {
+ $definition = $testDefinitions[$result.testId]
+ }
+
+ $testName = $result.testName
+ if ($null -ne $definition -and -not [string]::IsNullOrWhiteSpace($definition.ClassName) -and -not [string]::IsNullOrWhiteSpace($definition.MethodName)) {
+ $testName = "$($definition.ClassName).$($definition.MethodName)"
+ }
+
+ if ([string]::IsNullOrWhiteSpace($testName)) {
+ $testName = 'Unknown test'
+ }
+
+ $message = Get-NodeText -Node $result.SelectSingleNode("./*[local-name()='Output']/*[local-name()='ErrorInfo']/*[local-name()='Message']")
+ $stackTrace = Get-NodeText -Node $result.SelectSingleNode("./*[local-name()='Output']/*[local-name()='ErrorInfo']/*[local-name()='StackTrace']")
+
+ $failures.Add([pscustomobject]@{
+ Name = $testName
+ Duration = $result.duration
+ Message = $message
+ StackTrace = $stackTrace
+ TrxFile = $trxFile.FullName
+ })
+ }
+ }
+
+ if ($failures.Count -eq 0) {
+ Write-Host "TRX files were found, but no failed UnitTestResult entries were present."
+ exit 0
+ }
+
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value ''
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value '## Failed Tests'
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value ''
+
+ foreach ($failure in $failures) {
+ $name = ($failure.Name -replace "`r?`n", ' ').Trim()
+
+ Write-FailedTestLog -Failure $failure
+
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value "### ``$name``"
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value ''
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value "- Duration: ``$($failure.Duration)``"
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value "- Results file: ``$($failure.TrxFile)``"
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value ''
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value '**Message**'
+ Add-CodeBlock -Path $env:GITHUB_STEP_SUMMARY -Text $failure.Message
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value ''
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value '**Stack trace**'
+ Add-CodeBlock -Path $env:GITHUB_STEP_SUMMARY -Text $failure.StackTrace
+ Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY -Value ''
+ }
+
+ - if: always() && runner.os == 'Linux'
+ name: Content of Test Results Folder
+ run: ls -R $RUNNER_TEMP/${{ inputs.test-results-folder-name }}
+
+ - if: always() && runner.os == 'macOS'
+ name: Content of Test Results Folder
+ run: ls -R $RUNNER_TEMP/${{ inputs.test-results-folder-name }}
+
+ - if: always() && runner.os == 'Windows'
+ name: Content of Test Results Folder
+ shell: pwsh
+ run: Get-ChildItem -Path "$env:RUNNER_TEMP\${{ inputs.test-results-folder-name }}" -Recurse
+
+ - name: Find Coverage Files
+ if: always()
+ id: coverage-files
+ shell: pwsh
+ run: |
+ $testResultsPath = Join-Path $env:RUNNER_TEMP '${{ inputs.test-results-folder-name }}'
+ $coverageFiles = @(
+ Get-ChildItem -LiteralPath $testResultsPath -Include '*.opencover.xml', '*.cobertura.xml' -Recurse -File -ErrorAction SilentlyContinue
+ )
+
+ "exists=$($coverageFiles.Count -gt 0)" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
+ Write-Host "Found $($coverageFiles.Count) coverage file(s) in '$testResultsPath'."
+
+ - name: Use Report Generator
+ if: success() && steps.coverage-files.outputs.exists == 'true'
+ run: reportgenerator "-reports:$RUNNER_TEMP/${{ inputs.test-results-folder-name }}/**/*.opencover.xml;$RUNNER_TEMP/${{ inputs.test-results-folder-name }}/**/*.cobertura.xml" "-targetdir:${{ github.workspace }}/${{ inputs.coverage-report-folder-name }}" "-reporttypes:Cobertura;MarkdownSummaryGithub;HTMLInline;HTMLChart"
+ shell: bash
+
+ - name: Find Coverage Summary
+ if: always()
+ id: coverage-summary
+ shell: pwsh
+ run: |
+ $summaryPath = Join-Path '${{ github.workspace }}' '${{ inputs.coverage-report-folder-name }}/SummaryGithub.md'
+
+ if (-not (Test-Path -LiteralPath $summaryPath -PathType Leaf)) {
+ "exists=false" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
+ Write-Host "Coverage summary '$summaryPath' was not found."
+ exit 0
+ }
+
+ "exists=true" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
+ "path=$summaryPath" | Out-File -FilePath $env:GITHUB_OUTPUT -Append
+
+ - name: Write Coverage Summary
+ if: always() && steps.coverage-summary.outputs.exists == 'true'
+ shell: pwsh
+ run: Get-Content -LiteralPath '${{ steps.coverage-summary.outputs.path }}' | Add-Content -LiteralPath $env:GITHUB_STEP_SUMMARY
+
+ - name: Upload CoverageReport
+ if: always()
+ uses: actions/upload-artifact@v7
+ with:
+ name: CoverageReport-${{ inputs.configuration }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles(inputs.projects) }}
+ path: ${{ github.workspace }}/${{ inputs.coverage-report-folder-name }}
+ include-hidden-files: true
+ if-no-files-found: warn
+
+ - name: Upload TestResults
+ if: always()
+ uses: actions/upload-artifact@v7
+ with:
+ name: TestResults-${{ inputs.configuration }}-${{ runner.os }}-${{ runner.arch }}-${{ hashFiles(inputs.projects) }}
+ path: ${{ runner.temp }}/${{ inputs.test-results-folder-name }}
+ include-hidden-files: true
diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml
index b79fb2a5f..34b9a9064 100644
--- a/.github/workflows/verify.yml
+++ b/.github/workflows/verify.yml
@@ -148,6 +148,7 @@ jobs:
configuration: [Debug, Release]
uses: codebeltnet/jobs-dotnet-build/.github/workflows/default.yml@v3
with:
+ include-preview: true
ref: ${{ inputs.ref }}
configuration: ${{ matrix.configuration }}
strong-name-key-filename: ${{ needs.init.outputs.strong-name-key-filename }}
@@ -166,6 +167,7 @@ jobs:
configuration: [Debug, Release]
uses: codebeltnet/jobs-dotnet-pack/.github/workflows/default.yml@v3
with:
+ include-preview: true
ref: ${{ inputs.ref }}
configuration: ${{ matrix.configuration }}
version: ${{ needs.build.outputs.version }}
@@ -183,8 +185,9 @@ jobs:
configuration: [Debug, Release]
project: ${{ fromJson(needs.prepare_test.outputs.json) }}
arch: [X64, ARM64]
- uses: codebeltnet/jobs-dotnet-test/.github/workflows/default.yml@v3
+ uses: ./.github/workflows/test-net11-workaround.yml
with:
+ include-preview: true
ref: ${{ inputs.ref }}
runs-on: ${{ matrix.arch == 'ARM64' && 'ubuntu-26.04-arm' || 'ubuntu-26.04' }}
configuration: ${{ matrix.configuration }}
@@ -203,8 +206,9 @@ jobs:
arch: [X64, ARM64]
configuration: [Debug, Release]
project: ${{ fromJson(needs.prepare_test.outputs.json) }}
- uses: codebeltnet/jobs-dotnet-test/.github/workflows/default.yml@v3
+ uses: ./.github/workflows/test-net11-workaround.yml
with:
+ include-preview: true
ref: ${{ inputs.ref }}
runs-on: ${{ matrix.arch == 'ARM64' && 'windows-11-arm' || 'windows-2025' }}
configuration: ${{ matrix.configuration }}
@@ -224,8 +228,9 @@ jobs:
arch: [X64, ARM64]
configuration: [Debug, Release]
project: ${{ fromJson(needs.prepare_test.outputs.json) }}
- uses: codebeltnet/jobs-dotnet-test/.github/workflows/default.yml@v3
+ uses: ./.github/workflows/test-net11-workaround.yml
with:
+ include-preview: true
ref: ${{ inputs.ref }}
runs-on: ${{ matrix.arch == 'ARM64' && 'macos-26' || 'macos-26-intel' }}
configuration: ${{ matrix.configuration }}
@@ -254,6 +259,8 @@ jobs:
- name: Install .NET
uses: codebeltnet/install-dotnet@v3
+ with:
+ includePreview: true
- name: Install .NET Tool - Report Generator
uses: codebeltnet/dotnet-tool-install-reportgenerator@v1
@@ -365,7 +372,9 @@ jobs:
- name: Test with ${{ matrix.configuration }} build
uses: codebeltnet/dotnet-test@v4
with:
- projects: ${{ matrix.project }}
+ # Temporary .NET 11 RC1 workaround: use absolute project paths.
+ # Remove once CI uses an SDK with https://github.com/dotnet/sdk/issues/56196 fixed.
+ projects: $GITHUB_WORKSPACE/${{ matrix.project }}
configuration: ${{ matrix.configuration }}
build: true # apparently we need to due to xUnitv3
restore: true # we need to restore since we disabled caching
@@ -438,6 +447,7 @@ jobs:
needs: [init, build, test_qualitygate]
uses: codebeltnet/jobs-sonarcloud/.github/workflows/default.yml@v3
with:
+ include-preview: true
organization: geekle
projectKey: Cuemon
version: ${{ inputs.version || needs.build.outputs.version }}
@@ -467,7 +477,9 @@ jobs:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
codeql:
- if: ${{always() && needs.init.outputs.run-privileged-jobs == 'true' && needs.build.result == 'success' && needs.test_qualitygate.result == 'success'}}
+ # Temporarily disabled: CodeQL supports up to .NET 10, while this branch targets .NET 11.
+ # Restore main's condition when .NET 11 is supported.
+ if: ${{ false }}
name: call-codeql
needs: [init, build, test_qualitygate]
uses: codebeltnet/jobs-codeql/.github/workflows/default.yml@v3
@@ -533,15 +545,15 @@ jobs:
exit 1
fi
require_success "test_qualitygate" "$TEST_RESULT"
+ require_skipped "codeql" "$CODEQL_RESULT"
+ echo "::notice::CodeQL is explicitly excluded from .NET 11 verification until supported."
if [[ "$RUN_PRIVILEGED_JOBS" == "true" ]]; then
require_success "sonarcloud" "$SONAR_RESULT"
require_success "codecov" "$CODECOV_RESULT"
- require_success "codeql" "$CODEQL_RESULT"
else
require_skipped "sonarcloud" "$SONAR_RESULT"
require_skipped "codecov" "$CODECOV_RESULT"
- require_skipped "codeql" "$CODEQL_RESULT"
fi
- name: Verify service records for main at the released SHA
@@ -557,7 +569,6 @@ jobs:
for attempt in {1..20}; do
sonar_ok=false
codecov_ok=false
- codeql_ok=false
# Newer main analyses must not hide the released revision, including on later pages.
sonar_page=1
while sonar="$(curl --fail --silent --show-error --connect-timeout 10 --max-time 30 "https://sonarcloud.io/api/project_analyses/search?project=Cuemon&branch=main&ps=100&p=$sonar_page")"; do
@@ -576,24 +587,19 @@ jobs:
'.branch == "main" and .commitid == $sha and .state == "complete"' <<< "$codecov" >/dev/null; then
codecov_ok=true
fi
- if codeql="$(gh api --paginate --slurp "repos/$GITHUB_REPOSITORY/code-scanning/analyses?tool_name=CodeQL&ref=refs%2Fheads%2Fmain&per_page=100")" &&
- jq -e --arg sha "$RELEASE_SHA" \
- 'any(.[][]; .tool.name == "CodeQL" and .ref == "refs/heads/main" and .commit_sha == $sha and .error == "")' <<< "$codeql" >/dev/null; then
- codeql_ok=true
- fi
- echo "Service identity check $attempt/20 for $RELEASE_SHA: SonarCloud=$sonar_ok; Codecov=$codecov_ok; CodeQL=$codeql_ok"
- if [[ "$sonar_ok" == true && "$codecov_ok" == true && "$codeql_ok" == true ]]; then
+ echo "Service identity check $attempt/20 for $RELEASE_SHA: SonarCloud=$sonar_ok; Codecov=$codecov_ok; CodeQL=skipped (.NET 11 unsupported)"
+ if [[ "$sonar_ok" == true && "$codecov_ok" == true ]]; then
{
echo '## Post-release service identity verified'
echo "- SonarCloud: main; SCM revision \`$RELEASE_SHA\`; project version \`$RELEASE_VERSION\`"
echo "- Codecov: main; commit \`$RELEASE_SHA\`"
- echo "- CodeQL: refs/heads/main; commit \`$RELEASE_SHA\`"
+ echo '- CodeQL: skipped because .NET 11 is not yet supported; no CodeQL assurance is claimed.'
} >> "$GITHUB_STEP_SUMMARY"
exit 0
fi
if [[ "$attempt" -lt 20 ]]; then sleep 15; fi
done
- echo "::error::Services did not confirm canonical main at released SHA '$RELEASE_SHA' (SonarCloud=$sonar_ok; Codecov=$codecov_ok; CodeQL=$codeql_ok). Inspect service records; successful uploads alone do not establish assurance."
+ echo "::error::Services did not confirm canonical main at released SHA '$RELEASE_SHA' (SonarCloud=$sonar_ok; Codecov=$codecov_ok; CodeQL=skipped). Inspect service records; successful uploads alone do not establish assurance."
exit 1
- name: Report verified success
@@ -603,4 +609,5 @@ jobs:
echo "## Shared verification passed"
echo
echo "Build and package validation passed. Required Linux and Windows tests passed; optional macOS and trusted-repository checks followed the workflow inputs and fork policy."
+ echo "CodeQL was skipped because .NET 11 is not yet supported; no CodeQL assurance is claimed."
} >> "$GITHUB_STEP_SUMMARY"
diff --git a/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt
index 76d955b9a..622ede809 100644
--- a/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.AspNetCore.App/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -120,6 +127,7 @@ Availability: .NET 10 and .NET 9
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9 and .NET 8
diff --git a/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt
index 75afc2896..4f93af161 100644
--- a/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.AspNetCore.Authentication/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -123,6 +130,7 @@ Availability: .NET 10 and .NET 9
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9 and .NET 8
diff --git a/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt
index 9bfa22c95..5861e1190 100644
--- a/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.AspNetCore.Mvc/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -122,75 +129,3 @@ Availability: .NET 10 and .NET 9
- ADDED Support for TFM .NET 10 (LTS)
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
-
-Version 9.0.10
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.9
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.8
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.7
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.6
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.5
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.4
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.3
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.2
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.1
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.0
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-- REMOVED Support for TFM .NET 6 (LTS)
-
-# Improvements
-- EXTENDED ExceptionDescriptorResult class in the Cuemon.AspNetCore.Mvc namespace to have an extra overload that accepts ProblemDetails
-- CHANGED FaultDescriptorFilter class in the Cuemon.AspNetCore.Mvc.Filters.Diagnostics namespace to support preferred fault descriptor (e.g., FaultDetails or ProblemDetails)
-
diff --git a/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt
index 64874a9dd..4fe2d2080 100644
--- a/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.AspNetCore.Razor.TagHelpers/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -126,6 +133,7 @@ Availability: .NET 10 and .NET 9
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9 and .NET 8
diff --git a/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt b/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt
index ffbdc3ee0..8d7fcd7a3 100644
--- a/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.AspNetCore/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -128,81 +135,3 @@ Availability: .NET 10 and .NET 9
- ADDED Support for TFM .NET 10 (LTS)
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
-
-Version 9.0.10
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.9
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.8
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.7
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.6
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.5
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.4
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.3
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.2
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.1
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.0
-Availability: .NET 9 and .NET 8
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-- REMOVED Support for TFM .NET 6 (LTS)
-
-# Breaking Changes
-- REMOVED BadRequestMessage property from the class from the ApiKeySentinelOptions class in the Cuemon.AspNetCore.Http.Headers namespace
-
-# New Features
-- ADDED PreferredFaultDescriptor enum in the Cuemon.AspNetCore.Diagnostics namespace that specifies the preferred output format of an Exception raised in the context of either vanilla ASP.NET or ASP.NET MVC
-
-# Improvements
-- EXTENDED FaultDescriptorOptions class in the Cuemon.AspNetCore.Diagnostics namespace to include a property named FaultDescriptor (PreferredFaultDescriptor); default is PreferredFaultDescriptor.FaultDetails
-- EXTENDED HttpExceptionDescriptor class in the Cuemon.AspNetCore.Diagnostics namespace to include two new properties; Instance (Uri) and TraceId (string)
-
diff --git a/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt b/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt
index 3a6e482cd..e693b6146 100644
--- a/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Core.App/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Core/PackageReleaseNotes.txt b/.nuget/Cuemon.Core/PackageReleaseNotes.txt
index a93701adc..e88518e19 100644
--- a/.nuget/Cuemon.Core/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Core/PackageReleaseNotes.txt
@@ -1,3 +1,71 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
+# Breaking Changes
+- REMOVED Arguments class from the Cuemon.Collections.Generic namespace
+- REMOVED Configurable class from the Cuemon.Configuration namespace
+- REMOVED IConfigurable interface from the Cuemon.Configuration namespace
+- REMOVED IParameterObject interface from the Cuemon.Configuration namespace
+- REMOVED IPostConfigurableParameterObject interface from the Cuemon.Configuration namespace
+- REMOVED IValidatableParameterObject interface from the Cuemon.Configuration namespace
+- REMOVED StreamDecoratorExtensions class from the Cuemon.IO namespace
+- REMOVED CallerArgumentExpressionAttribute class from the Cuemon.Runtime.CompilerServices namespace
+- REMOVED ByteOrderMark class from the Cuemon.Text namespace
+- REMOVED EncodingOptions class from the Cuemon.Text namespace
+- REMOVED EnumStringOptions class from the Cuemon.Text namespace
+- REMOVED FallbackEncodingOptions class from the Cuemon.Text namespace
+- REMOVED IConfigurableParser interface from the Cuemon.Text namespace
+- REMOVED IEncodingOptions interface from the Cuemon.Text namespace
+- REMOVED IParser interface from the Cuemon.Text namespace
+- REMOVED PreambleSequence class from the Cuemon.Text namespace
+- REMOVED ProtocolRelativeUriStringOptions class from the Cuemon.Text namespace
+- REMOVED UriStringOptions class from the Cuemon.Text namespace
+- REMOVED AsyncOptions class from the Cuemon.Threading namespace
+- REMOVED AsyncRunOptions class from the Cuemon.Threading namespace
+- REMOVED Awaiter class from the Cuemon.Threading namespace
+- REMOVED IAsyncOptions interface from the Cuemon.Threading namespace
+- REMOVED Alphanumeric class from the Cuemon namespace
+- REMOVED ArgumentReservedKeywordException class from the Cuemon namespace
+- REMOVED CasingMethod enum from the Cuemon namespace
+- REMOVED Condition class from the Cuemon namespace
+- REMOVED ConditionalValue class from the Cuemon namespace
+- REMOVED Convertible class from the Cuemon namespace
+- REMOVED ConvertibleConverterDictionary class from the Cuemon namespace
+- REMOVED ConvertibleOptions class from the Cuemon namespace
+- REMOVED DateSpan struct from the Cuemon namespace
+- REMOVED DateTimeRange class from the Cuemon namespace
+- REMOVED DelimitedString struct from the Cuemon namespace
+- REMOVED DelimitedStringOptions class from the Cuemon namespace
+- REMOVED Decorator class from the Cuemon namespace
+- REMOVED Disposable class from the Cuemon namespace
+- REMOVED DisposableOptions class from the Cuemon namespace
+- REMOVED Endianness enum from the Cuemon namespace
+- REMOVED EndianOptions class from the Cuemon namespace
+- REMOVED ExceptionCondition class from the Cuemon namespace
+- REMOVED FinalizeDisposable class from the Cuemon namespace
+- REMOVED FormattingOptions class from the Cuemon namespace
+- REMOVED GuidFormats enum from the Cuemon namespace
+- REMOVED IDecorator interface from the Cuemon namespace
+- REMOVED Patterns class from the Cuemon namespace
+- REMOVED Range class from the Cuemon namespace
+- REMOVED SuccessfulValue class from the Cuemon namespace
+- REMOVED TesterFunc delegate from the Cuemon namespace
+- REMOVED TimeRange class from the Cuemon namespace
+- REMOVED TimeUnit enum from the Cuemon namespace
+- REMOVED TypeArgumentException class from the Cuemon namespace
+- REMOVED TypeArgumentOutOfRangeException class from the Cuemon namespace
+- REMOVED UnsuccessfulValue class from the Cuemon namespace
+- REMOVED UriScheme enum from the Cuemon namespace
+- REMOVED Validator class from the Cuemon namespace
+
+
+
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -177,141 +245,3 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
-Version 9.0.10
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.9
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.8
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.7
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.6
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-# New Features
-- ADDED Awaiter class in the Cuemon.Threading namespace that provides a set of static methods for awaiting asynchronous operations
-- ADDED AsyncRunOptions class in the Cuemon.Threading namespace that provides configuration options for the Awaiter.RunUntilSuccessfulOrTimeoutAsync method
-
-Version 9.0.5
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.4
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.3
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.2
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-# Bug Fixes
-- FIXED Disposable class in the Cuemon namespace to set the disposed flag to true immediately after the Dispose method is called after thread safety check (previously it was set to true after the Dispose method had completed)
-
-Version 9.0.1
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.0
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-# Breaking Changes
-- REMOVED DefaultYamlConverter class from the Cuemon.Runtime.Serialization.Converters namespace
-- REMOVED YamlSerializer class from the Cuemon.Runtime.Serialization namespace
-- REMOVED YamlSerializerOptions class from the Cuemon.Runtime.Serialization namespace
-- REMOVED YamlTextReader class from the Cuemon.Runtime.Serialization namespace
-- REMOVED YamlTextWriter class from the Cuemon.Runtime.Serialization namespace
-- REMOVED YamlTokenType class from the Cuemon.Runtime.Serialization namespace
-- REMOVED ExceptionConverter class from the Cuemon.Text.Yaml.Converters namespace
-- REMOVED ExceptionDescriptorConverter class from the Cuemon.Text.Yaml.Converters namespace
-- REMOVED YamlConverter class from the Cuemon.Text.Yaml.Converters namespace
-- REMOVED YamlFormatter class from the Cuemon.Text.Yaml.Converters namespace
-- REMOVED YamlFormatterOptions class from the Cuemon.Text.Yaml.Converters namespace
-- REMOVED YamlConverterFactory class from the Cuemon.Text.Yaml namespace
-- REMOVED YamlNamingPolicy class from the Cuemon.Text.Yaml namespace
-- RENAMED ReservedKeywordException class in the Cuemon namespace to ArgumentReservedKeywordException
-- REMOVED SafeInvokeAsync methods from the Patterns class in the Cuemon namespace (moved to AsyncPatterns class in the Cuemon.Threading assembly)
-- RENAMED TaskActionFactory class in the Cuemon namespace to AsyncActionFactory in the Cuemon.Threading namespace
-- RENAMED TaskFuncFactory class in the Cuemon namespace to AsyncFuncFactory in the Cuemon.Threading namespace
-- RENAMED Template class in the Cuemon namespace to MutableTuple
-- RENAMED TemplateFactory class in the Cuemon namespace to MutableTupleFactory
-- REMOVED ActionFactory static class from the Cuemon namespace (moved to the Cuemon.Extensions namespace in the Cuemon.Extensions.Core assembly)
-- REMOVED FuncFactory static class from the Cuemon namespace (moved to the Cuemon.Extensions namespace in the Cuemon.Extensions.Core assembly)
-- REMOVED TesterFuncFactory static class from the Cuemon namespace (moved to the Cuemon.Extensions namespace in the Cuemon.Extensions.Core assembly)
-- REMOVED BinaryPrefix class from the Cuemon namespace
-- REMOVED BitStorageCapacity class from the Cuemon namespace
-- REMOVED BitUnit class from the Cuemon namespace
-- REMOVED ByteStorageCapacity class from the Cuemon namespace
-- REMOVED ByteUnit class from the Cuemon namespace
-- REMOVED DecimalPrefix class from the Cuemon namespace
-- REMOVED IPrefixMultiple interface from the Cuemon namespace
-- REMOVED IUnit interface from the Cuemon namespace
-- REMOVED MultipleTable class from the Cuemon namespace
-- REMOVED NamingStyle enum from the Cuemon namespace
-- REMOVED PrefixMultiple class from the Cuemon namespace
-- REMOVED PrefixUnit class from the Cuemon namespace
-- REMOVED StorageCapacity class from the Cuemon namespace
-- REMOVED StorageCapacityOptions class from the Cuemon namespace
-- REMOVED UnitFormatOptions class from the Cuemon namespace
-- REMOVED UnitPrefix enum from the Cuemon namespace
-- REMOVED UnitPrefixFormatter class from the Cuemon namespace
-- REMOVED ZeroPrefix class from the Cuemon namespace
-- REMOVED DataPairCollection class from the Cuemon.Collections namespace
-- REMOVED DataPairDictionary class from the Cuemon.Collections namespace
-- REMOVED Initializer class from the Cuemon namespace
-- REMOVED InitializerBuilder class from the Cuemon namespace
-- REMOVED Mapping class from the Cuemon namespace
-- REMOVED IndexMapping class from the Cuemon namespace
-- REMOVED HorizontalDirection enum from the Cuemon namespace
-- REMOVED VerticalDirection enum from the Cuemon namespace (moved to the Cuemon.Extensions namespace in the Cuemon.Extensions.Core assembly)
-- REMOVED IWrapper interface from the Cuemon namespace (moved to the Cuemon.Extensions namespace in the Cuemon.Extensions.Core assembly)
-- REMOVED Wrapper class from the Cuemon namespace (moved to the Cuemon.Extensions namespace in the Cuemon.Extensions.Core assembly)
-- REMOVED HierarchyDecoratorExtensions class from the Cuemon namespace (moved to the Cuemon.Extensions.Runtime namespace in the Cuemon.Extensions.Core assembly)
-- REMOVED Hierarchy class from the Cuemon namespace (moved to the Cuemon.Extensions.Runtime namespace in the Cuemon.Extensions.Core assembly)
-- REMOVED IHierarchy interface from the Cuemon namespace (moved to the Cuemon.Extensions.Runtime namespace in the Cuemon.Extensions.Core assembly)
-- REMOVED ObjectHierarchyOptions class from the Cuemon.Reflection namespace (moved to the Cuemon.Extensions.Runtime namespace in the Cuemon.Extensions.Core assembly and renamed to HierarchyOptions)
-- REMOVED HierarchySerializer class from the Cuemon.Runtime.Serialization namespace (moved to the Cuemon.Extensions.Runtime.Serialization namespace in the Cuemon.Extensions.Core assembly)
-
-# New Features
-- ADDED Failure record in the Cuemon.Diagnostics namespace that represents a failure model with detailed information about an exception
-
-# Improvements
-- EXTENDED Condition class in the Cuemon namespace with an additional method: HasDifference
-- EXTENDED Validator class in the Cuemon namespace with five new methods: ThrowIfContainsReservedKeyword, ThrowIfNotDifferent, ThrowIfDifferent, ThrowIfContainsAny and ThrowIfNotContainsAny
-- CHANGED Validator class in the Cuemon namespace to comply with RSPEC-3343
-- EXTENDED Decorator class in the Cuemon namespace with an additional method: RawEnclose
diff --git a/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt b/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Data.Integrity/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt b/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt
index 6fb1fce5e..65d9b510b 100644
--- a/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Data.SqlClient/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Data/PackageReleaseNotes.txt b/.nuget/Cuemon.Data/PackageReleaseNotes.txt
index a10437e60..91dcb9bd0 100644
--- a/.nuget/Cuemon.Data/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Data/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -122,71 +129,3 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- ADDED Support for TFM .NET 10 (LTS)
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
-
-Version 9.0.10
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.9
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.8
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.7
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.6
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.5
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.4
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.3
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.2
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.1
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-
-Version 9.0.0
-Availability: .NET 9, .NET 8 and .NET Standard 2.0
-
-# ALM
-- CHANGED Dependencies to latest and greatest with respect to TFMs
-- REMOVED Support for TFM .NET 6 (LTS)
-
diff --git a/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt b/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Diagnostics/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt
index 76d955b9a..622ede809 100644
--- a/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.AspNetCore.Authentication/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -120,6 +127,7 @@ Availability: .NET 10 and .NET 9
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9 and .NET 8
diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt
index 872f18a26..9ac079db1 100644
--- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -120,6 +127,7 @@ Availability: .NET 10 and .NET 9
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9 and .NET 8
diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt
index f159b5dc1..ae2d7437e 100644
--- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -120,6 +127,7 @@ Availability: .NET 10 and .NET 9
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9 and .NET 8
diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt
index 76d955b9a..622ede809 100644
--- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -120,6 +127,7 @@ Availability: .NET 10 and .NET 9
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9 and .NET 8
diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt
index 9eac85897..1b96dd241 100644
--- a/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.AspNetCore.Mvc/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -120,6 +127,7 @@ Availability: .NET 10 and .NET 9
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9 and .NET 8
diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt
index b2dfd9e3a..1be68bc71 100644
--- a/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.AspNetCore.Text.Json/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -130,6 +137,7 @@ Availability: .NET 10 and .NET 9
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9 and .NET 8
diff --git a/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt
index 721fa0759..9ee257a21 100644
--- a/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.AspNetCore.Xml/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -129,6 +136,7 @@ Availability: .NET 10 and .NET 9
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9 and .NET 8
diff --git a/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt
index 67b29c559..0dd35e55f 100644
--- a/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.AspNetCore/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11 and .NET 10
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10 and .NET 9
@@ -123,6 +130,7 @@ Availability: .NET 10 and .NET 9
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9 and .NET 8
diff --git a/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt
index 69d6b02e2..0f86ac98d 100644
--- a/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Collections.Generic/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -123,6 +130,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Collections.Specialized/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt
index 1c7f498b8..f8e50fba0 100644
--- a/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Core/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -123,6 +130,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Data.Integrity/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Data/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt
index f8e8fce55..9489e6193 100644
--- a/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.DependencyInjection/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -129,6 +136,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt
index 4f26efff6..56aed5b77 100644
--- a/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Diagnostics/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt
index 78a722c45..132979ddd 100644
--- a/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Hosting/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt
index 4773fc064..7d2e9714b 100644
--- a/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.IO/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10, .NET Standard 2.1 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Net/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Reflection/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Runtime.Caching/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt
index 37ea63df6..e6819e0c2 100644
--- a/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Text.Json/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Text/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt
index 83b585008..a023046a6 100644
--- a/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Threading/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -121,6 +128,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Dependency on Backport.System.Threading.Lock (since System.Threading.Lock is now available in modern TFMs)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt
index 28df77c94..52cd993a9 100644
--- a/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Extensions.Xml/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -123,6 +130,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.IO/PackageReleaseNotes.txt b/.nuget/Cuemon.IO/PackageReleaseNotes.txt
index 4773fc064..7d2e9714b 100644
--- a/.nuget/Cuemon.IO/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.IO/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10, .NET Standard 2.1 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9, .NET Standard 2.1 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8, .NET Standard 2.1 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Kernel/PackageReleaseNotes.txt b/.nuget/Cuemon.Kernel/PackageReleaseNotes.txt
index 4d5ea610f..6d405f276 100644
--- a/.nuget/Cuemon.Kernel/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Kernel/PackageReleaseNotes.txt
@@ -1,3 +1,70 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
+# Moved from Cuemon.Core
+- ADDED Arguments class to the Cuemon.Collections.Generic namespace
+- ADDED Configurable class to the Cuemon.Configuration namespace
+- ADDED IConfigurable interface to the Cuemon.Configuration namespace
+- ADDED IParameterObject interface to the Cuemon.Configuration namespace
+- ADDED IPostConfigurableParameterObject interface to the Cuemon.Configuration namespace
+- ADDED IValidatableParameterObject interface to the Cuemon.Configuration namespace
+- ADDED StreamDecoratorExtensions class to the Cuemon.IO namespace
+- ADDED CallerArgumentExpressionAttribute class to the Cuemon.Runtime.CompilerServices namespace
+- ADDED ByteOrderMark class to the Cuemon.Text namespace
+- ADDED EncodingOptions class to the Cuemon.Text namespace
+- ADDED EnumStringOptions class to the Cuemon.Text namespace
+- ADDED FallbackEncodingOptions class to the Cuemon.Text namespace
+- ADDED IConfigurableParser interface to the Cuemon.Text namespace
+- ADDED IEncodingOptions interface to the Cuemon.Text namespace
+- ADDED IParser interface to the Cuemon.Text namespace
+- ADDED PreambleSequence class to the Cuemon.Text namespace
+- ADDED ProtocolRelativeUriStringOptions class to the Cuemon.Text namespace
+- ADDED UriStringOptions class to the Cuemon.Text namespace
+- ADDED AsyncOptions class to the Cuemon.Threading namespace
+- ADDED AsyncRunOptions class to the Cuemon.Threading namespace
+- ADDED Awaiter class to the Cuemon.Threading namespace
+- ADDED IAsyncOptions interface to the Cuemon.Threading namespace
+- ADDED Alphanumeric class to the Cuemon namespace
+- ADDED ArgumentReservedKeywordException class to the Cuemon namespace
+- ADDED CasingMethod enum to the Cuemon namespace
+- ADDED Condition class to the Cuemon namespace
+- ADDED ConditionalValue class to the Cuemon namespace
+- ADDED Convertible class to the Cuemon namespace
+- ADDED ConvertibleConverterDictionary class to the Cuemon namespace
+- ADDED ConvertibleOptions class to the Cuemon namespace
+- ADDED DateSpan struct to the Cuemon namespace
+- ADDED DateTimeRange class to the Cuemon namespace
+- ADDED DelimitedString struct to the Cuemon namespace
+- ADDED DelimitedStringOptions class to the Cuemon namespace
+- ADDED Decorator class to the Cuemon namespace
+- ADDED Disposable class to the Cuemon namespace
+- ADDED DisposableOptions class to the Cuemon namespace
+- ADDED Endianness enum to the Cuemon namespace
+- ADDED EndianOptions class to the Cuemon namespace
+- ADDED ExceptionCondition class to the Cuemon namespace
+- ADDED FinalizeDisposable class to the Cuemon namespace
+- ADDED FormattingOptions class to the Cuemon namespace
+- ADDED GuidFormats enum to the Cuemon namespace
+- ADDED IDecorator interface to the Cuemon namespace
+- ADDED Patterns class to the Cuemon namespace
+- ADDED Range class to the Cuemon namespace
+- ADDED SuccessfulValue class to the Cuemon namespace
+- ADDED TesterFunc delegate to the Cuemon namespace
+- ADDED TimeRange class to the Cuemon namespace
+- ADDED TimeUnit enum to the Cuemon namespace
+- ADDED TypeArgumentException class to the Cuemon namespace
+- ADDED TypeArgumentOutOfRangeException class to the Cuemon namespace
+- ADDED UnsuccessfulValue class to the Cuemon namespace
+- ADDED UriScheme enum to the Cuemon namespace
+- ADDED Validator class to the Cuemon namespace
+
+
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Net/PackageReleaseNotes.txt b/.nuget/Cuemon.Net/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Net/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Net/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt b/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Resilience/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt b/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt
index 40e23189d..70fc30ec0 100644
--- a/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Runtime.Caching/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt b/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt
index 03ac0ebaf..6036b7fae 100644
--- a/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Security.Cryptography/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -126,6 +133,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Threading/PackageReleaseNotes.txt b/.nuget/Cuemon.Threading/PackageReleaseNotes.txt
index a6d9dae24..301f21204 100644
--- a/.nuget/Cuemon.Threading/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Threading/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -120,6 +127,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/.nuget/Cuemon.Xml/PackageReleaseNotes.txt b/.nuget/Cuemon.Xml/PackageReleaseNotes.txt
index e09f20946..36087d7d5 100644
--- a/.nuget/Cuemon.Xml/PackageReleaseNotes.txt
+++ b/.nuget/Cuemon.Xml/PackageReleaseNotes.txt
@@ -1,3 +1,10 @@
+Version: 11.0.0
+Availability: .NET 11, .NET 10 and .NET Standard 2.0
+
+# ALM
+- ADDED Support for TFM .NET 11 (LTS)
+- REMOVED Support for TFM .NET 9 (STS)
+
Version: 10.8.2
Availability: .NET 10, .NET 9 and .NET Standard 2.0
@@ -134,6 +141,7 @@ Availability: .NET 10, .NET 9 and .NET Standard 2.0
- REMOVED Support for TFM .NET 8 (LTS)
- CHANGED Dependencies have been upgraded to the latest compatible versions for all supported target frameworks (TFMs)
+
Version 9.0.10
Availability: .NET 9, .NET 8 and .NET Standard 2.0
diff --git a/AGENTS.md b/AGENTS.md
index 2b6aa97cd..7ba2705f9 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -16,9 +16,9 @@ Keep all shared repository instructions in `AGENTS.md`.
## Toolchain
- .NET SDK with `LangVersion=latest`.
-- Source TFMs: `net10.0;net9.0;netstandard2.0`.
-- Test TFMs: `net10.0;net9.0` on Linux; adds `net48` on Windows.
-- Benchmark TFMs: `net10.0;net9.0`.
+- Source TFMs: `net11.0;net10.0;netstandard2.0`.
+- Test TFMs: `net11.0;net10.0` on Linux; adds `net48` on Windows.
+- Benchmark TFMs: `net11.0;net10.0`.
- Central package management via `Directory.Packages.props` (`ManagePackageVersionsCentrally=true`).
- CI runs on Linux (ubuntu-26.04) and Windows (windows-2025), both X64 and ARM64.
- TFM compatibility is mandatory: proposals and code changes must work for all source TFMs. Do not assume `net9.0`/`net10.0` APIs exist in `netstandard2.0`; use conditional compilation (`#if NET9_0_OR_GREATER`) or compatible fallbacks where needed.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 16a7ba3dc..7b153b79e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,42 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
For more details, please refer to `PackageReleaseNotes.txt` on a per assembly basis in the `.nuget` folder.
+## [11.0.0] - 2026-10-26 (11.0.0-rc.3)
+
+This is a major release centered on three deliberate changes: moving the Cuemon build and test matrix forward to .NET 11, completing the assembly boundary split by removing the compatibility bridge from `Cuemon.Core` to `Cuemon.Kernel`, and relocating configuration primitives (`Configurable` and `IConfigurable`) into the kernel layer. Additionally, comprehensive unit test coverage was added for XML serialization converters.
+
+The .NET update is straightforward: `net11.0` is now part of the target matrix and `net9.0` is no longer supported. The more important part is the assembly boundary change. Version 10.5.0 introduced `Cuemon.Kernel` while keeping `Cuemon.Core` backward compatible through `[TypeForwardedTo]`. Starting with 11.0.0, that forwarding layer is removed and configuration types join the kernel layer.
+
+> [!WARNING]
+> Breaking change from 11.0.0 and forward: applications using foundational APIs that were previously reachable through `Cuemon.Core` must now reference `Cuemon.Kernel` directly. This includes guard, configuration, async, and text primitives such as `Validator`, `Arguments`, `Patterns`, `Disposable`, `Convertible`, `Configurable`, `IConfigurable`, `Awaiter`, and parser/encoding option types, as well as date and range primitives such as `DateSpan`, `DateTimeRange`, `Range`, `TimeRange`, and `TimeUnit`.
+
+### Changed
+
+- Solution, source, test, and benchmark target frameworks now include `net11.0`; `net9.0` has been removed from the supported matrix,
+- Central package management was updated to align `net11.0` and `netstandard2.0` builds with .NET 11 preview package versions, while `net10.0` remains on the .NET 10 package line where applicable,
+- `DateSpan`, `DateTimeRange`, `Range`, `TimeRange`, and `TimeUnit` source files now live in `Cuemon.Kernel` as part of the completed kernel split,
+- `Configurable` and `IConfigurable` types now reside in the `Cuemon.Kernel` assembly; consumers must reference that assembly directly because type forwarding from `Cuemon.Core` has been removed,
+- `DelimitedString`, `DelimitedStringOptions`, and `FormattingOptions` moved from the `Cuemon.Core` assembly to the `Cuemon.Kernel` assembly; their namespace remains `Cuemon`,
+- `BufferWriterOptions` was updated to follow the new `NET10_0_OR_GREATER` conditional path,
+- Solution organization now groups `Cuemon.Core` and `Cuemon.Kernel` under a dedicated `/src/corelibs/` folder,
+- Test environment definitions now target Docker images for `net10` and `net11`,
+- `XmlConverterDecoratorExtensions` class in the Cuemon.Extensions.Xml.Serialization.Converters namespace was simplified for improved maintainability,
+- `Condition` class updated with `NET10_0_OR_GREATER` conditional compilation paths for `IsBase64` and `HasDifference` methods, reflecting removal of .NET 9 support.
+
+### Added
+
+- Comprehensive unit test suite for XML serialization in `Cuemon.Xml.Tests` covering `XmlConverter`, `DefaultXmlConverter`, `ExceptionConverter`, `FailureConverter`, `DynamicXmlConverter`, and related serializer functionality,
+- Test assets `LinkResponse` and `WrapperResponse` in `Cuemon.Xml.Tests` for XML serialization validation.
+
+### Removed
+
+- `Cuemon.Core` no longer uses `[TypeForwardedTo]` to forward foundational `Cuemon.Kernel` types, making the kernel split a true assembly boundary instead of a compatibility shim.
+
+### Fixed
+
+- `Resolve-PackageReleaseNotesConflicts.ps1` script improved to correctly handle and resolve merge conflict markers in all PackageReleaseNotes.txt files with more robust regex pattern matching,
+- Merge conflict resolution output cleaned up to remove spurious double line breaks and duplicate version entries.
+
## [10.8.2] - 2026-10-25
This is a patch release updating dependency and development tooling versions, moving the WSL test environment to Ubuntu 26.04, and splitting Docker test environments by .NET version.
@@ -1951,6 +1987,7 @@ This release was primarily focused on adapting a more modern way of performing C
[10.8.1]: https://github.com/codebeltnet/cuemon/compare/v10.8.0...v10.8.1
[10.8.0]: https://github.com/codebeltnet/cuemon/compare/v10.7.1...v10.8.0
[10.7.1]: https://github.com/codebeltnet/cuemon/compare/v10.7.0...v10.7.1
+[11.0.0]: https://github.com/codebeltnet/cuemon/compare/v10.5.5...v11.0.0
[10.7.0]: https://github.com/codebeltnet/cuemon/compare/v10.6.0...v10.7.0
[10.6.0]: https://github.com/codebeltnet/cuemon/compare/v10.5.5...v10.6.0
[10.5.5]: https://github.com/codebeltnet/cuemon/compare/v10.5.4...v10.5.5
diff --git a/Cuemon.slnx b/Cuemon.slnx
index 40bcadcee..522a8b431 100644
--- a/Cuemon.slnx
+++ b/Cuemon.slnx
@@ -9,7 +9,6 @@
-
@@ -40,7 +39,6 @@
-
@@ -48,6 +46,10 @@
+
+
+
+
diff --git a/Directory.Build.props b/Directory.Build.props
index 14fb0414f..0164888c6 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -19,7 +19,7 @@
- net10.0;net9.0;netstandard2.0
+ net11.0;net10.0;netstandard2.0
Copyright © Geekle 2009-2026. All rights reserved.
gimlichael
Geekle
@@ -53,16 +53,17 @@
+
- net10.0;net9.0
+ net11.0;net10.0
- net10.0;net9.0;net48
+ net11.0;net10.0;net48
@@ -74,15 +75,12 @@
true
none
NU1701,NU1902,NU1903
+ 0
false
false
true
-
- 0
-
-
false
Exe
@@ -106,7 +104,7 @@
- net10.0;net9.0
+ net11.0;net10.0
false
false
false
diff --git a/Directory.Packages.props b/Directory.Packages.props
index 69e0331a1..75a3477c4 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -22,37 +22,43 @@
+
-
+
+
-
-
-
-
-
+
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
\ No newline at end of file
diff --git a/src/Cuemon.AspNetCore.App/Cuemon.AspNetCore.App.csproj b/src/Cuemon.AspNetCore.App/Cuemon.AspNetCore.App.csproj
index af93e5f40..f58563d74 100644
--- a/src/Cuemon.AspNetCore.App/Cuemon.AspNetCore.App.csproj
+++ b/src/Cuemon.AspNetCore.App/Cuemon.AspNetCore.App.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
240bdf91-e7c7-4cb4-a39d-e1a5374c5602
@@ -9,7 +9,7 @@
false
false
Provides a convenient set of default API additions for building an ASP.NET Core application.
- NU5128
+ $(NoWarn);NU5128
diff --git a/src/Cuemon.AspNetCore.Authentication/Cuemon.AspNetCore.Authentication.csproj b/src/Cuemon.AspNetCore.Authentication/Cuemon.AspNetCore.Authentication.csproj
index b469274a0..48d46993f 100644
--- a/src/Cuemon.AspNetCore.Authentication/Cuemon.AspNetCore.Authentication.csproj
+++ b/src/Cuemon.AspNetCore.Authentication/Cuemon.AspNetCore.Authentication.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
a10adf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.AspNetCore.Authentication/GlobalSuppressions.cs b/src/Cuemon.AspNetCore.Authentication/GlobalSuppressions.cs
index 60c9616aa..cffb80fcd 100644
--- a/src/Cuemon.AspNetCore.Authentication/GlobalSuppressions.cs
+++ b/src/Cuemon.AspNetCore.Authentication/GlobalSuppressions.cs
@@ -5,6 +5,5 @@
using System.Diagnostics.CodeAnalysis;
-[assembly: SuppressMessage("Performance", "CA1847:Use char literal for a single character lookup", Justification = "Not supported in .NET Standard 2.0 (and not an issue with an extra pico-second).", Scope = "member", Target = "~M:Cuemon.AspNetCore.Authentication.Basic.BasicAuthorizationHeader.#ctor(System.String,System.String)")]
[assembly: SuppressMessage("Style", "IDE0130:Namespace does not match folder structure", Justification = "Intentional as these embark on IDecorator.", Scope = "namespace", Target = "~N:Cuemon.AspNetCore.Authentication")]
[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "By design to support the Digest protocol.", Scope = "member", Target = "~M:Cuemon.AspNetCore.Authentication.Digest.DigestAuthorizationHeader.#ctor(System.String,System.String,System.String,System.String,System.String,System.String,System.String,System.String,System.String,System.String)")]
diff --git a/src/Cuemon.AspNetCore.Mvc/Cuemon.AspNetCore.Mvc.csproj b/src/Cuemon.AspNetCore.Mvc/Cuemon.AspNetCore.Mvc.csproj
index f9c2d9984..6086e201f 100644
--- a/src/Cuemon.AspNetCore.Mvc/Cuemon.AspNetCore.Mvc.csproj
+++ b/src/Cuemon.AspNetCore.Mvc/Cuemon.AspNetCore.Mvc.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
a20adf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.AspNetCore.Razor.TagHelpers/Cuemon.AspNetCore.Razor.TagHelpers.csproj b/src/Cuemon.AspNetCore.Razor.TagHelpers/Cuemon.AspNetCore.Razor.TagHelpers.csproj
index 2d28379b7..6490f2f2a 100644
--- a/src/Cuemon.AspNetCore.Razor.TagHelpers/Cuemon.AspNetCore.Razor.TagHelpers.csproj
+++ b/src/Cuemon.AspNetCore.Razor.TagHelpers/Cuemon.AspNetCore.Razor.TagHelpers.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
a30adf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.AspNetCore/Cuemon.AspNetCore.csproj b/src/Cuemon.AspNetCore/Cuemon.AspNetCore.csproj
index f3bc7af39..e6bc05aff 100644
--- a/src/Cuemon.AspNetCore/Cuemon.AspNetCore.csproj
+++ b/src/Cuemon.AspNetCore/Cuemon.AspNetCore.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
a00adf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.Core.App/Cuemon.Core.App.csproj b/src/Cuemon.Core.App/Cuemon.Core.App.csproj
index ddeb20996..8edea3070 100644
--- a/src/Cuemon.Core.App/Cuemon.Core.App.csproj
+++ b/src/Cuemon.Core.App/Cuemon.Core.App.csproj
@@ -8,7 +8,7 @@
false
false
Provides a convenient set of default API additions for building a .NET application.
- NU5128
+ $(NoWarn);NU5128
diff --git a/src/Cuemon.Core/GlobalSuppressions.cs b/src/Cuemon.Core/GlobalSuppressions.cs
index 0d23b4d16..5f405f009 100644
--- a/src/Cuemon.Core/GlobalSuppressions.cs
+++ b/src/Cuemon.Core/GlobalSuppressions.cs
@@ -4,31 +4,8 @@
// a specific target and scoped to a namespace, type, member, etc.
using System.Diagnostics.CodeAnalysis;
-[assembly: SuppressMessage("Major Code Smell", "S3881:\"IDisposable\" should be implemented correctly", Justification = "This is a base class implementation of the IDisposable interface tailored to avoid wrong implementations.", Scope = "type", Target = "~T:Cuemon.Disposable")]
[assembly: SuppressMessage("Minor Code Smell", "S1128:Unused \"using\" should be removed", Justification = "It is actually used when resolving extension method from System.Collections.Generic; SC just can't figure this out.")]
-[assembly: SuppressMessage("Critical Code Smell", "S3776:Cognitive Complexity of methods should not be too high", Justification = "By design.", Scope = "member", Target = "~F:Cuemon.Convertible.EndianSensitiveByteArrayConverters")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "A Func designed for the Tester pattern. Microsoft allows 17 arguments in there Func impl; so do i here.", Scope = "type", Target = "~T:Cuemon.TesterFunc`10")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "A Func designed for the Tester pattern. Microsoft allows 17 arguments in there Func impl; so do i here.", Scope = "type", Target = "~T:Cuemon.TesterFunc`11")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "A Func designed for the Tester pattern. Microsoft allows 17 arguments in there Func impl; so do i here.", Scope = "type", Target = "~T:Cuemon.TesterFunc`12")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "A Func designed for the Tester pattern. Microsoft allows 17 arguments in there Func impl; so do i here.", Scope = "type", Target = "~T:Cuemon.TesterFunc`13")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "A Func designed for the Tester pattern. Microsoft allows 17 arguments in there Func impl; so do i here.", Scope = "type", Target = "~T:Cuemon.TesterFunc`14")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "A Func designed for the Tester pattern. Microsoft allows 17 arguments in there Func impl; so do i here.", Scope = "type", Target = "~T:Cuemon.TesterFunc`15")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "A Func designed for the Tester pattern. Microsoft allows 17 arguments in there Func impl; so do i here.", Scope = "type", Target = "~T:Cuemon.TesterFunc`16")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "A Func designed for the Tester pattern. Microsoft allows 17 arguments in there Func impl; so do i here.", Scope = "type", Target = "~T:Cuemon.TesterFunc`17")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "A Func designed for the Tester pattern. Microsoft allows 17 arguments in there Func impl; so do i here.", Scope = "type", Target = "~T:Cuemon.TesterFunc`18")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "A Func designed for the Tester pattern. Microsoft allows 17 arguments in there Func impl; so do i here.", Scope = "type", Target = "~T:Cuemon.TesterFunc`9")]
[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; think about it as a Tuple/Variadic - but for TesterFunc delegates.", Scope = "type", Target = "~T:Cuemon.TesterFuncFactory`3")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions)..", Scope = "member", Target = "~M:Cuemon.Patterns.SafeInvoke``6(System.Func{``5},System.Func{``5,``0,``1,``2,``3,``4,``5},``0,``1,``2,``3,``4,System.Action{System.Exception,``0,``1,``2,``3,``4})~``5")]
-[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions)..", Scope = "member", Target = "~M:Cuemon.Patterns.SafeInvoke``4(System.Func{``3},System.Func{``3,``0,``1,``2,``3},``0,``1,``2,System.Action{System.Exception,``0,``1,``2})~``3")]
-[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions)..", Scope = "member", Target = "~M:Cuemon.Patterns.SafeInvoke``5(System.Func{``4},System.Func{``4,``0,``1,``2,``3,``4},``0,``1,``2,``3,System.Action{System.Exception,``0,``1,``2,``3})~``4")]
-[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions)..", Scope = "member", Target = "~M:Cuemon.Patterns.SafeInvoke``6(System.Func{``5},System.Func{``5,``0,``1,``2,``3,``4,``5},``0,``1,``2,``3,``4,System.Action{System.Exception,``0,``1,``2,``3,``4})~``5")]
-[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions).", Scope = "member", Target = "~M:Cuemon.Condition.FlipFlop``4(System.Boolean,System.Action{``0,``1,``2,``3},System.Action{``0,``1,``2,``3},``0,``1,``2,``3)")]
-[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions).", Scope = "member", Target = "~M:Cuemon.Condition.FlipFlop``5(System.Boolean,System.Action{``0,``1,``2,``3,``4},System.Action{``0,``1,``2,``3,``4},``0,``1,``2,``3,``4)")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions).", Scope = "member", Target = "~M:Cuemon.Condition.FlipFlop``5(System.Boolean,System.Action{``0,``1,``2,``3,``4},System.Action{``0,``1,``2,``3,``4},``0,``1,``2,``3,``4)")]
-[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions).", Scope = "member", Target = "~M:Cuemon.Condition.TernaryIf``4(System.Boolean,System.Func{``0,``1,``2,``3},System.Func{``0,``1,``2,``3},``0,``1,``2)~``3")]
-[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions).", Scope = "member", Target = "~M:Cuemon.Condition.TernaryIf``5(System.Boolean,System.Func{``0,``1,``2,``3,``4},System.Func{``0,``1,``2,``3,``4},``0,``1,``2,``3)~``4")]
-[assembly: SuppressMessage("Major Code Smell", "S107:Methods should not have too many parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions).", Scope = "member", Target = "~M:Cuemon.Condition.TernaryIf``6(System.Boolean,System.Func{``0,``1,``2,``3,``4,``5},System.Func{``0,``1,``2,``3,``4,``5},``0,``1,``2,``3,``4)~``5")]
-[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions).", Scope = "member", Target = "~M:Cuemon.Condition.TernaryIf``6(System.Boolean,System.Func{``0,``1,``2,``3,``4,``5},System.Func{``0,``1,``2,``3,``4,``5},``0,``1,``2,``3,``4)~``5")]
[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions).", Scope = "member", Target = "~M:Cuemon.Reflection.ActivatorFactory.CreateInstance``4(``0,``1,``2,System.Action{Cuemon.Reflection.ActivatorOptions})~``3")]
[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions).", Scope = "member", Target = "~M:Cuemon.Reflection.ActivatorFactory.CreateInstance``5(``0,``1,``2,``3,System.Action{Cuemon.Reflection.ActivatorOptions})~``4")]
[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow up till 5 arguments (more under certain conditions).", Scope = "member", Target = "~M:Cuemon.Reflection.ActivatorFactory.CreateInstance``6(``0,``1,``2,``3,``4,System.Action{Cuemon.Reflection.ActivatorOptions})~``5")]
@@ -37,17 +14,12 @@
[assembly: SuppressMessage("Major Code Smell", "S3011:Reflection should not be used to increase accessibility of classes, methods, or fields", Justification = "By design.", Scope = "member", Target = "~M:Cuemon.Reflection.MemberReflection.#ctor(System.Action{Cuemon.Reflection.MemberReflectionOptions})")]
[assembly: SuppressMessage("Major Code Smell", "S3011:Reflection should not be used to increase accessibility of classes, methods, or fields", Justification = "By design.", Scope = "member", Target = "~M:Cuemon.Globalization.ResourceAttribute.GetString(System.String)~System.String")]
[assembly: SuppressMessage("Style", "IDE0220:Add explicit cast", Justification = "False-Positive", Scope = "member", Target = "~M:Cuemon.StringReplaceEngine.RenderReplacement~System.String")]
-[assembly: SuppressMessage("Minor Code Smell", "S3236:Caller information arguments should not be provided explicitly", Justification = "By design - and unit tested to that no information is lost.", Scope = "member", Target = "~M:Cuemon.Decorator`1.#ctor(`0,System.Boolean,System.String)")]
[assembly: SuppressMessage("Critical Code Smell", "S3776:Cognitive Complexity of methods should not be too high", Justification = "Acceptable.", Scope = "member", Target = "~M:Cuemon.Text.ParserFactory.FromValueType~Cuemon.Text.IConfigurableParser{System.Object,Cuemon.FormattingOptions}")]
[assembly: SuppressMessage("Critical Code Smell", "S3776:Cognitive Complexity of methods should not be too high", Justification = "Acceptable.", Scope = "member", Target = "~M:Cuemon.Reflection.MemberArgumentDecoratorExtensions.CreateException(Cuemon.IDecorator{System.Collections.Generic.Stack{System.Collections.Generic.IList{Cuemon.Reflection.MemberArgument}}},System.Boolean)~System.Exception")]
-[assembly: SuppressMessage("Minor Code Smell", "S3236:Caller information arguments should not be provided explicitly", Justification = "False positive; IDecorator support overriding argument name used together with Decorator.EncloseToExpose.", Scope = "member", Target = "~M:Cuemon.Validator.ThrowIfNull``1(Cuemon.IDecorator{``0},``0@,System.String,System.String)")]
[assembly: SuppressMessage("Style", "IDE0130:Namespace does not match folder structure", Justification = "Intentional as these embark on IDecorator.", Scope = "namespace", Target = "~N:Cuemon")]
[assembly: SuppressMessage("Style", "IDE0130:Namespace does not match folder structure", Justification = "Intentional as these embark on IDecorator.", Scope = "namespace", Target = "~N:Cuemon.Collections.Generic")]
[assembly: SuppressMessage("Style", "IDE0130:Namespace does not match folder structure", Justification = "Intentional as these embark on IDecorator.", Scope = "namespace", Target = "~N:Cuemon.Collections.Specialized")]
-[assembly: SuppressMessage("Style", "IDE0130:Namespace does not match folder structure", Justification = "Intentional as these embark on IDecorator.", Scope = "namespace", Target = "~N:Cuemon.IO")]
[assembly: SuppressMessage("Style", "IDE0130:Namespace does not match folder structure", Justification = "Intentional as these embark on IDecorator.", Scope = "namespace", Target = "~N:Cuemon.Reflection")]
-[assembly: SuppressMessage("Style", "IDE0130:Namespace does not match folder structure", Justification = "By design. To support pre-net9.0.", Scope = "namespace", Target = "~N:System.Threading")]
-[assembly: SuppressMessage("Style", "IDE0130:Namespace does not match folder structure", Justification = "By design. To support pre-netcoreapp3.0.", Scope = "namespace", Target = "~N:System.Runtime.CompilerServices")]
[assembly: SuppressMessage("Design", "CA1000:Do not declare static members on generic types", Justification = "Consistent with Comparer.Default implementation.", Scope = "member", Target = "~P:Cuemon.Collections.Generic.EnumerableSizeComparer`1.Default")]
[assembly: SuppressMessage("Design", "CA1000:Do not declare static members on generic types", Justification = "Consistent with Comparer.Default implementation.", Scope = "member", Target = "~P:Cuemon.Collections.Generic.ReferenceComparer`1.Default")]
[assembly: SuppressMessage("Design", "CA1000:Do not declare static members on generic types", Justification = "By design; supports consistent developer experience for all formatters, e.g., SerializeObject/DeserializeObject.", Scope = "member", Target = "~M:Cuemon.Runtime.Serialization.Formatters.StreamFormatter`1.DeserializeObject(System.IO.Stream,System.Type)~System.Object")]
@@ -62,10 +34,8 @@
[assembly: SuppressMessage("Design", "CA1000:Do not declare static members on generic types", Justification = "By design; supports consistent developer experience for all formatters, e.g., SerializeObject/DeserializeObject.", Scope = "member", Target = "~M:Cuemon.Runtime.Serialization.Formatters.StreamFormatter`1.SerializeObject(System.Object,System.Type)~System.IO.Stream")]
[assembly: SuppressMessage("Design", "CA1000:Do not declare static members on generic types", Justification = "By design; supports consistent developer experience for all formatters, e.g., SerializeObject/DeserializeObject.", Scope = "member", Target = "~M:Cuemon.Runtime.Serialization.Formatters.StreamFormatter`1.SerializeObject(System.Object,System.Type,`0)~System.IO.Stream")]
[assembly: SuppressMessage("Design", "CA1000:Do not declare static members on generic types", Justification = "By design; supports consistent developer experience for all formatters, e.g., SerializeObject/DeserializeObject.", Scope = "member", Target = "~M:Cuemon.Runtime.Serialization.Formatters.StreamFormatter`1.SerializeObject(System.Object,System.Type,System.Action{`0})~System.IO.Stream")]
-[assembly: SuppressMessage("Globalization", "CA1304:Specify CultureInfo", Justification = "False-Positive. Overload exists.", Scope = "member", Target = "~M:Cuemon.DateSpan.Parse(System.String)~Cuemon.DateSpan")]
[assembly: SuppressMessage("Globalization", "CA1304:Specify CultureInfo", Justification = "Intentionally written for only en-US support.", Scope = "member", Target = "~M:Cuemon.Reflection.MemberArgumentDecoratorExtensions.CreateException(Cuemon.IDecorator{System.Collections.Generic.Stack{System.Collections.Generic.IList{Cuemon.Reflection.MemberArgument}}},System.Boolean)~System.Exception")]
[assembly: SuppressMessage("Naming", "CA1710:Identifiers should have correct suffix", Justification = "Explicit implementation.", Scope = "type", Target = "~T:Cuemon.Diagnostics.Failure")]
-[assembly: SuppressMessage("Reliability", "CA2022:Avoid inexact read with 'Stream.Read'", Justification = "Byteordermark - best effort.", Scope = "member", Target = "~M:Cuemon.Text.ByteOrderMark.TryDetectEncoding(System.IO.Stream,System.Text.Encoding@)~System.Boolean")]
[assembly: SuppressMessage("Style", "IDE0005:Using directive is unnecessary.", Justification = "False-positive; needed for TFM netstandard2.0.")]
[assembly: SuppressMessage("Major Code Smell", "S110:Inheritance tree of classes should not be too deep", Justification = "By design; allow to exceed generic arguments recommendation.", Scope = "type", Target = "~T:Cuemon.MutableTuple`10")]
[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow to exceed generic arguments recommendation.", Scope = "type", Target = "~T:Cuemon.MutableTuple`10")]
diff --git a/src/Cuemon.Core/Properties/AssemblyInfo.cs b/src/Cuemon.Core/Properties/AssemblyInfo.cs
index 8f5893525..85c554583 100644
--- a/src/Cuemon.Core/Properties/AssemblyInfo.cs
+++ b/src/Cuemon.Core/Properties/AssemblyInfo.cs
@@ -1,86 +1,4 @@
-using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
-using Cuemon;
-using Cuemon.Collections.Generic;
-using Cuemon.Configuration;
-using Cuemon.IO;
-using Cuemon.Text;
-using Cuemon.Threading;
[assembly: ComVisible(false)]
[assembly: Guid("989939cf-cef2-4e23-8bce-725255e35ce6")]
-[assembly: TypeForwardedTo(typeof(Alphanumeric))]
-[assembly: TypeForwardedTo(typeof(ArgumentReservedKeywordException))]
-[assembly: TypeForwardedTo(typeof(Arguments))]
-[assembly: TypeForwardedTo(typeof(AsyncOptions))]
-[assembly: TypeForwardedTo(typeof(AsyncRunOptions))]
-[assembly: TypeForwardedTo(typeof(Awaiter))]
-[assembly: TypeForwardedTo(typeof(ByteOrderMark))]
-[assembly: TypeForwardedTo(typeof(CasingMethod))]
-[assembly: TypeForwardedTo(typeof(Condition))]
-[assembly: TypeForwardedTo(typeof(ConditionalValue))]
-[assembly: TypeForwardedTo(typeof(ConditionalValue<>))]
-[assembly: TypeForwardedTo(typeof(Convertible))]
-[assembly: TypeForwardedTo(typeof(ConvertibleConverterDictionary))]
-[assembly: TypeForwardedTo(typeof(ConvertibleOptions))]
-[assembly: TypeForwardedTo(typeof(Decorator))]
-[assembly: TypeForwardedTo(typeof(Decorator<>))]
-[assembly: TypeForwardedTo(typeof(Disposable))]
-[assembly: TypeForwardedTo(typeof(DisposableOptions))]
-[assembly: TypeForwardedTo(typeof(EndianOptions))]
-[assembly: TypeForwardedTo(typeof(EncodingOptions))]
-[assembly: TypeForwardedTo(typeof(Endianness))]
-[assembly: TypeForwardedTo(typeof(EnumStringOptions))]
-[assembly: TypeForwardedTo(typeof(ExceptionCondition<>))]
-[assembly: TypeForwardedTo(typeof(ExceptionHandler<>))]
-[assembly: TypeForwardedTo(typeof(ExceptionHandler<,>))]
-[assembly: TypeForwardedTo(typeof(ExceptionInvoker<>))]
-[assembly: TypeForwardedTo(typeof(ExceptionInvoker<,>))]
-[assembly: TypeForwardedTo(typeof(FallbackEncodingOptions))]
-[assembly: TypeForwardedTo(typeof(FinalizeDisposable))]
-[assembly: TypeForwardedTo(typeof(GuidFormats))]
-[assembly: TypeForwardedTo(typeof(IAsyncOptions))]
-[assembly: TypeForwardedTo(typeof(IConfigurableParser<>))]
-[assembly: TypeForwardedTo(typeof(IConfigurableParser<,>))]
-[assembly: TypeForwardedTo(typeof(IDecorator<>))]
-[assembly: TypeForwardedTo(typeof(IEncodingOptions))]
-[assembly: TypeForwardedTo(typeof(IParameterObject))]
-[assembly: TypeForwardedTo(typeof(IParser))]
-[assembly: TypeForwardedTo(typeof(IParser<>))]
-[assembly: TypeForwardedTo(typeof(IPostConfigurableParameterObject))]
-[assembly: TypeForwardedTo(typeof(IValidatableParameterObject))]
-[assembly: TypeForwardedTo(typeof(Patterns))]
-[assembly: TypeForwardedTo(typeof(PreambleSequence))]
-[assembly: TypeForwardedTo(typeof(ProtocolRelativeUriStringOptions))]
-[assembly: TypeForwardedTo(typeof(StreamDecoratorExtensions))]
-[assembly: TypeForwardedTo(typeof(SuccessfulValue))]
-[assembly: TypeForwardedTo(typeof(SuccessfulValue<>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TesterFunc<,,,,,,,,,,,,,,,,,>))]
-[assembly: TypeForwardedTo(typeof(TypeArgumentException))]
-[assembly: TypeForwardedTo(typeof(TypeArgumentOutOfRangeException))]
-[assembly: TypeForwardedTo(typeof(UnsuccessfulValue))]
-[assembly: TypeForwardedTo(typeof(UnsuccessfulValue<>))]
-[assembly: TypeForwardedTo(typeof(UriScheme))]
-[assembly: TypeForwardedTo(typeof(UriStringOptions))]
-[assembly: TypeForwardedTo(typeof(Validator))]
-[assembly: TypeForwardedTo(typeof(IConfigurable<>))]
-[assembly: TypeForwardedTo(typeof(Configurable<>))]
-#if !NETCOREAPP3_0_OR_GREATER
-[assembly: TypeForwardedTo(typeof(CallerArgumentExpressionAttribute))]
-#endif
diff --git a/src/Cuemon.Core/Reflection/AssemblyContext.cs b/src/Cuemon.Core/Reflection/AssemblyContext.cs
index a39de2a62..3d7add092 100644
--- a/src/Cuemon.Core/Reflection/AssemblyContext.cs
+++ b/src/Cuemon.Core/Reflection/AssemblyContext.cs
@@ -72,7 +72,7 @@ private static IEnumerable GetReferencedAssemblies(Assembly assembly,
private static bool TryPop(Stack stack, out Assembly assembly)
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
return stack.TryPop(out assembly);
#else
return Decorator.RawEnclose(stack).TryPop(out assembly);
diff --git a/src/Cuemon.Core/Runtime/Dependency.cs b/src/Cuemon.Core/Runtime/Dependency.cs
index 2825357db..a6d4074e5 100644
--- a/src/Cuemon.Core/Runtime/Dependency.cs
+++ b/src/Cuemon.Core/Runtime/Dependency.cs
@@ -11,7 +11,7 @@ public abstract class Dependency : IDependency
{
private IEnumerable _watchers;
private readonly Func, IEnumerable> _watchersHandler;
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
private readonly System.Threading.Lock _lock = new();
#else
private readonly object _lock = new();
diff --git a/src/Cuemon.Core/Runtime/FileWatcher.cs b/src/Cuemon.Core/Runtime/FileWatcher.cs
index 6669abd49..993aafe77 100644
--- a/src/Cuemon.Core/Runtime/FileWatcher.cs
+++ b/src/Cuemon.Core/Runtime/FileWatcher.cs
@@ -10,7 +10,7 @@ namespace Cuemon.Runtime;
///
public class FileWatcher : Watcher
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
private readonly System.Threading.Lock _lock = new();
#else
private readonly object _lock = new();
diff --git a/src/Cuemon.Core/Runtime/Watcher.cs b/src/Cuemon.Core/Runtime/Watcher.cs
index 583fad03d..aa164567e 100644
--- a/src/Cuemon.Core/Runtime/Watcher.cs
+++ b/src/Cuemon.Core/Runtime/Watcher.cs
@@ -9,7 +9,7 @@ namespace Cuemon.Runtime;
///
public abstract class Watcher : Disposable, IWatcher
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
private readonly Lock _lock = new();
#else
private readonly object _lock = new();
diff --git a/src/Cuemon.Core/StringFactory.cs b/src/Cuemon.Core/StringFactory.cs
index 4d73c89c1..9d58a607d 100644
--- a/src/Cuemon.Core/StringFactory.cs
+++ b/src/Cuemon.Core/StringFactory.cs
@@ -23,7 +23,7 @@ public static class StringFactory
public static string CreateHexadecimal(byte[] value)
{
Validator.ThrowIfNull(value);
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
return Convert.ToHexString(value).Replace("-", "").ToLowerInvariant();
#else
return BitConverter.ToString(value).Replace("-", "").ToLowerInvariant();
diff --git a/src/Cuemon.Data/DatabaseWatcher.cs b/src/Cuemon.Data/DatabaseWatcher.cs
index f0bbf2b9d..2a1dbdf6b 100644
--- a/src/Cuemon.Data/DatabaseWatcher.cs
+++ b/src/Cuemon.Data/DatabaseWatcher.cs
@@ -13,7 +13,7 @@ namespace Cuemon.Data;
///
public class DatabaseWatcher : Watcher
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
private readonly System.Threading.Lock _lock = new();
#else
private readonly object _lock = new();
diff --git a/src/Cuemon.Extensions.AspNetCore.Authentication/Cuemon.Extensions.AspNetCore.Authentication.csproj b/src/Cuemon.Extensions.AspNetCore.Authentication/Cuemon.Extensions.AspNetCore.Authentication.csproj
index cdbf53662..c5f8e11bf 100644
--- a/src/Cuemon.Extensions.AspNetCore.Authentication/Cuemon.Extensions.AspNetCore.Authentication.csproj
+++ b/src/Cuemon.Extensions.AspNetCore.Authentication/Cuemon.Extensions.AspNetCore.Authentication.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
220bdf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.csproj b/src/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.csproj
index bffb58818..566e92b43 100644
--- a/src/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.csproj
+++ b/src/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
a90adf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.csproj b/src/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.csproj
index 813ab95b8..747080e25 100644
--- a/src/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.csproj
+++ b/src/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
a70adf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.csproj b/src/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.csproj
index fcbd21aea..8fefe9001 100644
--- a/src/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.csproj
+++ b/src/Cuemon.Extensions.AspNetCore.Mvc.RazorPages/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
c6b592e8-2413-4bff-adf2-8a72c62199e3
diff --git a/src/Cuemon.Extensions.AspNetCore.Mvc/Cuemon.Extensions.AspNetCore.Mvc.csproj b/src/Cuemon.Extensions.AspNetCore.Mvc/Cuemon.Extensions.AspNetCore.Mvc.csproj
index b6ab1e073..c018690fa 100644
--- a/src/Cuemon.Extensions.AspNetCore.Mvc/Cuemon.Extensions.AspNetCore.Mvc.csproj
+++ b/src/Cuemon.Extensions.AspNetCore.Mvc/Cuemon.Extensions.AspNetCore.Mvc.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
a50adf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.Extensions.AspNetCore.Text.Json/Cuemon.Extensions.AspNetCore.Text.Json.csproj b/src/Cuemon.Extensions.AspNetCore.Text.Json/Cuemon.Extensions.AspNetCore.Text.Json.csproj
index 9d8cab49e..920c2b81c 100644
--- a/src/Cuemon.Extensions.AspNetCore.Text.Json/Cuemon.Extensions.AspNetCore.Text.Json.csproj
+++ b/src/Cuemon.Extensions.AspNetCore.Text.Json/Cuemon.Extensions.AspNetCore.Text.Json.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
ae0adf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.Extensions.AspNetCore.Xml/Cuemon.Extensions.AspNetCore.Xml.csproj b/src/Cuemon.Extensions.AspNetCore.Xml/Cuemon.Extensions.AspNetCore.Xml.csproj
index e12538b0e..4835fe5b2 100644
--- a/src/Cuemon.Extensions.AspNetCore.Xml/Cuemon.Extensions.AspNetCore.Xml.csproj
+++ b/src/Cuemon.Extensions.AspNetCore.Xml/Cuemon.Extensions.AspNetCore.Xml.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
af0adf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.Extensions.AspNetCore/Cuemon.Extensions.AspNetCore.csproj b/src/Cuemon.Extensions.AspNetCore/Cuemon.Extensions.AspNetCore.csproj
index 1fc096291..11f161f12 100644
--- a/src/Cuemon.Extensions.AspNetCore/Cuemon.Extensions.AspNetCore.csproj
+++ b/src/Cuemon.Extensions.AspNetCore/Cuemon.Extensions.AspNetCore.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
a40adf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.Extensions.AspNetCore/GlobalSuppressions.cs b/src/Cuemon.Extensions.AspNetCore/GlobalSuppressions.cs
index 32d27ebf2..8b5fc4660 100644
--- a/src/Cuemon.Extensions.AspNetCore/GlobalSuppressions.cs
+++ b/src/Cuemon.Extensions.AspNetCore/GlobalSuppressions.cs
@@ -5,5 +5,4 @@
using System.Diagnostics.CodeAnalysis;
-[assembly: SuppressMessage("Performance", "CA1835:Prefer the 'Memory'-based overloads for 'ReadAsync' and 'WriteAsync'", Justification = "Already fixed for .NET 5, but SonarCloud cannot figure out multiple framework support, eg. NETStandard 2.", Scope = "member", Target = "~M:Cuemon.Extensions.AspNetCore.Http.HttpResponseExtensions.WriteBodyAsync(Microsoft.AspNetCore.Http.HttpResponse,System.Func{System.Byte[]})~System.Threading.Tasks.Task")]
[assembly: SuppressMessage("Globalization", "CA1304:Specify CultureInfo", Justification = "Not relevant in this context.", Scope = "member", Target = "~M:Cuemon.Extensions.AspNetCore.Configuration.AssemblyCacheBusting.#ctor(Microsoft.Extensions.Options.IOptions{Cuemon.Extensions.AspNetCore.Configuration.AssemblyCacheBustingOptions})")]
diff --git a/src/Cuemon.Extensions.Core/GlobalSuppressions.cs b/src/Cuemon.Extensions.Core/GlobalSuppressions.cs
index dcce8d859..f9329118a 100644
--- a/src/Cuemon.Extensions.Core/GlobalSuppressions.cs
+++ b/src/Cuemon.Extensions.Core/GlobalSuppressions.cs
@@ -6,8 +6,6 @@
using System.Diagnostics.CodeAnalysis;
-[assembly: SuppressMessage("Usage", "CA2249:Consider using 'string.Contains' instead of 'string.IndexOf'", Justification = "False-Positive. Contains does not support comparison rules in NET Standard 2.", Scope = "member", Target = "~M:Cuemon.Extensions.StringExtensions.ContainsAny(System.String,System.String,System.StringComparison)~System.Boolean")]
-[assembly: SuppressMessage("Minor Code Smell", "S3267:Loops should be simplified with \"LINQ\" expressions", Justification = "False-positive.", Scope = "member", Target = "~M:Cuemon.Extensions.StringExtensions.JsUnescape(System.String)~System.String")]
[assembly: SuppressMessage("Style", "IDE0220:Add explicit cast", Justification = "False-Positive", Scope = "member", Target = "~M:Cuemon.Extensions.StringExtensions.JsUnescape(System.String)~System.String")]
[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow to exceed generic arguments recommendation.", Scope = "member", Target = "~M:Cuemon.Extensions.ActionFactory.Create``10(System.Action{``0,``1,``2,``3,``4,``5,``6,``7,``8,``9},``0,``1,``2,``3,``4,``5,``6,``7,``8,``9)~Cuemon.ActionFactory{Cuemon.MutableTuple{``0,``1,``2,``3,``4,``5,``6,``7,``8,``9}}")]
[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; allow to exceed generic arguments recommendation.", Scope = "member", Target = "~M:Cuemon.Extensions.ActionFactory.Create``11(System.Action{``0,``1,``2,``3,``4,``5,``6,``7,``8,``9,``10},``0,``1,``2,``3,``4,``5,``6,``7,``8,``9,``10)~Cuemon.ActionFactory{Cuemon.MutableTuple{``0,``1,``2,``3,``4,``5,``6,``7,``8,``9,``10}}")]
diff --git a/src/Cuemon.Extensions.IO/Cuemon.Extensions.IO.csproj b/src/Cuemon.Extensions.IO/Cuemon.Extensions.IO.csproj
index c0de63fff..f565b191d 100644
--- a/src/Cuemon.Extensions.IO/Cuemon.Extensions.IO.csproj
+++ b/src/Cuemon.Extensions.IO/Cuemon.Extensions.IO.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0;netstandard2.1;netstandard2.0
+ net11.0;net10.0;netstandard2.1;netstandard2.0
060bdf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.Extensions.IO/StreamExtensions.cs b/src/Cuemon.Extensions.IO/StreamExtensions.cs
index 322059186..6ae8e926d 100644
--- a/src/Cuemon.Extensions.IO/StreamExtensions.cs
+++ b/src/Cuemon.Extensions.IO/StreamExtensions.cs
@@ -196,7 +196,7 @@ public static Task ToEncodedStringAsync(this Stream value, Action
/// Compresses the using the BROTLI algorithm.
@@ -311,7 +311,7 @@ public static Task CompressGZipAsync(this Stream value, Action
/// Decompresses the using the BROTLI data format specification.
diff --git a/src/Cuemon.Extensions.Net/Http/SlimHttpClientFactory.cs b/src/Cuemon.Extensions.Net/Http/SlimHttpClientFactory.cs
index c46008f2d..cb69d45d6 100644
--- a/src/Cuemon.Extensions.Net/Http/SlimHttpClientFactory.cs
+++ b/src/Cuemon.Extensions.Net/Http/SlimHttpClientFactory.cs
@@ -6,7 +6,7 @@
using Cuemon.Threading;
namespace Cuemon.Extensions.Net.Http;
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
///
/// Provides a simple and lightweight implementation of the interface.
///
@@ -21,14 +21,14 @@ namespace Cuemon.Extensions.Net.Http;
/// Inspiration taken from https://github.com/dotnet/runtime/blob/master/src/libraries/Microsoft.Extensions.Http/src/DefaultHttpClientFactory.cs
#endif
public class SlimHttpClientFactory : IHttpClientFactory
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
, IHttpMessageHandlerFactory
#endif
{
private readonly ConcurrentDictionary> _activeHandlers = new();
private readonly ConcurrentQueue _expiredHandlers = new();
private readonly Func _handlerFactory;
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
private readonly Lock _lock = new();
#else
private readonly object _lock = new();
diff --git a/src/Cuemon.Extensions.Runtime.Caching/CacheEnumerableExtensions.cs b/src/Cuemon.Extensions.Runtime.Caching/CacheEnumerableExtensions.cs
index 003a30713..992c35323 100644
--- a/src/Cuemon.Extensions.Runtime.Caching/CacheEnumerableExtensions.cs
+++ b/src/Cuemon.Extensions.Runtime.Caching/CacheEnumerableExtensions.cs
@@ -711,7 +711,7 @@ public static Func Memoize
{
diff --git a/src/Cuemon.Extensions.Text.Json/Formatters/JsonFormatterOptions.cs b/src/Cuemon.Extensions.Text.Json/Formatters/JsonFormatterOptions.cs
index 36cdb0969..3e26dea19 100644
--- a/src/Cuemon.Extensions.Text.Json/Formatters/JsonFormatterOptions.cs
+++ b/src/Cuemon.Extensions.Text.Json/Formatters/JsonFormatterOptions.cs
@@ -15,7 +15,7 @@ namespace Cuemon.Extensions.Text.Json.Formatters;
///
public class JsonFormatterOptions : IContentNegotiation, IExceptionDescriptorOptions, IValidatableParameterObject
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
private readonly System.Threading.Lock _lock = new();
#else
private readonly object _lock = new();
diff --git a/src/Cuemon.IO/BufferWriterOptions.cs b/src/Cuemon.IO/BufferWriterOptions.cs
index 18e385ccb..f24a5374f 100644
--- a/src/Cuemon.IO/BufferWriterOptions.cs
+++ b/src/Cuemon.IO/BufferWriterOptions.cs
@@ -1,4 +1,4 @@
-#if NETSTANDARD2_1_OR_GREATER || NET9_0_OR_GREATER
+#if NETSTANDARD2_1_OR_GREATER || NET10_0_OR_GREATER
using System.Buffers;
using Cuemon.Text;
diff --git a/src/Cuemon.IO/Cuemon.IO.csproj b/src/Cuemon.IO/Cuemon.IO.csproj
index 8dfa5a5a3..d15b13f84 100644
--- a/src/Cuemon.IO/Cuemon.IO.csproj
+++ b/src/Cuemon.IO/Cuemon.IO.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0;netstandard2.1;netstandard2.0
+ net11.0;net10.0;netstandard2.1;netstandard2.0
170bdf91-e7c7-4cb4-a39d-e1a5374c5602
diff --git a/src/Cuemon.IO/Extensions/StreamDecoratorExtensions.cs b/src/Cuemon.IO/Extensions/StreamDecoratorExtensions.cs
index f667d4d8a..e6c67ebb8 100644
--- a/src/Cuemon.IO/Extensions/StreamDecoratorExtensions.cs
+++ b/src/Cuemon.IO/Extensions/StreamDecoratorExtensions.cs
@@ -203,7 +203,7 @@ private static async Task ToEncodedStringAsyncCore(this IDecorator
/// Compress the enclosed of the specified using the Brotli algorithm.
@@ -460,7 +460,7 @@ private static Task CompressAsync(IDecorator decorator, Async
{
return AsyncPatterns.SafeInvokeAsync(() => new MemoryStream(), async (target, ct) =>
{
-#if NETSTANDARD2_1_OR_GREATER || NET9_0_OR_GREATER
+#if NETSTANDARD2_1_OR_GREATER || NET10_0_OR_GREATER
await using (var compressed = decompressor(target, options.Level, true))
{
await Decorator.Enclose(decorator.Inner).CopyStreamAsync(compressed, options.BufferSize, ct: ct).ConfigureAwait(false);
@@ -496,7 +496,7 @@ private static Task DecompressAsync(IDecorator decorator, Asy
{
return AsyncPatterns.SafeInvokeAsync(() => new MemoryStream(), async (target, ct) =>
{
-#if NETSTANDARD2_1_OR_GREATER || NET9_0_OR_GREATER
+#if NETSTANDARD2_1_OR_GREATER || NET10_0_OR_GREATER
await using (var uncompressed = compressor(decorator.Inner, CompressionMode.Decompress, true))
{
await Decorator.Enclose(uncompressed).CopyStreamAsync(target, options.BufferSize, ct: ct).ConfigureAwait(false);
diff --git a/src/Cuemon.IO/StreamFactory.cs b/src/Cuemon.IO/StreamFactory.cs
index 65b56f4d0..92560f7b6 100644
--- a/src/Cuemon.IO/StreamFactory.cs
+++ b/src/Cuemon.IO/StreamFactory.cs
@@ -1,5 +1,5 @@
using System;
-#if NETSTANDARD2_1_OR_GREATER || NET9_0_OR_GREATER
+#if NETSTANDARD2_1_OR_GREATER || NET10_0_OR_GREATER
using System.Buffers;
#endif
using System.Collections.Generic;
@@ -114,7 +114,7 @@ public static Stream Create(Action
/// Creates and returns a by the specified delegate .
diff --git a/src/Cuemon.Kernel/Condition.cs b/src/Cuemon.Kernel/Condition.cs
index 0eea5050f..f5c1788e3 100644
--- a/src/Cuemon.Kernel/Condition.cs
+++ b/src/Cuemon.Kernel/Condition.cs
@@ -277,7 +277,7 @@ public static bool HasConsecutiveCharacters(string value, char character, int le
public static bool IsBase64(string value)
{
if (string.IsNullOrEmpty(value)) { return false; }
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
return System.Buffers.Text.Base64.IsValid(value.AsSpan());
#else
return Patterns.TryInvoke(() => Convert.FromBase64String(value), out _);
@@ -884,7 +884,7 @@ public static bool HasDifference(string first, string second, out string differe
{
first ??= string.Empty;
second ??= string.Empty;
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
return HasDifferenceCore(first, second, out difference);
#else
difference = string.Concat(second.Except(first));
@@ -892,7 +892,7 @@ public static bool HasDifference(string first, string second, out string differe
#endif
}
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
private static bool HasDifferenceCore(string first, string second, out string difference)
{
if (second.Length == 0)
diff --git a/src/Cuemon.Kernel/Convertible.cs b/src/Cuemon.Kernel/Convertible.cs
index f302a42f5..0dbd1893c 100644
--- a/src/Cuemon.Kernel/Convertible.cs
+++ b/src/Cuemon.Kernel/Convertible.cs
@@ -300,7 +300,7 @@ public static byte[] GetBytes(long input, Action setup = null)
/// A byte array that represents .
public static byte[] GetBytes(sbyte input, Action setup = null)
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
return GetBytesCore(input, x => BitConverter.GetBytes((short)x), setup);
#else
return GetBytesCore(input, x => BitConverter.GetBytes(x), setup);
diff --git a/src/Cuemon.Core/DateSpan.cs b/src/Cuemon.Kernel/DateSpan.cs
similarity index 98%
rename from src/Cuemon.Core/DateSpan.cs
rename to src/Cuemon.Kernel/DateSpan.cs
index 160b2c2ac..06b958334 100644
--- a/src/Cuemon.Core/DateSpan.cs
+++ b/src/Cuemon.Kernel/DateSpan.cs
@@ -1,8 +1,7 @@
-using System;
+using System;
using System.Globalization;
using System.Linq;
using Cuemon.Collections.Generic;
-using Cuemon.Security;
namespace Cuemon;
///
@@ -14,8 +13,8 @@ namespace Cuemon;
private readonly DateTime _upper;
private readonly Calendar _calendar;
private readonly ulong _calendarId;
- private static readonly ulong Hash = (ulong)new FowlerNollVo64().OffsetBasis;
- private static readonly ulong Prime = (ulong)new FowlerNollVo64().Prime;
+ private const ulong Hash = 14695981039346656037;
+ private const ulong Prime = 1099511628211;
///
/// Initializes a new instance of the structure with a default value set to .
@@ -217,7 +216,7 @@ public int GetWeeks()
/// Returns a hash code for this instance.
///
///
- /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
+ /// A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table.
///
public override int GetHashCode()
{
@@ -322,7 +321,7 @@ public static DateSpan Parse(string start, string end, CultureInfo culture)
/// Converts the value of the current object to its equivalent string representation.
///
///
- /// The representation of the current value.
+ /// The representation of the current value.
///
/// The returned string has the following format: y*:MM:dd:hh:mm:ss.f*, where y* is the actual calculated years and f* is the actual calculated milliseconds.
public override string ToString()
diff --git a/src/Cuemon.Core/DateTimeRange.cs b/src/Cuemon.Kernel/DateTimeRange.cs
similarity index 100%
rename from src/Cuemon.Core/DateTimeRange.cs
rename to src/Cuemon.Kernel/DateTimeRange.cs
diff --git a/src/Cuemon.Core/DelimitedString.cs b/src/Cuemon.Kernel/DelimitedString.cs
similarity index 100%
rename from src/Cuemon.Core/DelimitedString.cs
rename to src/Cuemon.Kernel/DelimitedString.cs
diff --git a/src/Cuemon.Core/DelimitedStringOptions.cs b/src/Cuemon.Kernel/DelimitedStringOptions.cs
similarity index 100%
rename from src/Cuemon.Core/DelimitedStringOptions.cs
rename to src/Cuemon.Kernel/DelimitedStringOptions.cs
diff --git a/src/Cuemon.Kernel/Disposable.cs b/src/Cuemon.Kernel/Disposable.cs
index 9a5d01376..bb04b77fa 100644
--- a/src/Cuemon.Kernel/Disposable.cs
+++ b/src/Cuemon.Kernel/Disposable.cs
@@ -7,7 +7,7 @@ namespace Cuemon;
///
public abstract class Disposable : IDisposable
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
private readonly System.Threading.Lock _lock = new();
#else
private readonly object _lock = new();
diff --git a/src/Cuemon.Core/FormattingOptions.cs b/src/Cuemon.Kernel/FormattingOptions.cs
similarity index 100%
rename from src/Cuemon.Core/FormattingOptions.cs
rename to src/Cuemon.Kernel/FormattingOptions.cs
diff --git a/src/Cuemon.Kernel/GlobalSuppressions.cs b/src/Cuemon.Kernel/GlobalSuppressions.cs
index 7ce0509d8..00947b8da 100644
--- a/src/Cuemon.Kernel/GlobalSuppressions.cs
+++ b/src/Cuemon.Kernel/GlobalSuppressions.cs
@@ -5,5 +5,7 @@
using System.Diagnostics.CodeAnalysis;
+[assembly: SuppressMessage("Major Code Smell", "S3881:\"IDisposable\" should be implemented correctly", Justification = "Dispose(bool) is intentionally non-virtual to centralize disposal state, synchronization, and cleanup exception handling; derived classes extend cleanup through OnDisposeManagedResources and OnDisposeUnmanagedResources.", Scope = "type", Target = "~T:Cuemon.Disposable")]
+[assembly: SuppressMessage("Globalization", "CA1304:Specify CultureInfo", Justification = "Delegates to the overload that explicitly uses CultureInfo.InvariantCulture; callers can specify a culture through the three-argument overload.", Scope = "member", Target = "~M:Cuemon.DateSpan.Parse(System.String)~Cuemon.DateSpan")]
[assembly: SuppressMessage("Style", "IDE0130:Namespace does not match folder structure", Justification = "By design.", Scope = "namespace", Target = "~N:System.Runtime.CompilerServices")]
[assembly: SuppressMessage("Style", "IDE0130:Namespace does not match folder structure", Justification = "By design.", Scope = "namespace", Target = "~N:Cuemon.IO")]
diff --git a/src/Cuemon.Kernel/Patterns.cs b/src/Cuemon.Kernel/Patterns.cs
index 129545cb4..0e1df96b4 100644
--- a/src/Cuemon.Kernel/Patterns.cs
+++ b/src/Cuemon.Kernel/Patterns.cs
@@ -148,9 +148,7 @@ public static Action ConfigureExchange(Action
+ initializer ??= (i, o) =>
{
var match = false;
var typeOfInput = typeof(TSource);
@@ -172,7 +170,6 @@ public static Action ConfigureExchange(Action pi.Name))}) with {nameof(TResult)} ({string.Join(", ", ops.Select(pi => pi.Name))}); no match on public read-write properties."));
}
};
- }
return oo => initializer(io, oo);
}
diff --git a/src/Cuemon.Core/Range.cs b/src/Cuemon.Kernel/Range.cs
similarity index 100%
rename from src/Cuemon.Core/Range.cs
rename to src/Cuemon.Kernel/Range.cs
diff --git a/src/Cuemon.Kernel/Threading/Awaiter.cs b/src/Cuemon.Kernel/Threading/Awaiter.cs
index 32535d265..7b47817be 100644
--- a/src/Cuemon.Kernel/Threading/Awaiter.cs
+++ b/src/Cuemon.Kernel/Threading/Awaiter.cs
@@ -134,7 +134,7 @@ private static bool TryGetRetryDelay(long startedAt, AsyncRunOptions options, in
private static TimeSpan GetElapsedTime(long startedAt)
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
return Stopwatch.GetElapsedTime(startedAt);
#else
var elapsedTimestamp = Stopwatch.GetTimestamp() - startedAt;
diff --git a/src/Cuemon.Core/TimeRange.cs b/src/Cuemon.Kernel/TimeRange.cs
similarity index 67%
rename from src/Cuemon.Core/TimeRange.cs
rename to src/Cuemon.Kernel/TimeRange.cs
index 71efb84c4..cbca85f12 100644
--- a/src/Cuemon.Core/TimeRange.cs
+++ b/src/Cuemon.Kernel/TimeRange.cs
@@ -12,11 +12,8 @@ public class TimeRange : Range
///
/// The start of a time range.
/// The end of a time range.
- public TimeRange(TimeSpan start, TimeSpan end) : this(start, end, () => end.Subtract(start))
- {
- }
-
- internal TimeRange(TimeSpan start, TimeSpan end, Func duration) : base(start, end, duration)
+ /// A function delegate that returns the duration of the time range. If not provided, the duration is calculated as the difference between and .
+ public TimeRange(TimeSpan start, TimeSpan end, Func duration = null) : base(start, end, duration ?? (() => end.Subtract(start)))
{
}
diff --git a/src/Cuemon.Core/TimeUnit.cs b/src/Cuemon.Kernel/TimeUnit.cs
similarity index 100%
rename from src/Cuemon.Core/TimeUnit.cs
rename to src/Cuemon.Kernel/TimeUnit.cs
diff --git a/src/Cuemon.Kernel/Validator.cs b/src/Cuemon.Kernel/Validator.cs
index 38b61476b..0882b0c5d 100644
--- a/src/Cuemon.Kernel/Validator.cs
+++ b/src/Cuemon.Kernel/Validator.cs
@@ -1183,7 +1183,7 @@ public static void ThrowWhen(Action> condi
private static bool ContainsAny(string argument, char[] characters, StringComparison comparison)
{
if (argument == null) { return false; }
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
var span = argument.AsSpan();
Span candidate = stackalloc char[1];
for (var j = 0; j < characters.Length; j++)
diff --git a/src/Cuemon.Net/GlobalSuppressions.cs b/src/Cuemon.Net/GlobalSuppressions.cs
index 5dd8343eb..a65746b5d 100644
--- a/src/Cuemon.Net/GlobalSuppressions.cs
+++ b/src/Cuemon.Net/GlobalSuppressions.cs
@@ -7,7 +7,6 @@
[assembly: SuppressMessage("Major Code Smell", "S3925:\"ISerializable\" should be implemented correctly", Justification = "PlatformNotSupportedException", Scope = "type", Target = "~T:Cuemon.Net.QueryStringCollection")]
[assembly: SuppressMessage("Critical Code Smell", "S3776:Cognitive Complexity of methods should not be too high", Justification = "https://github.com/mono/mono/blob/da11592cbea4269971f4b1f9624769a85cc10660/mcs/class/System.Web/System.Web/HttpUtility.cs", Scope = "member", Target = "~M:Cuemon.Net.StringDecoratorExtensions.UrlDecode(Cuemon.IDecorator{System.String},System.Action{Cuemon.Text.EncodingOptions})~System.String")]
-[assembly: SuppressMessage("Usage", "CA2249:Consider using 'string.Contains' instead of 'string.IndexOf'", Justification = "False-Positive. Contains does not support char.", Scope = "member", Target = "~M:Cuemon.Net.StringDecoratorExtensions.UrlDecode(Cuemon.IDecorator{System.String},System.Action{Cuemon.Text.EncodingOptions})~System.String")]
[assembly: SuppressMessage("Major Bug", "S2259:Null pointers should not be dereferenced", Justification = "False-Positive; if hasUtcLastModified is false, hasEntityTag has to be true - otherwise an exception is thrown.", Scope = "member", Target = "~M:Cuemon.Net.Http.HttpWatcher.FetchUsingHttpHeadAsync(Cuemon.Net.Http.HttpManager)~System.Threading.Tasks.Task")]
[assembly: SuppressMessage("Minor Code Smell", "S3236:Caller information arguments should not be provided explicitly", Justification = "By design.", Scope = "member", Target = "~M:Cuemon.Net.Mail.MailDistributor.SendOneAsync(System.Net.Mail.MailMessage,System.Func{System.Net.Mail.MailMessage,System.Boolean})~System.Threading.Tasks.Task")]
[assembly: SuppressMessage("Minor Code Smell", "S3236:Caller information arguments should not be provided explicitly", Justification = "By design.", Scope = "member", Target = "~M:Cuemon.Net.Http.HttpManager.#ctor(System.Action{Cuemon.Net.Http.HttpManagerOptions})")]
diff --git a/src/Cuemon.Resilience/GlobalSuppressions.cs b/src/Cuemon.Resilience/GlobalSuppressions.cs
index c98996fbf..71c5feb05 100644
--- a/src/Cuemon.Resilience/GlobalSuppressions.cs
+++ b/src/Cuemon.Resilience/GlobalSuppressions.cs
@@ -9,7 +9,6 @@
[assembly: SuppressMessage("Major Code Smell", "S1854:Unused assignments should be removed", Justification = "False-positive; inside try block.", Scope = "member", Target = "~M:Cuemon.Resilience.TransientOperation.WithFuncCore``2(Cuemon.FuncFactory{``0,``1},System.Action{Cuemon.Resilience.TransientOperationOptions})~``1")]
[assembly: SuppressMessage("Major Code Smell", "S1854:Unused assignments should be removed", Justification = "False-positive.", Scope = "member", Target = "~M:Cuemon.Resilience.ActionTransientWorker.ResilientAction(System.Action)")]
[assembly: SuppressMessage("Major Code Smell", "S1854:Unused assignments should be removed", Justification = "False-positive.", Scope = "member", Target = "~M:Cuemon.Resilience.FuncTransientWorker`1.ResilientFunc(System.Func{`0})~`0")]
-[assembly: SuppressMessage("Major Code Smell", "S3925:\"ISerializable\" should be implemented correctly", Justification = "MethodBase and Type are not serializable; hence the workaround.", Scope = "type", Target = "~T:Cuemon.Resilience.TransientFaultEvidence")]
[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; generic typed parameters.", Scope = "member", Target = "~M:Cuemon.Resilience.TransientOperation.WithAction``4(System.Action{``0,``1,``2,``3},``0,``1,``2,``3,System.Action{Cuemon.Resilience.TransientOperationOptions})")]
[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; generic typed parameters.", Scope = "member", Target = "~M:Cuemon.Resilience.TransientOperation.WithAction``5(System.Action{``0,``1,``2,``3,``4},``0,``1,``2,``3,``4,System.Action{Cuemon.Resilience.TransientOperationOptions})")]
[assembly: SuppressMessage("Major Code Smell", "S2436:Types and methods should not have too many generic parameters", Justification = "By design; generic typed parameters.", Scope = "member", Target = "~M:Cuemon.Resilience.TransientOperation.WithFunc``4(System.Func{``0,``1,``2,``3},``0,``1,``2,System.Action{Cuemon.Resilience.TransientOperationOptions})~``3")]
diff --git a/src/Cuemon.Resilience/Transient.cs b/src/Cuemon.Resilience/Transient.cs
index c412b40b1..35a10f54d 100644
--- a/src/Cuemon.Resilience/Transient.cs
+++ b/src/Cuemon.Resilience/Transient.cs
@@ -7,7 +7,7 @@
namespace Cuemon.Resilience;
internal abstract class Transient where TOptions : TransientOperationOptions, new()
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
protected readonly System.Threading.Lock _lock = new();
#else
protected readonly object _lock = new();
diff --git a/src/Cuemon.Security.Cryptography/GlobalSuppressions.cs b/src/Cuemon.Security.Cryptography/GlobalSuppressions.cs
index cdbcbcd15..c7a4765a2 100644
--- a/src/Cuemon.Security.Cryptography/GlobalSuppressions.cs
+++ b/src/Cuemon.Security.Cryptography/GlobalSuppressions.cs
@@ -1,8 +1,8 @@
-// This file is used by Code Analysis to maintain SuppressMessage
+// This file is used by Code Analysis to maintain SuppressMessage
// attributes that are applied to this project.
// Project-level suppressions either have no target or are given
// a specific target and scoped to a namespace, type, member, etc.
using System.Diagnostics.CodeAnalysis;
-[assembly: SuppressMessage("Reliability", "CA2022:Avoid inexact read with 'Stream.Read'", Justification = "Worked since implementation; only method compatible with netstandard2.0.", Scope = "member", Target = "~M:Cuemon.Security.Cryptography.AesCryptor.CryptoTransformCore(System.Byte[],Cuemon.Security.Cryptography.AesCryptor.AesMode,System.Action{Cuemon.Security.Cryptography.AesCryptorOptions})~System.Byte[]")]
+[assembly: SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Preserves the public API name and follows the SHA naming convention used by System.Security.Cryptography.", Scope = "type", Target = "~T:Cuemon.Security.Cryptography.SHA512256")]
diff --git a/src/Cuemon.Security.Cryptography/SHA512256.cs b/src/Cuemon.Security.Cryptography/SHA512256.cs
index 450a86b21..249a444fa 100644
--- a/src/Cuemon.Security.Cryptography/SHA512256.cs
+++ b/src/Cuemon.Security.Cryptography/SHA512256.cs
@@ -1,4 +1,4 @@
-// -----------------------------------------------------------------------------
+// -----------------------------------------------------------------------------
// SHA512/256 Implementation for .NET - Cuemon.Security.Cryptography
// -----------------------------------------------------------------------------
// This implementation provides a pure .NET version of SHA-512/256
@@ -67,9 +67,9 @@ public sealed class SHA512256 : HashAlgorithm
0x2B0199FC2C85B8AA, 0x0EB72DDC81C52CA2
};
- private ulong[] _H = new ulong[8];
- private ulong[] _W = new ulong[80];
- private byte[] _buffer = new byte[BlockSize];
+ private readonly ulong[] _H = new ulong[8];
+ private readonly ulong[] _W = new ulong[80];
+ private readonly byte[] _buffer = new byte[BlockSize];
private int _bufferPos;
private ulong _bitCountHigh;
private ulong _bitCountLow;
diff --git a/src/Cuemon.Xml/Serialization/Formatters/XmlFormatterOptions.cs b/src/Cuemon.Xml/Serialization/Formatters/XmlFormatterOptions.cs
index a48bd75c7..ff175063d 100644
--- a/src/Cuemon.Xml/Serialization/Formatters/XmlFormatterOptions.cs
+++ b/src/Cuemon.Xml/Serialization/Formatters/XmlFormatterOptions.cs
@@ -13,7 +13,7 @@ namespace Cuemon.Xml.Serialization.Formatters;
///
public class XmlFormatterOptions : IExceptionDescriptorOptions, IContentNegotiation, IValidatableParameterObject
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
private readonly System.Threading.Lock _lock = new();
#else
private readonly object _lock = new();
diff --git a/test/Cuemon.AspNetCore.Authentication.Tests/Cuemon.AspNetCore.Authentication.Tests.csproj b/test/Cuemon.AspNetCore.Authentication.Tests/Cuemon.AspNetCore.Authentication.Tests.csproj
index 3c085ffa8..1596bc2ca 100644
--- a/test/Cuemon.AspNetCore.Authentication.Tests/Cuemon.AspNetCore.Authentication.Tests.csproj
+++ b/test/Cuemon.AspNetCore.Authentication.Tests/Cuemon.AspNetCore.Authentication.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.AspNetCore.Authentication
diff --git a/test/Cuemon.AspNetCore.FunctionalTests/Cuemon.AspNetCore.FunctionalTests.csproj b/test/Cuemon.AspNetCore.FunctionalTests/Cuemon.AspNetCore.FunctionalTests.csproj
index cbcfaa50e..59dfc0258 100644
--- a/test/Cuemon.AspNetCore.FunctionalTests/Cuemon.AspNetCore.FunctionalTests.csproj
+++ b/test/Cuemon.AspNetCore.FunctionalTests/Cuemon.AspNetCore.FunctionalTests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.AspNetCore
diff --git a/test/Cuemon.AspNetCore.Mvc.FunctionalTests/Cuemon.AspNetCore.Mvc.FunctionalTests.csproj b/test/Cuemon.AspNetCore.Mvc.FunctionalTests/Cuemon.AspNetCore.Mvc.FunctionalTests.csproj
index 858b203c7..e6cc95e60 100644
--- a/test/Cuemon.AspNetCore.Mvc.FunctionalTests/Cuemon.AspNetCore.Mvc.FunctionalTests.csproj
+++ b/test/Cuemon.AspNetCore.Mvc.FunctionalTests/Cuemon.AspNetCore.Mvc.FunctionalTests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.AspNetCore.Mvc
diff --git a/test/Cuemon.AspNetCore.Mvc.Tests/Cuemon.AspNetCore.Mvc.Tests.csproj b/test/Cuemon.AspNetCore.Mvc.Tests/Cuemon.AspNetCore.Mvc.Tests.csproj
index 4595db461..2e0820671 100644
--- a/test/Cuemon.AspNetCore.Mvc.Tests/Cuemon.AspNetCore.Mvc.Tests.csproj
+++ b/test/Cuemon.AspNetCore.Mvc.Tests/Cuemon.AspNetCore.Mvc.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.AspNetCore.Mvc
diff --git a/test/Cuemon.AspNetCore.Razor.TagHelpers.Tests/Cuemon.AspNetCore.Razor.TagHelpers.Tests.csproj b/test/Cuemon.AspNetCore.Razor.TagHelpers.Tests/Cuemon.AspNetCore.Razor.TagHelpers.Tests.csproj
index 85f963dca..69dc604f6 100644
--- a/test/Cuemon.AspNetCore.Razor.TagHelpers.Tests/Cuemon.AspNetCore.Razor.TagHelpers.Tests.csproj
+++ b/test/Cuemon.AspNetCore.Razor.TagHelpers.Tests/Cuemon.AspNetCore.Razor.TagHelpers.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.AspNetCore.Razor.TagHelpers
diff --git a/test/Cuemon.AspNetCore.Tests/Cuemon.AspNetCore.Tests.csproj b/test/Cuemon.AspNetCore.Tests/Cuemon.AspNetCore.Tests.csproj
index 1c681bceb..e3e793a31 100644
--- a/test/Cuemon.AspNetCore.Tests/Cuemon.AspNetCore.Tests.csproj
+++ b/test/Cuemon.AspNetCore.Tests/Cuemon.AspNetCore.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.AspNetCore
diff --git a/test/Cuemon.Core.Tests/Assets/ClampOptions.cs b/test/Cuemon.Core.Tests/Assets/ClampOptions.cs
index 2de247067..d932c8d67 100644
--- a/test/Cuemon.Core.Tests/Assets/ClampOptions.cs
+++ b/test/Cuemon.Core.Tests/Assets/ClampOptions.cs
@@ -15,7 +15,7 @@ public int MaxConcurrentJobs
get => _maxConcurrentJobs;
set
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
_maxConcurrentJobs = Math.Clamp(value, 1, byte.MaxValue);
#else
_maxConcurrentJobs = Clamp(value, 1, byte.MaxValue);
diff --git a/test/Cuemon.Core.Tests/Assets/UnmanagedDisposable.cs b/test/Cuemon.Core.Tests/Assets/UnmanagedDisposable.cs
index a19a4d14f..39d16ae1a 100644
--- a/test/Cuemon.Core.Tests/Assets/UnmanagedDisposable.cs
+++ b/test/Cuemon.Core.Tests/Assets/UnmanagedDisposable.cs
@@ -27,7 +27,7 @@ public delegate IntPtr CreateFileDelegate(string lpFileName,
public UnmanagedDisposable()
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
if (NativeLibrary.TryLoad("kernel32.dll", GetType().Assembly, DllImportSearchPath.System32, out _libHandle))
@@ -84,7 +84,7 @@ protected override void OnDisposeManagedResources()
protected override void OnDisposeUnmanagedResources()
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
if (Environment.OSVersion.Platform == PlatformID.Win32NT)
{
if (_handle != IntPtr.Zero)
diff --git a/test/Cuemon.Core.Tests/Reflection/AssemblyContextOptionsTest.cs b/test/Cuemon.Core.Tests/Reflection/AssemblyContextOptionsTest.cs
index 03d32e5d6..1acab1d61 100644
--- a/test/Cuemon.Core.Tests/Reflection/AssemblyContextOptionsTest.cs
+++ b/test/Cuemon.Core.Tests/Reflection/AssemblyContextOptionsTest.cs
@@ -116,7 +116,7 @@ public void DefaultAssemblyFilter_ShouldReturnSameResult_WhenCalledMultipleTimes
Assert.Equal(second, third);
}
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
[Fact]
public void DefaultAssemblyFilter_ShouldIncludeNonSystemNonMicrosoftAssemblies()
{
diff --git a/test/Cuemon.Core.Tests/Reflection/AssemblyDecoratorExtensionsTest.cs b/test/Cuemon.Core.Tests/Reflection/AssemblyDecoratorExtensionsTest.cs
index c060fcf16..3e0a0b259 100644
--- a/test/Cuemon.Core.Tests/Reflection/AssemblyDecoratorExtensionsTest.cs
+++ b/test/Cuemon.Core.Tests/Reflection/AssemblyDecoratorExtensionsTest.cs
@@ -40,7 +40,7 @@ public void GetTypes_ShouldReturnAllTypesFromCuemonCore()
TestOutput.WriteLine(disposableTypes.ToDelimitedString());
TestOutput.WriteLine(threadingTypes.ToDelimitedString());
- Assert.InRange(allTypesCount, 250, 300); // range because of tooling on CI adding dynamic types and high range of refactoring
+ Assert.InRange(allTypesCount, 240, 290); // range because of tooling on CI adding dynamic types and high range of refactoring
Assert.Equal(3, disposableTypesCount);
Assert.Equal(4, configurationTypesCount);
}
@@ -53,7 +53,7 @@ public void GetAssemblyVersion_ShouldReturnAssemblyVersion()
TestOutput.WriteLine(v.ToString());
- Assert.Equal("10.0.0.0", v.ToString());
+ Assert.Equal("11.0.0.0", v.ToString());
Assert.False(v.HasAlphanumericVersion);
Assert.False(v.IsSemanticVersion());
}
diff --git a/test/Cuemon.Core.Tests/Reflection/TargetFrameworkMonikerTest.cs b/test/Cuemon.Core.Tests/Reflection/TargetFrameworkMonikerTest.cs
index c202b3ffe..fb3de508a 100644
--- a/test/Cuemon.Core.Tests/Reflection/TargetFrameworkMonikerTest.cs
+++ b/test/Cuemon.Core.Tests/Reflection/TargetFrameworkMonikerTest.cs
@@ -165,10 +165,10 @@ private static Assembly CreateDynamicAssembly(string frameworkName)
private static string GetExpectedTargetFrameworkMoniker()
{
-#if NET10_0
+#if NET11_0
+ return "net11.0";
+#elif NET10_0
return "net10.0";
-#elif NET9_0
- return "net9.0";
#elif NET48
return "net48";
#else
diff --git a/test/Cuemon.Core.Tests/Text/ParserFactoryTest.cs b/test/Cuemon.Core.Tests/Text/ParserFactoryTest.cs
index 01da6f157..af364d4e1 100644
--- a/test/Cuemon.Core.Tests/Text/ParserFactoryTest.cs
+++ b/test/Cuemon.Core.Tests/Text/ParserFactoryTest.cs
@@ -81,7 +81,7 @@ public void ParserFactory_ShouldConvertString_ToTypeConverterImplementation()
var sg = Guid.NewGuid();
Assert.Equal(sg, ParserFactory.FromObject().Parse(sg.ToString()));
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
var v = new Version();
Assert.Equal(v, ParserFactory.FromObject().Parse(v.ToString(), typeof(Version)));
#endif
diff --git a/test/Cuemon.Core.Tests/Threading/AsyncOptionsTest.cs b/test/Cuemon.Core.Tests/Threading/AsyncOptionsTest.cs
deleted file mode 100644
index 585ef5afb..000000000
--- a/test/Cuemon.Core.Tests/Threading/AsyncOptionsTest.cs
+++ /dev/null
@@ -1,41 +0,0 @@
-using System;
-using System.Threading;
-using System.Threading.Tasks;
-using Cuemon.Extensions;
-using Codebelt.Extensions.Xunit;
-using Xunit;
-
-namespace Cuemon.Threading;
-public class AsyncOptionsTest : Test
-{
- public AsyncOptionsTest(ITestOutputHelper output) : base(output)
- {
- }
-
- [Fact]
- public void Ctor_ShouldInitializeCancellationTokenToDefault()
- {
- var sut = new AsyncOptions();
-
- Assert.Equal(sut.CancellationToken, CancellationToken.None);
- }
-
- [Fact]
- public async Task AsyncOptions_ShouldThrow_OperationCanceledException()
- {
- var cts = new CancellationTokenSource();
- cts.CancelAfter(250);
- await Assert.ThrowsAsync(async () => await SomeMethod(o => o.CancellationToken = cts.Token));
- }
-
- private async Task SomeMethod(Action setup)
- {
- var options = setup.Configure();
- while (!options.CancellationToken.IsCancellationRequested)
- {
- await Task.Delay(50);
- }
- options.CancellationToken.ThrowIfCancellationRequested();
- TestOutput.WriteLine(options.CancellationToken.IsCancellationRequested.ToString());
- }
-}
diff --git a/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs b/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs
deleted file mode 100644
index 72916adfd..000000000
--- a/test/Cuemon.Core.Tests/Threading/AwaiterTest.cs
+++ /dev/null
@@ -1,542 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using Codebelt.Extensions.Xunit;
-using Xunit;
-
-namespace Cuemon.Threading;
-public class AsyncRunOptionsTest : Test
-{
- public AsyncRunOptionsTest(ITestOutputHelper output) : base(output)
- {
- }
-
- [Fact]
- public void Constructor_ShouldInitializeDefaults()
- {
- var sut = new AsyncRunOptions();
-
- Assert.Equal(TimeSpan.FromSeconds(5), sut.Timeout);
- Assert.Equal(TimeSpan.FromMilliseconds(100), sut.Delay);
- Assert.Equal(0, sut.MaximumAttempts);
- Assert.False(sut.CancellationToken.CanBeCanceled);
- }
-
- [Fact]
- public void ValidateOptions_ShouldThrowArgumentException_WhenTimeoutIsNegative()
- {
- var sut = new AsyncRunOptions
- {
- Timeout = TimeSpan.FromMilliseconds(-1)
- };
-
- var ex = Assert.Throws(() => Validator.ThrowIfInvalidOptions(sut));
-
- Assert.Equal("sut", ex.ParamName);
- Assert.IsType(ex.InnerException);
- Assert.Contains("Timeout cannot be negative.", ex.InnerException.Message);
- }
-
- [Fact]
- public void ValidateOptions_ShouldThrowArgumentException_WhenDelayIsNegative()
- {
- var sut = new AsyncRunOptions
- {
- Delay = TimeSpan.FromMilliseconds(-1)
- };
-
- var ex = Assert.Throws(() => Validator.ThrowIfInvalidOptions(sut));
-
- Assert.Equal("sut", ex.ParamName);
- Assert.IsType(ex.InnerException);
- Assert.Contains("Delay cannot be negative.", ex.InnerException.Message);
- }
-
- [Fact]
- public void ValidateOptions_ShouldAllowZeroDelay_WhenMaximumAttemptsIsPositive()
- {
- var sut = new AsyncRunOptions
- {
- Delay = TimeSpan.Zero,
- MaximumAttempts = 1
- };
-
- Validator.ThrowIfInvalidOptions(sut);
-
- Assert.Equal(1, sut.MaximumAttempts);
- }
-
- [Fact]
- public void ValidateOptions_ShouldThrowArgumentException_WhenMaximumAttemptsIsNegative()
- {
- var sut = new AsyncRunOptions
- {
- MaximumAttempts = -1
- };
-
- var ex = Assert.Throws(() => Validator.ThrowIfInvalidOptions(sut));
-
- Assert.Equal("sut", ex.ParamName);
- Assert.IsType(ex.InnerException);
- Assert.Contains("MaximumAttempts cannot be negative.", ex.InnerException.Message);
- }
-
- [Fact]
- public void ValidateOptions_ShouldThrowArgumentException_WhenDelayIsZeroAndMaximumAttemptsIsNotPositive()
- {
- var sut = new AsyncRunOptions
- {
- Delay = TimeSpan.Zero
- };
-
- var ex = Assert.Throws(() => Validator.ThrowIfInvalidOptions(sut));
-
- Assert.Equal("sut", ex.ParamName);
- Assert.IsType(ex.InnerException);
- Assert.Contains("MaximumAttempts must be configured with a positive value", ex.InnerException.Message);
- }
-}
-
-public class AwaiterTest : Test
-{
- private static readonly TimeSpan AttemptDuration = TimeSpan.FromMilliseconds(20);
- private static readonly TimeSpan RetryDelay = TimeSpan.FromMilliseconds(20);
-
- public AwaiterTest(ITestOutputHelper output) : base(output)
- {
- }
-
- [Fact]
- public void RunUntilSuccessfulOrTimeoutAsync_ShouldThrowArgumentNullException_WhenMethodIsNullBeforeSetupIsEvaluated()
- {
- var setupCalls = 0;
-
- Assert.Throws((Action)(() => Awaiter.RunUntilSuccessfulOrTimeoutAsync(null, o => { setupCalls++; })));
-
- Assert.Equal(0, setupCalls);
- }
-
- [Fact]
- public void RunUntilSuccessfulOrTimeoutAsync_ShouldThrowArgumentException_WhenSetupConfiguresInvalidOptions()
- {
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return Task.FromResult(new SuccessfulValue());
- }
-
- var ex = Assert.Throws((Action)(() => Awaiter.RunUntilSuccessfulOrTimeoutAsync(Method, o => { o.Timeout = TimeSpan.FromMilliseconds(-1); })));
-
- Assert.Equal("setup", ex.ParamName);
- Assert.Equal(0, callCount);
- Assert.IsType(ex.InnerException);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldThrowInvalidOperationException_WhenDelegateReturnsNullConditionalValue()
- {
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return Task.FromResult(null);
- }
-
- var ex = await Assert.ThrowsAsync(() => Run(Method, TimeSpan.FromSeconds(1), RetryDelay));
-
- Assert.Equal(1, callCount);
- Assert.Contains("null ConditionalValue", ex.Message);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnOriginalConditionalValue_WhenFirstAttemptSucceeds()
- {
- var expected = new SuccessfulValue();
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return Task.FromResult(expected);
- }
-
- var result = await Run(Method, TimeSpan.FromSeconds(1), RetryDelay);
-
- Assert.Same(expected, result);
- Assert.Equal(1, callCount);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldRetryAfterUnsuccessfulResultUntilSuccess()
- {
- var expected = new SuccessfulValue();
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return Task.FromResult(callCount == 1 ? new UnsuccessfulValue() : expected);
- }
-
- var result = await Run(Method, TimeSpan.FromSeconds(1), RetryDelay);
-
- Assert.Same(expected, result);
- Assert.Equal(2, callCount);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnDefaultUnsuccessful_WhenRepeatedResultsRemainUnsuccessfulUntilTimeout()
- {
- Task Method()
- {
- return Task.FromResult(new UnsuccessfulValue());
- }
-
- var unsuccessful = Assert.IsType(await Run(Method, TimeSpan.FromMilliseconds(80), RetryDelay));
-
- Assert.False(unsuccessful.Succeeded);
- Assert.Null(unsuccessful.Failure);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldRetryAfterExceptionUntilSuccess()
- {
- var expected = new SuccessfulValue();
- var failure = new InvalidOperationException("fail");
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- if (callCount == 1) { throw failure; }
- return Task.FromResult(expected);
- }
-
- var result = await Run(Method, TimeSpan.FromSeconds(1), RetryDelay);
-
- Assert.Same(expected, result);
- Assert.Null(result.Failure);
- Assert.Equal(2, callCount);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnSingleRetainedException_WhenTimeoutElapsesAfterCaughtException()
- {
- var expected = new InvalidOperationException("fail");
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return ThrowAfterAsync(expected, AttemptDuration);
- }
-
- var result = await Run(Method, TimeSpan.FromMilliseconds(5), RetryDelay);
-
- Assert.False(result.Succeeded);
- Assert.Same(expected, result.Failure);
- Assert.Equal(1, callCount);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnAggregateExceptionInEncounterOrder_WhenTimeoutElapsesAfterMultipleCaughtExceptions()
- {
- var first = new InvalidOperationException("first");
- var second = new ArgumentException("second");
- var third = new ApplicationException("third");
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- if (callCount == 1) { throw first; }
- if (callCount == 2) { throw second; }
- return ThrowAfterAsync(third, AttemptDuration);
- }
-
- var result = await Run(Method, TimeSpan.FromMilliseconds(10), TimeSpan.Zero, maximumAttempts: 3);
- var aggregate = Assert.IsType(result.Failure);
-
- Assert.False(result.Succeeded);
- Assert.Equal(3, callCount);
- Assert.Equal(3, aggregate.InnerExceptions.Count);
- Assert.Same(first, aggregate.InnerExceptions[0]);
- Assert.Same(second, aggregate.InnerExceptions[1]);
- Assert.Same(third, aggregate.InnerExceptions[2]);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldThrowOperationCanceledException_WhenCancellationIsRequestedBeforeInitialAttempt()
- {
- var cancellationSource = new CancellationTokenSource();
- cancellationSource.Cancel();
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return Task.FromResult(new SuccessfulValue());
- }
-
- var ex = await Assert.ThrowsAnyAsync(() => Run(Method, TimeSpan.FromSeconds(1), RetryDelay, cancellationToken: cancellationSource.Token));
-
- Assert.Equal(0, callCount);
- Assert.Equal(cancellationSource.Token, ex.CancellationToken);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldPropagateOperationCanceledException_WhenDelegateCancels()
- {
- var delegateSource = new CancellationTokenSource();
- delegateSource.Cancel();
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return Task.FromCanceled(delegateSource.Token);
- }
-
- var ex = await Assert.ThrowsAnyAsync(() => Run(Method, TimeSpan.FromSeconds(1), RetryDelay));
-
- Assert.Equal(1, callCount);
- Assert.Equal(delegateSource.Token, ex.CancellationToken);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldUseResolvedCancellationTokenForRetryDelay()
- {
- var attemptSource = new CancellationTokenSource();
- var delaySource = new CancellationTokenSource();
- var resolvedTokens = new Queue(new[] { attemptSource.Token, delaySource.Token });
- var attemptCompleted = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- attemptCompleted.TrySetResult(null);
- return Task.FromResult(new UnsuccessfulValue());
- }
-
- var task = Run(Method, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1), cancellationTokenProvider: () => resolvedTokens.Dequeue());
-
- await attemptCompleted.Task;
- await Task.Delay(TimeSpan.FromMilliseconds(30));
- delaySource.Cancel();
-
- var ex = await Assert.ThrowsAnyAsync(() => task);
-
- Assert.Equal(1, callCount);
- Assert.Equal(delaySource.Token, ex.CancellationToken);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldResolveCancellationTokenProviderBeforeEveryAttempt()
- {
- var activeSource = new CancellationTokenSource();
- var canceledSource = new CancellationTokenSource();
- canceledSource.Cancel();
- var resolvedTokens = new Queue(new[] { activeSource.Token, canceledSource.Token });
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return Task.FromResult(new UnsuccessfulValue());
- }
-
- var ex = await Assert.ThrowsAnyAsync(() => Run(Method, TimeSpan.FromSeconds(1), TimeSpan.Zero, maximumAttempts: 2, cancellationTokenProvider: () => resolvedTokens.Dequeue()));
-
- Assert.Equal(1, callCount);
- Assert.Equal(canceledSource.Token, ex.CancellationToken);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldSucceedOnFinalAllowedAttempt_WhenDelayIsZero()
- {
- var expected = new SuccessfulValue();
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return Task.FromResult(callCount < 3 ? new UnsuccessfulValue() : expected);
- }
-
- var result = await Run(Method, TimeSpan.FromSeconds(1), TimeSpan.Zero, maximumAttempts: 3);
-
- Assert.Same(expected, result);
- Assert.Equal(3, callCount);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessfulAfterMaximumAttempts_WhenDelayIsZero()
- {
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return Task.FromResult(new UnsuccessfulValue());
- }
-
- var result = await Run(Method, TimeSpan.FromSeconds(1), TimeSpan.Zero, maximumAttempts: 3);
-
- Assert.False(result.Succeeded);
- Assert.Null(result.Failure);
- Assert.Equal(3, callCount);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnAggregateExceptionAfterMaximumAttempts_WhenDelayIsZeroAndMultipleExceptionsAreCaught()
- {
- var first = new InvalidOperationException("first");
- var second = new ArgumentException("second");
- var third = new ApplicationException("third");
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- if (callCount == 1) { throw first; }
- if (callCount == 2) { throw second; }
- throw third;
- }
-
- var result = await Run(Method, TimeSpan.FromSeconds(1), TimeSpan.Zero, maximumAttempts: 3);
- var aggregate = Assert.IsType(result.Failure);
-
- Assert.False(result.Succeeded);
- Assert.Equal(3, callCount);
- Assert.Equal(3, aggregate.InnerExceptions.Count);
- Assert.Same(first, aggregate.InnerExceptions[0]);
- Assert.Same(second, aggregate.InnerExceptions[1]);
- Assert.Same(third, aggregate.InnerExceptions[2]);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldAllowExactlyOneAttempt_WhenTimeoutIsZero()
- {
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return Task.FromResult(new UnsuccessfulValue());
- }
-
- var result = await Run(Method, TimeSpan.Zero, RetryDelay);
-
- Assert.False(result.Succeeded);
- Assert.Null(result.Failure);
- Assert.Equal(1, callCount);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldNotRetryAfterTimeoutElapses()
- {
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return ReturnAfterAsync(new UnsuccessfulValue(), AttemptDuration);
- }
-
- var result = await Run(Method, TimeSpan.FromMilliseconds(5), TimeSpan.FromMilliseconds(200));
-
- Assert.False(result.Succeeded);
- Assert.Null(result.Failure);
- Assert.Equal(1, callCount);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldCapDelayToRemainingTimeoutWindow()
- {
- var callCount = 0;
- using var cancellationSource = new CancellationTokenSource();
- cancellationSource.CancelAfter(TimeSpan.FromSeconds(2));
-
- Task Method()
- {
- callCount++;
- return Task.FromResult(new UnsuccessfulValue());
- }
-
- var result = await Run(Method, TimeSpan.FromMilliseconds(40), TimeSpan.FromSeconds(5), cancellationToken: cancellationSource.Token);
-
- Assert.False(result.Succeeded);
- Assert.Null(result.Failure);
- Assert.Equal(1, callCount);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnSuccess_WhenInFlightAttemptCompletesAfterTimeout()
- {
- var expected = new SuccessfulValue();
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return ReturnAfterAsync(expected, AttemptDuration);
- }
-
- var result = await Run(Method, TimeSpan.FromMilliseconds(5), RetryDelay);
-
- Assert.Same(expected, result);
- Assert.Equal(1, callCount);
- }
-
- [Fact]
- public async Task RunUntilSuccessfulOrTimeoutAsync_ShouldReturnUnsuccessful_WhenInFlightAttemptCompletesAfterTimeout()
- {
- var callCount = 0;
-
- Task Method()
- {
- callCount++;
- return ReturnAfterAsync(new UnsuccessfulValue(), AttemptDuration);
- }
-
- var result = await Run(Method, TimeSpan.FromMilliseconds(5), RetryDelay);
-
- Assert.False(result.Succeeded);
- Assert.Null(result.Failure);
- Assert.Equal(1, callCount);
- }
-
- private static Task Run(Func> method, TimeSpan timeout, TimeSpan delay, int maximumAttempts = 0, CancellationToken? cancellationToken = null, Func cancellationTokenProvider = null)
- {
- return Awaiter.RunUntilSuccessfulOrTimeoutAsync(method, Configure(timeout, delay, maximumAttempts, cancellationToken, cancellationTokenProvider));
- }
-
- private static Action Configure(TimeSpan timeout, TimeSpan delay, int maximumAttempts = 0, CancellationToken? cancellationToken = null, Func cancellationTokenProvider = null)
- {
- return o =>
- {
- o.Timeout = timeout;
- o.Delay = delay;
- o.MaximumAttempts = maximumAttempts;
- if (cancellationToken.HasValue) { o.CancellationToken = cancellationToken.Value; }
- if (cancellationTokenProvider != null) { o.CancellationTokenProvider = cancellationTokenProvider; }
- };
- }
-
- private static async Task ReturnAfterAsync(ConditionalValue result, TimeSpan delay)
- {
- await Task.Delay(delay).ConfigureAwait(false);
- return result;
- }
-
- private static async Task ThrowAfterAsync(Exception exception, TimeSpan delay)
- {
- await Task.Delay(delay).ConfigureAwait(false);
- throw exception;
- }
-}
diff --git a/test/Cuemon.Data.SqlClient.Tests/SqlDataManagerTest.cs b/test/Cuemon.Data.SqlClient.Tests/SqlDataManagerTest.cs
index 575f145ed..678772cf5 100644
--- a/test/Cuemon.Data.SqlClient.Tests/SqlDataManagerTest.cs
+++ b/test/Cuemon.Data.SqlClient.Tests/SqlDataManagerTest.cs
@@ -1,5 +1,4 @@
using System;
-using System.Data;
using Microsoft.Data.SqlClient;
using System.Linq;
using Cuemon.Collections.Generic;
@@ -7,7 +6,6 @@
using Cuemon.Extensions;
using Cuemon.Extensions.Data;
using Codebelt.Extensions.Xunit.Hosting;
-using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Xunit;
diff --git a/test/Cuemon.Data.Tests/DataManagerTest.cs b/test/Cuemon.Data.Tests/DataManagerTest.cs
index a65638619..dbfdce267 100644
--- a/test/Cuemon.Data.Tests/DataManagerTest.cs
+++ b/test/Cuemon.Data.Tests/DataManagerTest.cs
@@ -161,7 +161,7 @@ public void ExecuteScalarAsSByte_ShouldReturnTheFirstValueOfTheFirstRow()
public void ExecuteScalarAsDecimal_ShouldReturnTheFirstValueOfTheFirstRow()
{
var sut = _manager.ExecuteScalarAs("SELECT ListPrice, Size FROM Product WHERE ProductID > 780");
- Assert.Equal(2319.99m, sut);
+ Assert.Equal(2319.99m, decimal.Round(sut, 2));
Assert.IsType(sut);
}
@@ -328,7 +328,7 @@ public async Task ExecuteScalarAsSByteAsync_ShouldReturnTheFirstValueOfTheFirstR
public async Task ExecuteScalarAsDecimalAsync_ShouldReturnTheFirstValueOfTheFirstRow()
{
var sut = await _manager.ExecuteScalarAsAsync("SELECT ListPrice, Size FROM Product WHERE ProductID > 780");
- Assert.Equal(2319.99m, sut);
+ Assert.Equal(2319.99m, decimal.Round(sut, 2));
Assert.IsType(sut);
}
@@ -386,7 +386,7 @@ public override void ConfigureServices(IServiceCollection services)
{
o.LeaveConnectionOpen = true; // never release our connection as it will be closed and our in-mem database will be removed (for normal dbs - always leave false)
o.LeaveCommandOpen = true; // do not release our command as it will trigger errors from data readers (for normal dbs - always leave false)
- o.ConnectionString = "Data Source=InMemory;Mode=Memory;Cache=Shared";
+ o.ConnectionString = $"Data Source=InMemory-{Guid.NewGuid():N};Mode=Memory;Cache=Shared";
});
SqliteDatabase.Create(manager, TestOutput);
services.AddSingleton(manager);
diff --git a/test/Cuemon.Extensions.AspNetCore.Authentication.Tests/Cuemon.Extensions.AspNetCore.Authentication.Tests.csproj b/test/Cuemon.Extensions.AspNetCore.Authentication.Tests/Cuemon.Extensions.AspNetCore.Authentication.Tests.csproj
index 8dc114d1b..8aed2b0cc 100644
--- a/test/Cuemon.Extensions.AspNetCore.Authentication.Tests/Cuemon.Extensions.AspNetCore.Authentication.Tests.csproj
+++ b/test/Cuemon.Extensions.AspNetCore.Authentication.Tests/Cuemon.Extensions.AspNetCore.Authentication.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.Extensions.AspNetCore.Authentication
diff --git a/test/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.Tests/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.Tests.csproj b/test/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.Tests/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.Tests.csproj
index 354d7beba..c446fcda1 100644
--- a/test/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.Tests/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.Tests.csproj
+++ b/test/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.Tests/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.Extensions.AspNetCore.Mvc.Formatters.Text.Json
diff --git a/test/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.Tests/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.Tests.csproj b/test/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.Tests/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.Tests.csproj
index 2cbae3999..a1e513e9a 100644
--- a/test/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.Tests/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.Tests.csproj
+++ b/test/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.Tests/Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.Extensions.AspNetCore.Mvc.Formatters.Xml
diff --git a/test/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.Tests/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.Tests.csproj b/test/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.Tests/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.Tests.csproj
index cc5f43d91..10851956d 100644
--- a/test/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.Tests/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.Tests.csproj
+++ b/test/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.Tests/Cuemon.Extensions.AspNetCore.Mvc.RazorPages.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.Extensions.AspNetCore.Mvc.RazorPages
diff --git a/test/Cuemon.Extensions.AspNetCore.Mvc.Tests/Cuemon.Extensions.AspNetCore.Mvc.Tests.csproj b/test/Cuemon.Extensions.AspNetCore.Mvc.Tests/Cuemon.Extensions.AspNetCore.Mvc.Tests.csproj
index 38bbda6ac..ae56e6ac7 100644
--- a/test/Cuemon.Extensions.AspNetCore.Mvc.Tests/Cuemon.Extensions.AspNetCore.Mvc.Tests.csproj
+++ b/test/Cuemon.Extensions.AspNetCore.Mvc.Tests/Cuemon.Extensions.AspNetCore.Mvc.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.Extensions.AspNetCore.Mvc
true
diff --git a/test/Cuemon.Extensions.AspNetCore.Tests/Cuemon.Extensions.AspNetCore.Tests.csproj b/test/Cuemon.Extensions.AspNetCore.Tests/Cuemon.Extensions.AspNetCore.Tests.csproj
index d3e712352..1dbaf451c 100644
--- a/test/Cuemon.Extensions.AspNetCore.Tests/Cuemon.Extensions.AspNetCore.Tests.csproj
+++ b/test/Cuemon.Extensions.AspNetCore.Tests/Cuemon.Extensions.AspNetCore.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.Extensions.AspNetCore
diff --git a/test/Cuemon.Extensions.DependencyInjection.Tests/Cuemon.Extensions.DependencyInjection.Tests.csproj b/test/Cuemon.Extensions.DependencyInjection.Tests/Cuemon.Extensions.DependencyInjection.Tests.csproj
index 6f0d70187..9d07b1a0c 100644
--- a/test/Cuemon.Extensions.DependencyInjection.Tests/Cuemon.Extensions.DependencyInjection.Tests.csproj
+++ b/test/Cuemon.Extensions.DependencyInjection.Tests/Cuemon.Extensions.DependencyInjection.Tests.csproj
@@ -10,7 +10,7 @@
-
+
diff --git a/test/Cuemon.Extensions.DependencyInjection.Tests/ServiceCollectionExtensionsTest.cs b/test/Cuemon.Extensions.DependencyInjection.Tests/ServiceCollectionExtensionsTest.cs
index 1f986516a..006bbe896 100644
--- a/test/Cuemon.Extensions.DependencyInjection.Tests/ServiceCollectionExtensionsTest.cs
+++ b/test/Cuemon.Extensions.DependencyInjection.Tests/ServiceCollectionExtensionsTest.cs
@@ -5,7 +5,7 @@
using System.Threading;
using System.Threading.Tasks;
using Cuemon.Configuration;
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
using Cuemon.AspNetCore.Diagnostics;
using Cuemon.AspNetCore.Mvc.Filters.Diagnostics;
using Cuemon.Extensions.Text.Json.Formatters;
@@ -1327,7 +1327,7 @@ public void TryAdd_ShouldAddServiceToServiceCollectionUsingFactoryWithSpecifiedL
Assert.Null(sut9);
}
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
[Fact]
public void TryConfigure_ShouldAddConfigureOptions()
diff --git a/test/Cuemon.Extensions.Hosting.Tests/HostEnvironmentExtensionsTest.cs b/test/Cuemon.Extensions.Hosting.Tests/HostEnvironmentExtensionsTest.cs
index e4a7bcafa..52f85d271 100644
--- a/test/Cuemon.Extensions.Hosting.Tests/HostEnvironmentExtensionsTest.cs
+++ b/test/Cuemon.Extensions.Hosting.Tests/HostEnvironmentExtensionsTest.cs
@@ -22,7 +22,7 @@ public override void ConfigureServices(IServiceCollection services)
[Fact]
public void IsLocalDevelopment_VerifyEnvironmentEqualsLocalDevelopment()
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
Assert.True(Environment.IsLocalDevelopment());
Assert.False(Environment.IsProduction());
Assert.False(Environment.IsStaging());
@@ -39,7 +39,7 @@ public void IsLocalDevelopment_VerifyEnvironmentEqualsLocalDevelopment()
[Fact]
public void IsLocalDevelopment_VerifyEnvironmentIsNonProduction()
{
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
Assert.True(Environment.IsNonProduction());
Assert.False(Environment.IsProduction());
#else
diff --git a/test/Cuemon.Extensions.IO.Tests/StreamExtensionsTest.cs b/test/Cuemon.Extensions.IO.Tests/StreamExtensionsTest.cs
index 20fb23cfe..a1da16a71 100644
--- a/test/Cuemon.Extensions.IO.Tests/StreamExtensionsTest.cs
+++ b/test/Cuemon.Extensions.IO.Tests/StreamExtensionsTest.cs
@@ -217,7 +217,7 @@ public async Task ToEncodedStringAsync_ShouldConvertStreamToUnicodeEncodedString
Assert.Equal(636, sut6.Length);
}
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
[Fact]
public void CompressBrotli_ShouldCompressAndDecompress()
diff --git a/test/Cuemon.Extensions.IO.Tests/TextReaderExtensionsTest.cs b/test/Cuemon.Extensions.IO.Tests/TextReaderExtensionsTest.cs
index 3bd18244f..20d7f2ab5 100644
--- a/test/Cuemon.Extensions.IO.Tests/TextReaderExtensionsTest.cs
+++ b/test/Cuemon.Extensions.IO.Tests/TextReaderExtensionsTest.cs
@@ -24,7 +24,7 @@ public async Task CopyToAsync_ShouldCopyContentOfReaderToWriter()
sut2.Dispose();
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
await sut3.DisposeAsync();
await sut4.DisposeAsync();
#else
diff --git a/test/Cuemon.Extensions.Net.Tests/Http/SlimHttpClientFactoryTest.cs b/test/Cuemon.Extensions.Net.Tests/Http/SlimHttpClientFactoryTest.cs
index f7bbc3eb3..02683d0bc 100644
--- a/test/Cuemon.Extensions.Net.Tests/Http/SlimHttpClientFactoryTest.cs
+++ b/test/Cuemon.Extensions.Net.Tests/Http/SlimHttpClientFactoryTest.cs
@@ -36,7 +36,7 @@ public void SlimHttpClientFactory_ShouldCreateClientsAndExposeOptions()
Assert.NotNull(client);
}
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
[Fact]
public void SlimHttpClientFactory_ShouldReuseHandlersAndProtectInnerHandlerOnDispose()
{
diff --git a/test/Cuemon.Extensions.Reflection.Tests/AssemblyExtensionsTest.cs b/test/Cuemon.Extensions.Reflection.Tests/AssemblyExtensionsTest.cs
index 5234ee017..cb760dd0d 100644
--- a/test/Cuemon.Extensions.Reflection.Tests/AssemblyExtensionsTest.cs
+++ b/test/Cuemon.Extensions.Reflection.Tests/AssemblyExtensionsTest.cs
@@ -18,7 +18,7 @@ public void GetAssemblyVersion_ShouldReturnAssemblyVersion()
TestOutput.WriteLine(sut2.ToString());
- Assert.Equal("10.0.0.0", sut2.ToString());
+ Assert.Equal("11.0.0.0", sut2.ToString());
Assert.False(sut2.HasAlphanumericVersion);
Assert.False(sut2.IsSemanticVersion());
}
diff --git a/test/Cuemon.Extensions.Reflection.Tests/TypeExtensionsTest.cs b/test/Cuemon.Extensions.Reflection.Tests/TypeExtensionsTest.cs
index a099497e6..9e8e44e64 100644
--- a/test/Cuemon.Extensions.Reflection.Tests/TypeExtensionsTest.cs
+++ b/test/Cuemon.Extensions.Reflection.Tests/TypeExtensionsTest.cs
@@ -135,6 +135,13 @@ public void GetAllMethods_ShouldIncludeFullInheritanceChainOfMethods()
expected = 49;
#endif
+#if NET11_0_OR_GREATER
+ if (OperatingSystem.IsLinux()) // apparently ms decided to remove GetHelpContext on linux
+ {
+ expected = 39;
+ }
+#endif
+
TestOutput.WriteLines(methods);
Assert.Equal(expected, methods.Count());
@@ -164,7 +171,7 @@ public void GetAllFields_ShouldIncludeFullInheritanceChainOfFields()
expected = 21;
actualValueName = "m_actualValue";
#endif
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
expected = 16;
#endif
diff --git a/test/Cuemon.Extensions.Text.Json.Tests/Cuemon.Extensions.Text.Json.Tests.csproj b/test/Cuemon.Extensions.Text.Json.Tests/Cuemon.Extensions.Text.Json.Tests.csproj
index ce9ee0993..29b46473c 100644
--- a/test/Cuemon.Extensions.Text.Json.Tests/Cuemon.Extensions.Text.Json.Tests.csproj
+++ b/test/Cuemon.Extensions.Text.Json.Tests/Cuemon.Extensions.Text.Json.Tests.csproj
@@ -1,7 +1,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.Extensions.Text.Json
diff --git a/test/Cuemon.Extensions.Threading.Tests/Tasks/TaskExtensionsTest.cs b/test/Cuemon.Extensions.Threading.Tests/Tasks/TaskExtensionsTest.cs
index cea3cd157..989af0694 100644
--- a/test/Cuemon.Extensions.Threading.Tests/Tasks/TaskExtensionsTest.cs
+++ b/test/Cuemon.Extensions.Threading.Tests/Tasks/TaskExtensionsTest.cs
@@ -21,7 +21,7 @@ public void ContinueWithCapturedContext_ShouldHaveTaskAwaiterSetToTrue()
var sut = task.ContinueWithCapturedContext();
var configuredTaskAwaiter = sut.GetType().GetField("m_configuredTaskAwaiter", MemberReflection.Everything).GetValue(sut).As();
var continueOnCapturedContext = false;
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
continueOnCapturedContext = configuredTaskAwaiter.GetType().GetField("m_options", MemberReflection.Everything)?.GetValue(configuredTaskAwaiter)?.As() == ConfigureAwaitOptions.ContinueOnCapturedContext;
#else
continueOnCapturedContext = configuredTaskAwaiter.GetType().GetField("m_continueOnCapturedContext", MemberReflection.Everything).GetValue(configuredTaskAwaiter).As();
@@ -43,7 +43,7 @@ public void ContinueWithSuppressedContext_ShouldHaveTaskAwaiterSetToFalse()
var sut = task.ContinueWithSuppressedContext();
var configuredTaskAwaiter = sut.GetType().GetField("m_configuredTaskAwaiter", MemberReflection.Everything).GetValue(sut).As();
var continueOnCapturedContext = true;
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
continueOnCapturedContext = configuredTaskAwaiter.GetType().GetField("m_options", MemberReflection.Everything)?.GetValue(configuredTaskAwaiter)?.As() == ConfigureAwaitOptions.ContinueOnCapturedContext;
#else
continueOnCapturedContext = configuredTaskAwaiter.GetType().GetField("m_continueOnCapturedContext", MemberReflection.Everything).GetValue(configuredTaskAwaiter).As();
@@ -63,7 +63,7 @@ public void ContinueWithCapturedContextOfResult_ShouldHaveTaskAwaiterSetToTrue()
var awaitableTask = sut.ContinueWithCapturedContext();
var configuredTaskAwaiter = awaitableTask.GetType().GetField("m_configuredTaskAwaiter", MemberReflection.Everything).GetValue(awaitableTask).As.ConfiguredTaskAwaiter>();
var continueOnCapturedContext = false;
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
continueOnCapturedContext = configuredTaskAwaiter.GetType().GetField("m_options", MemberReflection.Everything)?.GetValue(configuredTaskAwaiter)?.As() == ConfigureAwaitOptions.ContinueOnCapturedContext;
#else
continueOnCapturedContext = configuredTaskAwaiter.GetType().GetField("m_continueOnCapturedContext", MemberReflection.Everything).GetValue(configuredTaskAwaiter).As();
@@ -83,7 +83,7 @@ public void ContinueWithSuppressedContextOfResult_ShouldHaveTaskAwaiterSetToFals
var sut = task.ContinueWithSuppressedContext();
var configuredTaskAwaiter = sut.GetType().GetField("m_configuredTaskAwaiter", MemberReflection.Everything).GetValue(sut).As.ConfiguredTaskAwaiter>();
var continueOnCapturedContext = true;
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
continueOnCapturedContext = configuredTaskAwaiter.GetType().GetField("m_options", MemberReflection.Everything)?.GetValue(configuredTaskAwaiter)?.As() == ConfigureAwaitOptions.ContinueOnCapturedContext;
#else
continueOnCapturedContext = configuredTaskAwaiter.GetType().GetField("m_continueOnCapturedContext", MemberReflection.Everything).GetValue(configuredTaskAwaiter).As();
diff --git a/test/Cuemon.IO.Tests/StreamDecoratorExtensionsTest.cs b/test/Cuemon.IO.Tests/StreamDecoratorExtensionsTest.cs
index 39647aeb6..926be6550 100644
--- a/test/Cuemon.IO.Tests/StreamDecoratorExtensionsTest.cs
+++ b/test/Cuemon.IO.Tests/StreamDecoratorExtensionsTest.cs
@@ -15,7 +15,7 @@ public StreamDecoratorExtensionsTest(ITestOutputHelper output) : base(output)
{
}
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
[Fact]
public void CompressBrotli_ShouldCompressAndDecompress()
diff --git a/test/Cuemon.IO.Tests/StreamFactoryTest.cs b/test/Cuemon.IO.Tests/StreamFactoryTest.cs
index 133a8bb10..500e45f72 100644
--- a/test/Cuemon.IO.Tests/StreamFactoryTest.cs
+++ b/test/Cuemon.IO.Tests/StreamFactoryTest.cs
@@ -2,7 +2,7 @@
using System.Globalization;
using System.IO;
using System.Linq;
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
using System.Buffers;
#endif
using System.Text;
@@ -106,7 +106,7 @@ public void Create_ShouldWrapExceptionsFromWriterDelegate()
Assert.Equal("boom", ex.InnerException.Message);
}
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
[Fact]
public void Create_ShouldWriteContent_WhenUsingActionOfBufferWriter()
diff --git a/test/Cuemon.IO.Tests/StreamOptionsTest.cs b/test/Cuemon.IO.Tests/StreamOptionsTest.cs
index 82a85e9b5..289e2b691 100644
--- a/test/Cuemon.IO.Tests/StreamOptionsTest.cs
+++ b/test/Cuemon.IO.Tests/StreamOptionsTest.cs
@@ -1,6 +1,6 @@
using System;
using System.Globalization;
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
using System.Buffers;
#endif
using System.IO;
@@ -82,7 +82,7 @@ public void StreamReaderOptions_ShouldHaveExpectedDefaultsAndAllowCustomization(
Assert.Equal(PreambleSequence.Remove, sut.Preamble);
}
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
[Fact]
public void BufferWriterOptions_ShouldHaveExpectedDefaultsAndAllowCustomization()
diff --git a/test/Cuemon.Core.Tests/DateSpanTest.cs b/test/Cuemon.Kernel.Tests/DateSpanTest.cs
similarity index 56%
rename from test/Cuemon.Core.Tests/DateSpanTest.cs
rename to test/Cuemon.Kernel.Tests/DateSpanTest.cs
index b06973a9a..972672d87 100644
--- a/test/Cuemon.Core.Tests/DateSpanTest.cs
+++ b/test/Cuemon.Kernel.Tests/DateSpanTest.cs
@@ -1,5 +1,6 @@
using Codebelt.Extensions.Xunit;
using System;
+using System.Collections.Generic;
using System.Globalization;
using Xunit;
@@ -218,7 +219,14 @@ public void Parse_ShouldGetNineMonthOfDifference_UsingIso8601String()
public void DateSpan_ShouldHandleOverlapInMonthAndDays()
{
var sut0 = new DateTime(2020, 5, 12);
- var sut1 = Generate.RangeOf(5, i => new DateTime(2021, 5, i + 10));
+ var sut1 = new[]
+ {
+ new DateTime(2021, 5, 10),
+ new DateTime(2021, 5, 11),
+ new DateTime(2021, 5, 12),
+ new DateTime(2021, 5, 13),
+ new DateTime(2021, 5, 14)
+ };
Assert.Collection(sut1,
dt => Assert.Equal("0:11:363:00:00:00.0", new DateSpan(sut0, dt).ToString()),
@@ -344,4 +352,242 @@ public void Parse_ShouldGetTwelveMonthOfDifferenceWithinLeapYear_UsingIso8601Str
TestOutput.WriteLine(span.ToString());
}
+
+ [Fact]
+ public void Constructor_ShouldThrowArgumentNullExceptionWhenCalendarIsNull()
+ {
+ Assert.Throws(() => new DateSpan(DateTime.UtcNow, DateTime.UtcNow, null));
+ }
+
+ [Fact]
+ public void Constructor_WithSingleDate_ShouldUseTodayAsUpperBoundary()
+ {
+ var today = DateTime.Today;
+ var sut = new DateSpan(today);
+ var expected = new DateSpan(today, today);
+
+ Assert.Equal(expected, sut);
+ Assert.Equal(0, sut.Years);
+ Assert.Equal(0, sut.Months);
+ Assert.Equal(0, sut.Days);
+ }
+
+ [Fact]
+ public void Constructor_ShouldNormalizeReversedRange()
+ {
+ var earlier = new DateTime(2021, 3, 5);
+ var later = new DateTime(2021, 4, 5);
+
+ var sut = new DateSpan(later, earlier);
+ var expected = new DateSpan(earlier, later);
+
+ Assert.Equal(expected, sut);
+ Assert.True(sut == expected);
+ Assert.False(sut != expected);
+ }
+
+ [Fact]
+ public void Constructor_ShouldAdjustYearWhenFullYearHasNotElapsed()
+ {
+ var sut = new DateSpan(new DateTime(2020, 3, 1), new DateTime(2021, 2, 28));
+
+ Assert.Equal(0, sut.Years);
+ Assert.Equal(11, sut.Months);
+ Assert.Equal(364, sut.Days);
+ }
+
+ [Fact]
+ public void Constructor_ShouldCapturePartialMonthTimeDifference()
+ {
+ var sut = new DateSpan(new DateTime(2021, 1, 31, 23, 0, 0, 0), new DateTime(2021, 2, 1, 22, 0, 0, 500));
+
+ Assert.Equal(0, sut.Years);
+ Assert.Equal(0, sut.Months);
+ Assert.Equal(0, sut.Days);
+ Assert.Equal(23, sut.Hours);
+ Assert.Equal(0, sut.Minutes);
+ Assert.Equal(0, sut.Seconds);
+ Assert.Equal(500, sut.Milliseconds);
+ Assert.Equal(TimeSpan.FromHours(23).Add(TimeSpan.FromMilliseconds(500)).Ticks, sut.Ticks);
+ }
+
+ [Fact]
+ public void Parse_WithSingleDate_ShouldUseTodayAsUpperBoundary()
+ {
+ var today = DateTime.Today;
+ var sut = DateSpan.Parse(today.ToString("s", CultureInfo.InvariantCulture));
+ var expected = new DateSpan(today, today);
+
+ Assert.Equal(expected, sut);
+ }
+
+ [Fact]
+ public void Parse_WithCulture_ShouldUseProvidedCultureCalendar()
+ {
+ var culture = CultureInfo.InvariantCulture;
+ var start = new DateTime(2021, 3, 5).ToString("s", culture);
+ var end = new DateTime(2021, 4, 5).ToString("s", culture);
+
+ var sut = DateSpan.Parse(start, end, culture);
+ var expected = new DateSpan(new DateTime(2021, 3, 5), new DateTime(2021, 4, 5), culture.Calendar);
+
+ Assert.Equal(expected, sut);
+ }
+
+ [Fact]
+ public void Equals_ShouldReturnFalseForNonDateSpanObject()
+ {
+ Assert.False(new DateSpan().Equals("DateSpan"));
+ }
+
+ [Fact]
+ public void Equals_ShouldReturnFalseForDifferentCalendarTypes()
+ {
+ var start = new DateTime(2021, 3, 5);
+ var end = new DateTime(2021, 4, 5);
+ var left = new DateSpan(start, end, new GregorianCalendar());
+ var right = new DateSpan(start, end, new JulianCalendar());
+
+ Assert.False(left.Equals(right));
+ Assert.True(left != right);
+ }
+
+ [Theory]
+ [InlineData(2021, 3, 1, 2021, 3, 3, 2)]
+ [InlineData(2021, 3, 5, 2021, 3, 7, 2)]
+ public void GetWeeks_ShouldHandleShortRanges(int startYear, int startMonth, int startDay, int endYear, int endMonth, int endDay, int expected)
+ {
+ var sut = new DateSpan(new DateTime(startYear, startMonth, startDay), new DateTime(endYear, endMonth, endDay));
+
+ Assert.Equal(expected, sut.GetWeeks());
+ }
+
+ [Theory]
+ [MemberData(nameof(GetSupportedCalendars))]
+ public void Constructor_ShouldSupportCalendarImplementations(DateTime start, DateTime end, Func calendarFactory)
+ {
+ var sut = new DateSpan(start, end, calendarFactory());
+ var expected = new DateSpan(start, end, calendarFactory());
+
+ Assert.Equal(expected, sut);
+ Assert.Equal(1, sut.Days);
+ }
+
+ public static IEnumerable GetSupportedCalendars()
+ {
+ yield return new object[] { new DateTime(2021, 3, 5), new DateTime(2021, 3, 6), (Func)(() => new ChineseLunisolarCalendar()) };
+ yield return new object[] { new DateTime(31, 3, 5), new DateTime(31, 3, 6), (Func)(() => new JapaneseLunisolarCalendar()) };
+ yield return new object[] { new DateTime(2021, 3, 5), new DateTime(2021, 3, 6), (Func)(() => new KoreanLunisolarCalendar()) };
+ yield return new object[] { new DateTime(100, 3, 5), new DateTime(100, 3, 6), (Func)(() => new TaiwanLunisolarCalendar()) };
+ yield return new object[] { new DateTime(2021, 3, 5), new DateTime(2021, 3, 6), (Func)(() => new GregorianCalendar()) };
+ yield return new object[] { new DateTime(5343, 3, 5), new DateTime(5343, 3, 6), (Func)(() => new HebrewCalendar()) };
+ yield return new object[] { new DateTime(2021, 3, 5), new DateTime(2021, 3, 6), (Func)(() => new HijriCalendar()) };
+ yield return new object[] { new DateTime(2021, 3, 5), new DateTime(2021, 3, 6), (Func)(() => new JapaneseCalendar()) };
+ yield return new object[] { new DateTime(2021, 3, 5), new DateTime(2021, 3, 6), (Func)(() => new JulianCalendar()) };
+ yield return new object[] { new DateTime(2334, 3, 5), new DateTime(2334, 3, 6), (Func)(() => new KoreanCalendar()) };
+ yield return new object[] { new DateTime(2021, 3, 5), new DateTime(2021, 3, 6), (Func)(() => new PersianCalendar()) };
+ yield return new object[] { new DateTime(2021, 3, 5), new DateTime(2021, 3, 6), (Func)(() => new TaiwanCalendar()) };
+ yield return new object[] { new DateTime(2021, 3, 5), new DateTime(2021, 3, 6), (Func)(() => new ThaiBuddhistCalendar()) };
+ yield return new object[] { new DateTime(1400, 3, 5), new DateTime(1400, 3, 6), (Func)(() => new UmAlQuraCalendar()) };
+ yield return new object[] { new DateTime(2021, 3, 5), new DateTime(2021, 3, 6), (Func)(() => new DelegatingCalendar()) };
+ }
+
+ private sealed class DelegatingCalendar : Calendar
+ {
+ private readonly GregorianCalendar _inner = new GregorianCalendar();
+
+ public override DateTime MinSupportedDateTime => _inner.MinSupportedDateTime;
+
+ public override DateTime MaxSupportedDateTime => _inner.MaxSupportedDateTime;
+
+ public override CalendarAlgorithmType AlgorithmType => _inner.AlgorithmType;
+
+ public override int[] Eras => _inner.Eras;
+
+ public override int TwoDigitYearMax
+ {
+ get => _inner.TwoDigitYearMax;
+ set => _inner.TwoDigitYearMax = value;
+ }
+
+ public override DateTime AddMonths(DateTime time, int months)
+ {
+ return _inner.AddMonths(time, months);
+ }
+
+ public override DateTime AddYears(DateTime time, int years)
+ {
+ return _inner.AddYears(time, years);
+ }
+
+ public override int GetDayOfMonth(DateTime time)
+ {
+ return _inner.GetDayOfMonth(time);
+ }
+
+ public override DayOfWeek GetDayOfWeek(DateTime time)
+ {
+ return _inner.GetDayOfWeek(time);
+ }
+
+ public override int GetDayOfYear(DateTime time)
+ {
+ return _inner.GetDayOfYear(time);
+ }
+
+ public override int GetDaysInMonth(int year, int month, int era)
+ {
+ return _inner.GetDaysInMonth(year, month, era);
+ }
+
+ public override int GetDaysInYear(int year, int era)
+ {
+ return _inner.GetDaysInYear(year, era);
+ }
+
+ public override int GetEra(DateTime time)
+ {
+ return _inner.GetEra(time);
+ }
+
+ public override int GetMonth(DateTime time)
+ {
+ return _inner.GetMonth(time);
+ }
+
+ public override int GetMonthsInYear(int year, int era)
+ {
+ return _inner.GetMonthsInYear(year, era);
+ }
+
+ public override int GetYear(DateTime time)
+ {
+ return _inner.GetYear(time);
+ }
+
+ public override bool IsLeapDay(int year, int month, int day, int era)
+ {
+ return _inner.IsLeapDay(year, month, day, era);
+ }
+
+ public override bool IsLeapMonth(int year, int month, int era)
+ {
+ return _inner.IsLeapMonth(year, month, era);
+ }
+
+ public override bool IsLeapYear(int year, int era)
+ {
+ return _inner.IsLeapYear(year, era);
+ }
+
+ public override DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era)
+ {
+ return _inner.ToDateTime(year, month, day, hour, minute, second, millisecond, era);
+ }
+
+ public override int ToFourDigitYear(int year)
+ {
+ return _inner.ToFourDigitYear(year);
+ }
+ }
}
diff --git a/test/Cuemon.Core.Tests/DelimitedStringTest.cs b/test/Cuemon.Kernel.Tests/DelimitedStringTest.cs
similarity index 100%
rename from test/Cuemon.Core.Tests/DelimitedStringTest.cs
rename to test/Cuemon.Kernel.Tests/DelimitedStringTest.cs
diff --git a/test/Cuemon.Kernel.Tests/RangeTest.cs b/test/Cuemon.Kernel.Tests/RangeTest.cs
new file mode 100644
index 000000000..42d22a6e0
--- /dev/null
+++ b/test/Cuemon.Kernel.Tests/RangeTest.cs
@@ -0,0 +1,104 @@
+using System;
+using System.Globalization;
+using Codebelt.Extensions.Xunit;
+using Xunit;
+
+namespace Cuemon
+{
+ public class RangeTest : Test
+ {
+ public RangeTest(ITestOutputHelper output) : base(output)
+ {
+ }
+
+ [Fact]
+ public void Equals_ShouldHandleReferenceAndNullCases()
+ {
+ var start = new DateTime(2021, 3, 5, 6, 7, 8);
+ var end = new DateTime(2021, 3, 6, 8, 10, 12);
+ var sut = new DateTimeRange(start, end);
+
+ Assert.True(sut.Equals(sut, sut));
+ Assert.False(sut.Equals(null, sut));
+ Assert.False(sut.Equals(sut, null));
+ }
+
+ [Fact]
+ public void Equals_ShouldReturnFalseForDifferentDerivedTypes()
+ {
+ var start = new DateTime(2021, 3, 5, 6, 7, 8);
+ var end = new DateTime(2021, 3, 6, 8, 10, 12);
+ Range left = new DateTimeRange(start, end);
+ Range right = new DateTimeRangeStub(start, end);
+
+ Assert.False(left.Equals(left, right));
+ }
+
+ [Fact]
+ public void Equals_ShouldCompareBoundaries()
+ {
+ var start = new DateTime(2021, 3, 5, 6, 7, 8);
+ var end = new DateTime(2021, 3, 6, 8, 10, 12);
+ var comparer = new DateTimeRange(start, end);
+ var left = new DateTimeRange(start, end);
+ var equal = new DateTimeRange(start, end);
+ var different = new DateTimeRange(start, end.AddSeconds(1));
+
+ Assert.True(comparer.Equals(left, equal));
+ Assert.False(comparer.Equals(left, different));
+ }
+
+ [Fact]
+ public void GetHashCode_ShouldXorBoundaries()
+ {
+ var start = new DateTime(2021, 3, 5, 6, 7, 8);
+ var end = new DateTime(2021, 3, 6, 8, 10, 12);
+ var sut = new DateTimeRange(start, end);
+
+ Assert.Equal(start.GetHashCode() ^ end.GetHashCode(), sut.GetHashCode(sut));
+ }
+
+ [Fact]
+ public void DateTimeRange_ShouldExposeDurationAndFormatUsingSortablePattern()
+ {
+ var start = new DateTime(2021, 3, 5, 6, 7, 8);
+ var end = new DateTime(2021, 3, 6, 8, 10, 12);
+ var sut = new DateTimeRange(start, end);
+
+ Assert.Equal(start, sut.Start);
+ Assert.Equal(end, sut.End);
+ Assert.Equal(new TimeSpan(1, 2, 3, 4), sut.Duration);
+ Assert.Equal("A duration of 01.02:03:04 between 2021-03-05T06:07:08 and 2021-03-06T08:10:12.", sut.ToString("s", CultureInfo.InvariantCulture));
+ Assert.Equal("A duration of 01.02:03:04 between 2021-03-05T06:07:08 and 2021-03-06T08:10:12.", sut.ToString());
+ }
+
+ [Fact]
+ public void TimeRange_ShouldUseDefaultDurationAndConstantPattern()
+ {
+ var start = new TimeSpan(6, 7, 8);
+ var end = new TimeSpan(8, 10, 12);
+ var sut = new TimeRange(start, end);
+
+ Assert.Equal(start, sut.Start);
+ Assert.Equal(end, sut.End);
+ Assert.Equal(new TimeSpan(2, 3, 4), sut.Duration);
+ Assert.Equal("A duration of 00.02:03:04 between 06:07:08 and 08:10:12.", sut.ToString("c", CultureInfo.InvariantCulture));
+ Assert.Equal("A duration of 00.02:03:04 between 06:07:08 and 08:10:12.", sut.ToString());
+ }
+
+ [Fact]
+ public void TimeRange_ShouldUseCustomDurationResolverWhenProvided()
+ {
+ var sut = new TimeRange(TimeSpan.FromHours(1), TimeSpan.FromHours(2), () => TimeSpan.FromHours(3));
+
+ Assert.Equal(TimeSpan.FromHours(3), sut.Duration);
+ }
+
+ private sealed class DateTimeRangeStub : Range
+ {
+ public DateTimeRangeStub(DateTime start, DateTime end) : base(start, end, () => end.Subtract(start))
+ {
+ }
+ }
+ }
+}
diff --git a/test/Cuemon.Kernel.Tests/Threading/AwaiterTest.cs b/test/Cuemon.Kernel.Tests/Threading/AwaiterTest.cs
index 72916adfd..4a6e7d9b7 100644
--- a/test/Cuemon.Kernel.Tests/Threading/AwaiterTest.cs
+++ b/test/Cuemon.Kernel.Tests/Threading/AwaiterTest.cs
@@ -255,10 +255,10 @@ Task Method()
callCount++;
if (callCount == 1) { throw first; }
if (callCount == 2) { throw second; }
- return ThrowAfterAsync(third, AttemptDuration);
+ return ThrowAfterAsync(third, TimeSpan.FromMilliseconds(200));
}
- var result = await Run(Method, TimeSpan.FromMilliseconds(10), TimeSpan.Zero, maximumAttempts: 3);
+ var result = await Run(Method, TimeSpan.FromMilliseconds(100), TimeSpan.Zero, maximumAttempts: 3);
var aggregate = Assert.IsType(result.Failure);
Assert.False(result.Succeeded);
diff --git a/test/Cuemon.Runtime.Caching.Tests/Cuemon.Runtime.Caching.Tests.csproj b/test/Cuemon.Runtime.Caching.Tests/Cuemon.Runtime.Caching.Tests.csproj
index 23f01c3eb..baacc78e0 100644
--- a/test/Cuemon.Runtime.Caching.Tests/Cuemon.Runtime.Caching.Tests.csproj
+++ b/test/Cuemon.Runtime.Caching.Tests/Cuemon.Runtime.Caching.Tests.csproj
@@ -2,7 +2,7 @@
- net10.0;net9.0
+ net11.0;net10.0
Cuemon.Runtime.Caching
diff --git a/test/Cuemon.Security.Cryptography.Tests/UnkeyedHashFactoryTest.cs b/test/Cuemon.Security.Cryptography.Tests/UnkeyedHashFactoryTest.cs
index c30ca2ba0..25f89ba18 100644
--- a/test/Cuemon.Security.Cryptography.Tests/UnkeyedHashFactoryTest.cs
+++ b/test/Cuemon.Security.Cryptography.Tests/UnkeyedHashFactoryTest.cs
@@ -44,7 +44,7 @@ public void CreateCryptoSha256_ShouldBeValidHashResult()
Assert.Equal("db4bfcbd4da0cd85a60c3c37d3fbd8805c77f15fc6b1fdfe614ee0a7c8fdb4c0", h.ComputeHash(Alphanumeric.LettersAndNumbers).ToHexadecimalString());
Assert.Equal("db4bfcbd4da0cd85a60c3c37d3fbd8805c77f15fc6b1fdfe614ee0a7c8fdb4c0", h.ComputeHash(Decorator.Enclose(Alphanumeric.LettersAndNumbers).ToStream()).ToHexadecimalString());
Assert.Equal("84d89877f0d4041efb6bf91a16f0248f2fd573e6af05c19f96bedb9f882f7882", h.ComputeHash(Alphanumeric.Numbers).ToHexadecimalString());
-#if NET9_0_OR_GREATER
+#if NET10_0_OR_GREATER
Assert.Equal("53ab3a50f51855beeae9721ab68656312c7f105b9b34bbfa97875dbfda72dbc6", h.ComputeHash(DateTime.UnixEpoch).ToHexadecimalString());
#endif
Assert.Equal("1f1a24c833be74a0f4f99007aa70a51e2456e41f745a5628721ea2b8e1c07641", h.ComputeHash(213, "fdfsfsf", 9999).ToHexadecimalString());
diff --git a/tooling/Resolve-PackageReleaseNotesConflicts.ps1 b/tooling/Resolve-PackageReleaseNotesConflicts.ps1
new file mode 100644
index 000000000..e976edd9e
--- /dev/null
+++ b/tooling/Resolve-PackageReleaseNotesConflicts.ps1
@@ -0,0 +1,43 @@
+#!/usr/bin/env pwsh
+<#
+.SYNOPSIS
+ Resolves merge conflicts in all PackageReleaseNotes.txt files.
+
+.DESCRIPTION
+ During a merge, PackageReleaseNotes.txt files accumulate standard
+ conflict markers. This script resolves all of them. It keeps both
+ sides — current branch (A) on top, incoming (B) below — discards
+ the base section in diff3/zdiff3 conflicts, and stages
+ the resolved files with `git add`.
+
+.EXAMPLE
+ # Run from the repo root while a merge is in progress:
+ .\tooling\Resolve-PackageReleaseNotesConflicts.ps1
+#>
+
+$files = git diff --name-only --diff-filter=U | Where-Object { $_ -match "PackageReleaseNotes\.txt" }
+
+if (-not $files) {
+ Write-Host "No conflicted PackageReleaseNotes.txt files found."
+ exit 0
+}
+
+$count = 0
+foreach ($file in $files) {
+ $content = Get-Content $file -Raw
+ $resolved = $content `
+ -replace '(?m)^<<<<<<< .+\r?\n', '' `
+ -replace '(?ms)^\|{7}[^\r\n]*\r?\n.*?(?=^=======\r?$)', '' `
+ -replace '(?m)^=======\r?\n', "`n" `
+ -replace '(?m)^>>>>>>> .+(?:\r?\n|$)', ''
+ [System.IO.File]::WriteAllText((Resolve-Path $file), $resolved)
+ git add $file
+ if ($LASTEXITCODE -ne 0) {
+ throw "Failed to stage '$file'."
+ }
+ $count++
+ Write-Host "Resolved: $file"
+}
+
+Write-Host ""
+Write-Host "Done. Resolved and staged $count file(s)."