diff --git a/Directory.Build.props b/Directory.Build.props
index 6510902b7..589a8f886 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -25,7 +25,7 @@
   </Choose>
 
   <ItemGroup>
-    <PackageReference Include="Nerdbank.GitVersioning" Version="3.6.146" PrivateAssets="All" />
+    <PackageReference Include="Nerdbank.GitVersioning" Version="3.9.50" PrivateAssets="All" IsImplicitlyReferenced="true" />
   </ItemGroup>
 
   <Choose>
diff --git a/src/CommunityToolkit.Diagnostics/CommunityToolkit.Diagnostics.csproj b/src/CommunityToolkit.Diagnostics/CommunityToolkit.Diagnostics.csproj
index cc9d42d39..870c8c55b 100644
--- a/src/CommunityToolkit.Diagnostics/CommunityToolkit.Diagnostics.csproj
+++ b/src/CommunityToolkit.Diagnostics/CommunityToolkit.Diagnostics.csproj
@@ -19,14 +19,14 @@
     <!-- .NET Standard 2.0 doesn't have the Span<T> type -->
     <When Condition="'$(TargetFramework)' == 'netstandard2.0'">
       <ItemGroup>
-        <PackageReference Include="System.Memory" Version="4.6.0" />
+        <PackageReference Include="System.Memory" Version="4.6.3" />
       </ItemGroup>
     </When>
 
     <!-- .NET Standard 2.1 doesn't have the Unsafe type -->
     <When Condition="'$(TargetFramework)' == 'netstandard2.1'">
       <ItemGroup>
-        <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
+        <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
       </ItemGroup>
     </When>
   </Choose>
diff --git a/src/CommunityToolkit.HighPerformance/Buffers/StringPool.cs b/src/CommunityToolkit.HighPerformance/Buffers/StringPool.cs
index b1ef81e37..abe3aeb27 100644
--- a/src/CommunityToolkit.HighPerformance/Buffers/StringPool.cs
+++ b/src/CommunityToolkit.HighPerformance/Buffers/StringPool.cs
@@ -376,7 +376,7 @@ public FixedSizePriorityMap(int capacity)
         /// <summary>
         /// Gets an <see cref="object"/> that can be used to synchronize access to the current instance.
         /// </summary>
-        public object SyncRoot
+        public readonly object SyncRoot
         {
             [MethodImpl(MethodImplOptions.AggressiveInlining)]
             get => this.buckets;
@@ -749,7 +749,7 @@ private void UpdateTimestamp(ref int heapIndex)
         /// a given number of nodes, those are all contiguous from the start of the array.
         /// </summary>
         [MethodImpl(MethodImplOptions.NoInlining)]
-        private void UpdateAllTimestamps()
+        private readonly void UpdateAllTimestamps()
         {
             int count = this.count;
             ref HeapEntry heapEntriesRef = ref this.heapEntries.DangerousGetReference();
diff --git a/src/CommunityToolkit.HighPerformance/CommunityToolkit.HighPerformance.csproj b/src/CommunityToolkit.HighPerformance/CommunityToolkit.HighPerformance.csproj
index 3d3477589..ee2390f28 100644
--- a/src/CommunityToolkit.HighPerformance/CommunityToolkit.HighPerformance.csproj
+++ b/src/CommunityToolkit.HighPerformance/CommunityToolkit.HighPerformance.csproj
@@ -31,9 +31,9 @@
       <!-- .NET Standard 2.0 doesn't have the Span<T>, HashCode and ValueTask types -->
       <ItemGroup>
         <PackageReference Include="Microsoft.Bcl.HashCode" Version="6.0.0" />
-        <PackageReference Include="System.Memory" Version="4.6.0" />
-        <PackageReference Include="System.Threading.Tasks.Extensions" Version="4.6.0" />
-        <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
+        <PackageReference Include="System.Memory" Version="4.6.3" />
+        <PackageReference Include="System.Threading.Tasks.Extensions" Version="4.6.3" />
+        <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
       </ItemGroup>
 
       <!-- On .NET Standard 2.0, the unit test project also needs access to internals -->
@@ -45,7 +45,7 @@
     <!-- .NET Standard 2.1 doesn't have the Unsafe type -->
     <When Condition="'$(TargetFramework)' == 'netstandard2.1'">
       <ItemGroup>
-        <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
+        <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
       </ItemGroup>
     </When>
   </Choose>
diff --git a/src/CommunityToolkit.Mvvm.SourceGenerators/Helpers/HashCode.cs b/src/CommunityToolkit.Mvvm.SourceGenerators/Helpers/HashCode.cs
index 0548c4467..354c17fe6 100644
--- a/src/CommunityToolkit.Mvvm.SourceGenerators/Helpers/HashCode.cs
+++ b/src/CommunityToolkit.Mvvm.SourceGenerators/Helpers/HashCode.cs
@@ -134,7 +134,7 @@ private void Add(int value)
     /// Gets the resulting hashcode from the current instance.
     /// </summary>
     /// <returns>The resulting hashcode from the current instance.</returns>
-    public int ToHashCode()
+    public readonly int ToHashCode()
     {
         uint length = this.length;
         uint position = length % 4;
@@ -165,12 +165,12 @@ public int ToHashCode()
     /// <inheritdoc/>
     [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes. Use ToHashCode to retrieve the computed hash code.", error: true)]
     [EditorBrowsable(EditorBrowsableState.Never)]
-    public override int GetHashCode() => throw new NotSupportedException();
+    public override readonly int GetHashCode() => throw new NotSupportedException();
 
     /// <inheritdoc/>
     [Obsolete("HashCode is a mutable struct and should not be compared with other HashCodes.", error: true)]
     [EditorBrowsable(EditorBrowsableState.Never)]
-    public override bool Equals(object? obj) => throw new NotSupportedException();
+    public override readonly bool Equals(object? obj) => throw new NotSupportedException();
 
     /// <summary>
     /// Rotates the specified value left by the specified number of bits.
diff --git a/src/CommunityToolkit.Mvvm/CommunityToolkit.Mvvm.WindowsSdk.targets b/src/CommunityToolkit.Mvvm/CommunityToolkit.Mvvm.WindowsSdk.targets
index cf89f2def..f51332a68 100644
--- a/src/CommunityToolkit.Mvvm/CommunityToolkit.Mvvm.WindowsSdk.targets
+++ b/src/CommunityToolkit.Mvvm/CommunityToolkit.Mvvm.WindowsSdk.targets
@@ -27,9 +27,9 @@
           - The recommended Windows SDK package for UWP projects using the .NET 9 SDK (with UWP XAML projections).
           - The recommended Windows SDK package for WindowsAppSDK projects (ie. without UWP XAML projections). 
       -->
-      <_MvvmToolkitWindowsSdkPackageMinBuild>38</_MvvmToolkitWindowsSdkPackageMinBuild>
-      <_MvvmToolkitWindowsSdkPackageRecommendedUwpBuild>54</_MvvmToolkitWindowsSdkPackageRecommendedUwpBuild>
-      <_MvvmToolkitWindowsSdkPackageRecommendedWindowsAppSDKBuild>53</_MvvmToolkitWindowsSdkPackageRecommendedWindowsAppSDKBuild>
+      <_MvvmToolkitWindowsSdkPackageMinBuild>56</_MvvmToolkitWindowsSdkPackageMinBuild>
+      <_MvvmToolkitWindowsSdkPackageRecommendedUwpBuild>57</_MvvmToolkitWindowsSdkPackageRecommendedUwpBuild>
+      <_MvvmToolkitWindowsSdkPackageRecommendedWindowsAppSDKBuild>56</_MvvmToolkitWindowsSdkPackageRecommendedWindowsAppSDKBuild>
 
       <!-- Switch on the recommended one based on configuration -->
       <_MvvmToolkitWindowsSdkPackageRecommendedBuild>$(_MvvmToolkitWindowsSdkPackageMinBuild)</_MvvmToolkitWindowsSdkPackageRecommendedBuild>
@@ -82,7 +82,7 @@
       Condition="'@(_MvvmToolkitCompatibleWindowsSdkPackages)' == ''"
       Code="MVVMTKCFG0003"
       HelpLink="https://aka.ms/mvvmtoolkit/errors/mvvmtkcfg0003"
-      Text="This version of the MVVM Toolkit requires 'Microsoft.Windows.SDK.NET.Ref' version '$(_MvvmToolkitWindowsSdkPackageRequired)' or later. Please update to .NET SDK 8.0.109, 8.0.305 or 8.0.402 (or later). Alternatively, use a temporary 'Microsoft.Windows.SDK.NET.Ref' reference, which can be done by setting the 'WindowsSdkPackageVersion' property in your .csproj file. For your project configuration, it is recommended to set the package version to '$(_MvvmToolkitWindowsSdkPackageRecommended)'." />
+      Text="This version of the MVVM Toolkit requires 'Microsoft.Windows.SDK.NET.Ref' version '$(_MvvmToolkitWindowsSdkPackageRequired)' or later. Please update the .NET SDK in use to 8.0.405 (or later) or 9.0.102 (or later). Alternatively, use a temporary 'Microsoft.Windows.SDK.NET.Ref' reference, which can be done by setting the 'WindowsSdkPackageVersion' property in your .csproj file. For your project configuration, it is recommended to set the package version to '$(_MvvmToolkitWindowsSdkPackageRecommended)'." />
   </Target>
 
 </Project>
\ No newline at end of file
diff --git a/src/CommunityToolkit.Mvvm/CommunityToolkit.Mvvm.csproj b/src/CommunityToolkit.Mvvm/CommunityToolkit.Mvvm.csproj
index dd7c98d01..e3130dba5 100644
--- a/src/CommunityToolkit.Mvvm/CommunityToolkit.Mvvm.csproj
+++ b/src/CommunityToolkit.Mvvm/CommunityToolkit.Mvvm.csproj
@@ -9,7 +9,7 @@
     because we need the source generators in CsWinRT to generate the supporting interop code for AOT).
   -->
   <PropertyGroup Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0-windows10.0.17763.0'))">
-    <WindowsSdkPackageVersion>10.0.17763.53</WindowsSdkPackageVersion>
+    <WindowsSdkPackageVersion>10.0.17763.56</WindowsSdkPackageVersion>
 
     <!--
       We're only referencing CsWinRT for the source generators, we don't need to read any WinRT metadata.
@@ -42,16 +42,16 @@
 
   <!-- .NET Standard 2.0 doesn't have the Span<T> and IAsyncEnumerable<T> types -->
   <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
-    <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="8.0.0" />
+    <PackageReference Include="Microsoft.Bcl.AsyncInterfaces" Version="9.0.10" />
     <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
-    <PackageReference Include="System.Memory" Version="4.6.0" />
-    <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
+    <PackageReference Include="System.Memory" Version="4.6.3" />
+    <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
   </ItemGroup>
 
   <!-- .NET Standard 2.1 doesn't have the Unsafe type -->
   <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.1'">
     <PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
-    <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.0" />
+    <PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.1.2" />
   </ItemGroup>
 
   <!-- Include the ILLink file (to properly trim configuration switches in publish builds) -->
@@ -61,7 +61,7 @@
 
   <!-- Reference CsWinRT when targeting Windows, to get the latest source generators -->
   <ItemGroup Condition="$([MSBuild]::IsTargetFrameworkCompatible('$(TargetFramework)', 'net8.0-windows10.0.17763.0'))">
-    <PackageReference Include="Microsoft.Windows.CsWinRT" Version="2.1.6" PrivateAssets="all" />
+    <PackageReference Include="Microsoft.Windows.CsWinRT" Version="2.2.0" PrivateAssets="all" />
   </ItemGroup>
 
   <!-- Reference the various multi-targeted versions of the source generator project (one per Roslyn version), and the code fixer -->
diff --git a/src/CommunityToolkit.Mvvm/Messaging/IMessengerExtensions.Observables.cs b/src/CommunityToolkit.Mvvm/Messaging/IMessengerExtensions.Observables.cs
index 4675a3193..b930203ab 100644
--- a/src/CommunityToolkit.Mvvm/Messaging/IMessengerExtensions.Observables.cs
+++ b/src/CommunityToolkit.Mvvm/Messaging/IMessengerExtensions.Observables.cs
@@ -3,14 +3,9 @@
 // See the LICENSE file in the project root for more information.
 
 using System;
-
-// This file has two types which implement interfaces that can be projected to WInRT, ie.
-// 'Observable<TMessage>.Recipient' and 'Observable<TMessage, TToken>.Recipient', which
-// implement 'IDisposable' (which is projected to 'IClosable'). These types are not meant
-// to be used in interop scenarios (including in eg. bindings), as they're only meant to
-// be used by code behind interacting with System.Reactive APIs. As such, we skip marking
-// them partial, as we don't need CCW vtables to be generated for them.
-#pragma warning disable CsWinRT1028
+#if NET8_0_OR_GREATER && WINDOWS
+using WinRT;
+#endif
 
 namespace CommunityToolkit.Mvvm.Messaging;
 
@@ -81,6 +76,9 @@ public IDisposable Subscribe(IObserver<TMessage> observer)
         /// <summary>
         /// An <see cref="IRecipient{TMessage}"/> implementation for <see cref="Observable{TMessage}"/>.
         /// </summary>
+#if NET8_0_OR_GREATER && WINDOWS
+        [WinRTExposedType(typeof(WinRTManagedOnlyTypeDetails))]
+#endif
         private sealed class Recipient : IRecipient<TMessage>, IDisposable
         {
             /// <summary>
@@ -159,6 +157,9 @@ public IDisposable Subscribe(IObserver<TMessage> observer)
         /// <summary>
         /// An <see cref="IRecipient{TMessage}"/> implementation for <see cref="Observable{TMessage, TToken}"/>.
         /// </summary>
+#if NET8_0_OR_GREATER && WINDOWS
+        [WinRTExposedType(typeof(WinRTManagedOnlyTypeDetails))]
+#endif
         private sealed class Recipient : IRecipient<TMessage>, IDisposable
         {
             /// <summary>
diff --git a/src/CommunityToolkit.Mvvm/Messaging/Internals/ArrayPoolBufferWriter{T}.cs b/src/CommunityToolkit.Mvvm/Messaging/Internals/ArrayPoolBufferWriter{T}.cs
index b740eb06b..d98aba133 100644
--- a/src/CommunityToolkit.Mvvm/Messaging/Internals/ArrayPoolBufferWriter{T}.cs
+++ b/src/CommunityToolkit.Mvvm/Messaging/Internals/ArrayPoolBufferWriter{T}.cs
@@ -58,7 +58,7 @@ public static ArrayPoolBufferWriter<T> Create()
     /// <summary>
     /// Gets a <see cref="ReadOnlySpan{T}"/> with the current items.
     /// </summary>
-    public ReadOnlySpan<T> Span
+    public readonly ReadOnlySpan<T> Span
     {
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         get => this.span.Slice(0, this.index);
@@ -116,7 +116,7 @@ private void ResizeBufferAndAdd(T item)
     }
 
     /// <inheritdoc cref="IDisposable.Dispose"/>
-    public void Dispose()
+    public readonly void Dispose()
     {
         Array.Clear(this.array, 0, this.index);
 
diff --git a/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Collections.Generic/Dictionary2.cs b/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Collections.Generic/Dictionary2.cs
index 4e8bbf075..720cd5184 100644
--- a/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Collections.Generic/Dictionary2.cs
+++ b/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Collections.Generic/Dictionary2.cs
@@ -320,7 +320,7 @@ public bool MoveNext()
         /// Gets the current key.
         /// </summary>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public TKey GetKey()
+        public readonly TKey GetKey()
         {
             return this.entries[this.index - 1].Key;
         }
@@ -329,7 +329,7 @@ public TKey GetKey()
         /// Gets the current value.
         /// </summary>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public TValue GetValue()
+        public readonly TValue GetValue()
         {
             return this.entries[this.index - 1].Value!;
         }
diff --git a/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.Proxy.cs b/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.Proxy.cs
index 6a7874f2a..4a1aff615 100644
--- a/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.Proxy.cs
+++ b/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.Proxy.cs
@@ -72,13 +72,13 @@ public Enumerator(ConditionalWeakTable2<TKey, TValue> owner)
         }
 
         /// <inheritdoc cref="IDisposable.Dispose"/>
-        public void Dispose()
+        public readonly void Dispose()
         {
             this.enumerator.Dispose();
         }
 
         /// <inheritdoc cref="Collections.IEnumerator.MoveNext"/>
-        public bool MoveNext()
+        public readonly bool MoveNext()
         {
             return this.enumerator.MoveNext();
         }
@@ -87,7 +87,7 @@ public bool MoveNext()
         /// Gets the current key.
         /// </summary>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public TKey GetKey()
+        public readonly TKey GetKey()
         {
             return this.enumerator.Current.Key;
         }
@@ -96,7 +96,7 @@ public TKey GetKey()
         /// Gets the current value.
         /// </summary>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public TValue GetValue()
+        public readonly TValue GetValue()
         {
             return this.enumerator.Current.Value;
         }
diff --git a/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.ZeroAlloc.cs b/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.ZeroAlloc.cs
index 882b6bf50..888f6df7e 100644
--- a/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.ZeroAlloc.cs
+++ b/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.ZeroAlloc.cs
@@ -248,7 +248,7 @@ public bool MoveNext()
         /// Gets the current key.
         /// </summary>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public TKey GetKey()
+        public readonly TKey GetKey()
         {
             return this.key!;
         }
@@ -257,7 +257,7 @@ public TKey GetKey()
         /// Gets the current value.
         /// </summary>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public TValue GetValue()
+        public readonly TValue GetValue()
         {
             return this.value!;
         }
diff --git a/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.cs b/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.cs
index 04b6b0f2c..aba57ab7f 100644
--- a/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.cs
+++ b/src/CommunityToolkit.Mvvm/Messaging/Internals/System/Runtime.CompilerServices/ConditionalWeakTable2{TKey,TValue}.cs
@@ -139,7 +139,7 @@ public Enumerator(ConditionalWeakTable2<TKey, TValue> owner)
         }
 
         /// <inheritdoc cref="IDisposable.Dispose"/>
-        public void Dispose()
+        public readonly void Dispose()
         {
         }
 
@@ -189,7 +189,7 @@ public bool MoveNext()
         /// Gets the current key.
         /// </summary>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public TKey GetKey()
+        public readonly TKey GetKey()
         {
             return this.key!;
         }
@@ -198,7 +198,7 @@ public TKey GetKey()
         /// Gets the current value.
         /// </summary>
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public TValue GetValue()
+        public readonly TValue GetValue()
         {
             return this.value!;
         }
diff --git a/tests/CommunityToolkit.Common.UnitTests/CommunityToolkit.Common.UnitTests.csproj b/tests/CommunityToolkit.Common.UnitTests/CommunityToolkit.Common.UnitTests.csproj
index 5e782c0b3..0c1a14b04 100644
--- a/tests/CommunityToolkit.Common.UnitTests/CommunityToolkit.Common.UnitTests.csproj
+++ b/tests/CommunityToolkit.Common.UnitTests/CommunityToolkit.Common.UnitTests.csproj
@@ -7,7 +7,7 @@
   <ItemGroup>
     <PackageReference Include="MSTest.TestAdapter" Version="4.0.1" />
     <PackageReference Include="MSTest.TestFramework" Version="4.0.1" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tests/CommunityToolkit.Diagnostics.UnitTests/CommunityToolkit.Diagnostics.UnitTests.csproj b/tests/CommunityToolkit.Diagnostics.UnitTests/CommunityToolkit.Diagnostics.UnitTests.csproj
index 9b9a7d83e..93b3c3905 100644
--- a/tests/CommunityToolkit.Diagnostics.UnitTests/CommunityToolkit.Diagnostics.UnitTests.csproj
+++ b/tests/CommunityToolkit.Diagnostics.UnitTests/CommunityToolkit.Diagnostics.UnitTests.csproj
@@ -7,7 +7,7 @@
   <ItemGroup>
     <PackageReference Include="MSTest.TestAdapter" Version="4.0.1" />
     <PackageReference Include="MSTest.TestFramework" Version="4.0.1" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tests/CommunityToolkit.HighPerformance.UnitTests/CommunityToolkit.HighPerformance.UnitTests.csproj b/tests/CommunityToolkit.HighPerformance.UnitTests/CommunityToolkit.HighPerformance.UnitTests.csproj
index a4fc36d66..e30c2d866 100644
--- a/tests/CommunityToolkit.HighPerformance.UnitTests/CommunityToolkit.HighPerformance.UnitTests.csproj
+++ b/tests/CommunityToolkit.HighPerformance.UnitTests/CommunityToolkit.HighPerformance.UnitTests.csproj
@@ -13,7 +13,7 @@
   <ItemGroup>
     <PackageReference Include="MSTest.TestAdapter" Version="4.0.1" />
     <PackageReference Include="MSTest.TestFramework" Version="4.0.1" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
   </ItemGroup>
 
 </Project>
\ No newline at end of file
diff --git a/tests/CommunityToolkit.HighPerformance.UnitTests/Helpers/Test_ObjectMarshal.cs b/tests/CommunityToolkit.HighPerformance.UnitTests/Helpers/Test_ObjectMarshal.cs
index 89e344406..4b9a3c910 100644
--- a/tests/CommunityToolkit.HighPerformance.UnitTests/Helpers/Test_ObjectMarshal.cs
+++ b/tests/CommunityToolkit.HighPerformance.UnitTests/Helpers/Test_ObjectMarshal.cs
@@ -70,7 +70,7 @@ internal struct TestStruct : IEquatable<TestStruct>
         public string Text;
 
         /// <inheritdoc/>
-        public bool Equals(TestStruct other)
+        public readonly bool Equals(TestStruct other)
         {
             return
                 this.Number == other.Number &&
diff --git a/tests/CommunityToolkit.HighPerformance.UnitTests/Test_Box{T}.cs b/tests/CommunityToolkit.HighPerformance.UnitTests/Test_Box{T}.cs
index 2a3115c46..242b0bdd9 100644
--- a/tests/CommunityToolkit.HighPerformance.UnitTests/Test_Box{T}.cs
+++ b/tests/CommunityToolkit.HighPerformance.UnitTests/Test_Box{T}.cs
@@ -36,7 +36,7 @@ internal struct TestStruct : IEquatable<TestStruct>
         public string Text;
 
         /// <inheritdoc/>
-        public bool Equals(TestStruct other)
+        public readonly bool Equals(TestStruct other)
         {
             return
                 this.Number == other.Number &&
diff --git a/tests/CommunityToolkit.Mvvm.DisableINotifyPropertyChanging.UnitTests/CommunityToolkit.Mvvm.DisableINotifyPropertyChanging.UnitTests.csproj b/tests/CommunityToolkit.Mvvm.DisableINotifyPropertyChanging.UnitTests/CommunityToolkit.Mvvm.DisableINotifyPropertyChanging.UnitTests.csproj
index e2db37d24..14fef5ac6 100644
--- a/tests/CommunityToolkit.Mvvm.DisableINotifyPropertyChanging.UnitTests/CommunityToolkit.Mvvm.DisableINotifyPropertyChanging.UnitTests.csproj
+++ b/tests/CommunityToolkit.Mvvm.DisableINotifyPropertyChanging.UnitTests/CommunityToolkit.Mvvm.DisableINotifyPropertyChanging.UnitTests.csproj
@@ -7,7 +7,7 @@
   <ItemGroup>
     <PackageReference Include="MSTest.TestAdapter" Version="4.0.1" />
     <PackageReference Include="MSTest.TestFramework" Version="4.0.1" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tests/CommunityToolkit.Mvvm.Internals.UnitTests/CommunityToolkit.Mvvm.Internals.UnitTests.csproj b/tests/CommunityToolkit.Mvvm.Internals.UnitTests/CommunityToolkit.Mvvm.Internals.UnitTests.csproj
index f801d27a0..8ba032c90 100644
--- a/tests/CommunityToolkit.Mvvm.Internals.UnitTests/CommunityToolkit.Mvvm.Internals.UnitTests.csproj
+++ b/tests/CommunityToolkit.Mvvm.Internals.UnitTests/CommunityToolkit.Mvvm.Internals.UnitTests.csproj
@@ -7,7 +7,7 @@
   <ItemGroup>
     <PackageReference Include="MSTest.TestAdapter" Version="4.0.1" />
     <PackageReference Include="MSTest.TestFramework" Version="4.0.1" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tests/CommunityToolkit.Mvvm.Roslyn4001.UnitTests/CommunityToolkit.Mvvm.Roslyn4001.UnitTests.csproj b/tests/CommunityToolkit.Mvvm.Roslyn4001.UnitTests/CommunityToolkit.Mvvm.Roslyn4001.UnitTests.csproj
index 25ca3023f..2f18817cc 100644
--- a/tests/CommunityToolkit.Mvvm.Roslyn4001.UnitTests/CommunityToolkit.Mvvm.Roslyn4001.UnitTests.csproj
+++ b/tests/CommunityToolkit.Mvvm.Roslyn4001.UnitTests/CommunityToolkit.Mvvm.Roslyn4001.UnitTests.csproj
@@ -9,9 +9,9 @@
     <PackageReference Include="Dbs.Signed3.Nito.AsyncEx.Context" Version="5.0.0" />
     <PackageReference Include="MSTest.TestAdapter" Version="4.0.1" />
     <PackageReference Include="MSTest.TestFramework" Version="4.0.1" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
-    <PackageReference Include="System.Reactive" Version="6.0.1" />
-    <PackageReference Include="System.Text.Json" Version="8.0.5" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
+    <PackageReference Include="System.Reactive" Version="6.1.0" />
+    <PackageReference Include="System.Text.Json" Version="9.0.10" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tests/CommunityToolkit.Mvvm.Roslyn4031.UnitTests/CommunityToolkit.Mvvm.Roslyn4031.UnitTests.csproj b/tests/CommunityToolkit.Mvvm.Roslyn4031.UnitTests/CommunityToolkit.Mvvm.Roslyn4031.UnitTests.csproj
index be4c167ea..06d4fe9c5 100644
--- a/tests/CommunityToolkit.Mvvm.Roslyn4031.UnitTests/CommunityToolkit.Mvvm.Roslyn4031.UnitTests.csproj
+++ b/tests/CommunityToolkit.Mvvm.Roslyn4031.UnitTests/CommunityToolkit.Mvvm.Roslyn4031.UnitTests.csproj
@@ -9,9 +9,9 @@
     <PackageReference Include="Dbs.Signed3.Nito.AsyncEx.Context" Version="5.0.0" />
     <PackageReference Include="MSTest.TestAdapter" Version="4.0.1" />
     <PackageReference Include="MSTest.TestFramework" Version="4.0.1" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
-    <PackageReference Include="System.Reactive" Version="6.0.1" />
-    <PackageReference Include="System.Text.Json" Version="8.0.5" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
+    <PackageReference Include="System.Reactive" Version="6.1.0" />
+    <PackageReference Include="System.Text.Json" Version="9.0.10" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tests/CommunityToolkit.Mvvm.Roslyn4120.UnitTests/CommunityToolkit.Mvvm.Roslyn4120.UnitTests.csproj b/tests/CommunityToolkit.Mvvm.Roslyn4120.UnitTests/CommunityToolkit.Mvvm.Roslyn4120.UnitTests.csproj
index 3e20e320a..5dc6e1e8d 100644
--- a/tests/CommunityToolkit.Mvvm.Roslyn4120.UnitTests/CommunityToolkit.Mvvm.Roslyn4120.UnitTests.csproj
+++ b/tests/CommunityToolkit.Mvvm.Roslyn4120.UnitTests/CommunityToolkit.Mvvm.Roslyn4120.UnitTests.csproj
@@ -14,9 +14,9 @@
     <PackageReference Include="Dbs.Signed3.Nito.AsyncEx.Context" Version="5.0.0" />
     <PackageReference Include="MSTest.TestAdapter" Version="4.0.1" />
     <PackageReference Include="MSTest.TestFramework" Version="4.0.1" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
-    <PackageReference Include="System.Reactive" Version="6.0.1" />
-    <PackageReference Include="System.Text.Json" Version="8.0.5" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
+    <PackageReference Include="System.Reactive" Version="6.1.0" />
+    <PackageReference Include="System.Text.Json" Version="9.0.10" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4001.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4001.UnitTests.csproj b/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4001.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4001.UnitTests.csproj
index ba721a879..14d781120 100644
--- a/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4001.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4001.UnitTests.csproj
+++ b/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4001.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4001.UnitTests.csproj
@@ -8,9 +8,12 @@
     <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Analyzer.Testing" Version="1.1.2" />
     <PackageReference Include="Microsoft.CodeAnalysis.CSharp.CodeFix.Testing" Version="1.1.2" />
     <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.12.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
     <PackageReference Include="MSTest.TestAdapter" Version="4.0.1" />
     <PackageReference Include="MSTest.TestFramework" Version="4.0.1" />
+
+    <!-- Top-level override to fix address security vulnerability warnings -->
+    <PackageReference Include="System.Formats.Asn1" Version="9.0.10" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4031.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4031.UnitTests.csproj b/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4031.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4031.UnitTests.csproj
index 6fda8dbf1..7ef0f0e21 100644
--- a/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4031.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4031.UnitTests.csproj
+++ b/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4031.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4031.UnitTests.csproj
@@ -13,9 +13,12 @@
     <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Analyzer.Testing" Version="1.1.2" />
     <PackageReference Include="Microsoft.CodeAnalysis.CSharp.CodeFix.Testing" Version="1.1.2" />
     <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.12.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
     <PackageReference Include="MSTest.TestAdapter" Version="4.0.1" />
     <PackageReference Include="MSTest.TestFramework" Version="4.0.1" />
+
+    <!-- Top-level override to fix address security vulnerability warnings -->
+    <PackageReference Include="System.Formats.Asn1" Version="9.0.10" />
   </ItemGroup>
 
   <ItemGroup>
diff --git a/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4120.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4120.UnitTests.csproj b/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4120.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4120.UnitTests.csproj
index ce5108861..a67894b97 100644
--- a/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4120.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4120.UnitTests.csproj
+++ b/tests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4120.UnitTests/CommunityToolkit.Mvvm.SourceGenerators.Roslyn4120.UnitTests.csproj
@@ -9,9 +9,12 @@
     <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Analyzer.Testing" Version="1.1.2" />
     <PackageReference Include="Microsoft.CodeAnalysis.CSharp.CodeFix.Testing" Version="1.1.2" />
     <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.12.0" />
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.0" />
     <PackageReference Include="MSTest.TestAdapter" Version="4.0.1" />
     <PackageReference Include="MSTest.TestFramework" Version="4.0.1" />
+
+    <!-- Top-level override to fix address security vulnerability warnings -->
+    <PackageReference Include="System.Formats.Asn1" Version="9.0.10" />
   </ItemGroup>
 
   <ItemGroup>
