Bladeren bron

Migrate to .NET 8 (#5887)

* Change TargetFramework to net8.0

* Disable info messages

* Fix warings

* Disable additional analyzer messages

* Fix typo

* Add whitespace

* Fix ref vs in warnings

* Use explicit [In] on array parameters

* No need to guard Remove with Contains

* Use 'ArgumentOutOfRangeException.ThrowIf...' instead of explicitly throwing a new exception instance

* Bump .NET SDK version

* Enable JsonSerializerIsReflectionEnabledByDefault

* Use 8.0.100 GA release

* Bump System package versions

---------

Co-authored-by: Zoltan Csizmadia <Zoltan.Csizmadia@vericast.com>
Zoltan Csizmadia 2 jaren geleden
bovenliggende
commit
29e192f241
57 gewijzigde bestanden met toevoegingen van 121 en 123 verwijderingen
  1. 23 0
      .editorconfig
  2. 2 2
      .github/workflows/build.yml
  3. 1 1
      .github/workflows/release.yml
  4. 5 5
      Directory.Packages.props
  5. 1 1
      README.md
  6. 2 2
      global.json
  7. 1 1
      src/ARMeilleure/ARMeilleure.csproj
  8. 1 1
      src/Ryujinx.Audio.Backends.OpenAL/Ryujinx.Audio.Backends.OpenAL.csproj
  9. 1 1
      src/Ryujinx.Audio.Backends.SDL2/Ryujinx.Audio.Backends.SDL2.csproj
  10. 4 4
      src/Ryujinx.Audio.Backends.SoundIo/Ryujinx.Audio.Backends.SoundIo.csproj
  11. 2 2
      src/Ryujinx.Audio/Renderer/Utils/SpanIOHelper.cs
  12. 1 1
      src/Ryujinx.Audio/Ryujinx.Audio.csproj
  13. 13 3
      src/Ryujinx.Ava/Ryujinx.Ava.csproj
  14. 1 1
      src/Ryujinx.Ava/UI/Helpers/Win32NativeInterop.cs
  15. 1 1
      src/Ryujinx.Common/Ryujinx.Common.csproj
  16. 1 1
      src/Ryujinx.Cpu/Ryujinx.Cpu.csproj
  17. 1 1
      src/Ryujinx.Graphics.Device/Ryujinx.Graphics.Device.csproj
  18. 1 1
      src/Ryujinx.Graphics.GAL/Ryujinx.Graphics.GAL.csproj
  19. 1 1
      src/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj
  20. 5 20
      src/Ryujinx.Graphics.Gpu/Synchronization/SynchronizationManager.cs
  21. 1 1
      src/Ryujinx.Graphics.Host1x/Ryujinx.Graphics.Host1x.csproj
  22. 1 1
      src/Ryujinx.Graphics.Nvdec.FFmpeg/Ryujinx.Graphics.Nvdec.FFmpeg.csproj
  23. 1 1
      src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj
  24. 1 1
      src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj
  25. 1 1
      src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj
  26. 1 4
      src/Ryujinx.Graphics.Shader/IntermediateRepresentation/PhiNode.cs
  27. 1 1
      src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj
  28. 1 1
      src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj
  29. 5 4
      src/Ryujinx.Graphics.Texture/Utils/RgbaColor32.cs
  30. 1 1
      src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj
  31. 1 1
      src/Ryujinx.Graphics.Video/Ryujinx.Graphics.Video.csproj
  32. 1 1
      src/Ryujinx.Graphics.Vulkan/PipelineBase.cs
  33. 1 1
      src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj
  34. 0 4
      src/Ryujinx.Graphics.Vulkan/VulkanException.cs
  35. 0 2
      src/Ryujinx.HLE/Exceptions/ServiceNotImplementedException.cs
  36. 1 4
      src/Ryujinx.HLE/FileSystem/ContentManager.cs
  37. 1 4
      src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs
  38. 6 6
      src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/BsdMsgHdr.cs
  39. 1 1
      src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/IResolver.cs
  40. 3 3
      src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/Types/AddrInfoSerialized.cs
  41. 2 2
      src/Ryujinx.HLE/HOS/Services/Ssl/SslService/SslManagedSocketConnection.cs
  42. 1 1
      src/Ryujinx.HLE/Ryujinx.HLE.csproj
  43. 4 4
      src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj
  44. 1 1
      src/Ryujinx.Horizon.Common/Ryujinx.Horizon.Common.csproj
  45. 1 1
      src/Ryujinx.Horizon/Ryujinx.Horizon.csproj
  46. 1 1
      src/Ryujinx.Input.SDL2/Ryujinx.Input.SDL2.csproj
  47. 1 1
      src/Ryujinx.Input/Ryujinx.Input.csproj
  48. 2 8
      src/Ryujinx.Memory/Range/MultiRange.cs
  49. 1 1
      src/Ryujinx.Memory/Ryujinx.Memory.csproj
  50. 1 1
      src/Ryujinx.SDL2.Common/Ryujinx.SDL2.Common.csproj
  51. 1 1
      src/Ryujinx.ShaderTools/Ryujinx.ShaderTools.csproj
  52. 1 1
      src/Ryujinx.Tests.Memory/Ryujinx.Tests.Memory.csproj
  53. 1 1
      src/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj
  54. 1 1
      src/Ryujinx.Tests/Ryujinx.Tests.csproj
  55. 1 1
      src/Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj
  56. 3 3
      src/Ryujinx/Ryujinx.csproj
  57. 1 1
      src/Spv.Generator/Spv.Generator.csproj

+ 23 - 0
.editorconfig

@@ -233,6 +233,29 @@ dotnet_naming_style.IPascalCase.required_suffix =
 dotnet_naming_style.IPascalCase.word_separator =
 dotnet_naming_style.IPascalCase.capitalization = pascal_case
 
+# TODO:
+# .NET 8 migration (new warnings are caused by the NET 8 C# compiler and analyzer)
+# The following info messages might need to be fixed in the source code instead of hiding the actual message
+# Without the following lines, dotnet format would fail
+# Disable "Collection initialization can be simplified"
+dotnet_diagnostic.IDE0028.severity = none
+dotnet_diagnostic.IDE0300.severity = none
+dotnet_diagnostic.IDE0301.severity = none
+dotnet_diagnostic.IDE0302.severity = none
+dotnet_diagnostic.IDE0305.severity = none
+# Disable "'new' expression can be simplified"
+dotnet_diagnostic.IDE0090.severity = none
+# Disable "Use primary constructor"
+dotnet_diagnostic.IDE0290.severity = none
+# Disable "Member '' does not access instance data and can be marked as static"
+dotnet_diagnostic.CA1822.severity = none
+# Disable "Change type of field '' from '' to '' for improved performance"
+dotnet_diagnostic.CA1859.severity = none
+# Disable "Prefer 'static readonly' fields over constant array arguments if the called method is called repeatedly and is not mutating the passed array"
+dotnet_diagnostic.CA1861.severity = none
+# Disable "Prefer using 'string.Equals(string, StringComparison)' to perform a case-insensitive comparison, but keep in mind that this might cause subtle changes in behavior, so make sure to conduct thorough testing after applying the suggestion, or if culturally sensitive comparison is not required, consider using 'StringComparison.OrdinalIgnoreCase'"
+dotnet_diagnostic.CA1862.severity = none
+
 [src/Ryujinx.HLE/HOS/Services/**.cs]
 # Disable "mark members as static" rule for services
 dotnet_diagnostic.CA1822.severity = none

+ 2 - 2
.github/workflows/build.yml

@@ -30,7 +30,7 @@ jobs:
 
         - os: windows-latest
           OS_NAME: Windows x64
-          DOTNET_RUNTIME_IDENTIFIER: win10-x64
+          DOTNET_RUNTIME_IDENTIFIER: win-x64
           RELEASE_ZIP_OS_NAME: win_x64
 
       fail-fast: false
@@ -155,4 +155,4 @@ jobs:
         with:
           name: sdl2-ryujinx-headless-${{ matrix.configuration }}-${{ env.RYUJINX_BASE_VERSION }}+${{ steps.git_short_hash.outputs.result }}-macos_universal
           path: "publish_headless/*.tar.gz"
-        if: github.event_name == 'pull_request'
+        if: github.event_name == 'pull_request'

+ 1 - 1
.github/workflows/release.yml

@@ -59,7 +59,7 @@ jobs:
 
           - os: windows-latest
             OS_NAME: Windows x64
-            DOTNET_RUNTIME_IDENTIFIER: win10-x64
+            DOTNET_RUNTIME_IDENTIFIER: win-x64
             RELEASE_ZIP_OS_NAME: win_x64
     steps:
       - uses: actions/checkout@v4

+ 5 - 5
Directory.Packages.props

@@ -21,7 +21,7 @@
     <PackageVersion Include="LibHac" Version="0.19.0" />
     <PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" />
     <PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.7.0" />
-    <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.7.2" />
+    <PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
     <PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="2.3.2" />
     <PackageVersion Include="MsgPack.Cli" Version="1.0.1" />
     <PackageVersion Include="NetCoreServer" Version="7.0.0" />
@@ -45,10 +45,10 @@
     <PackageVersion Include="SixLabors.ImageSharp" Version="1.0.4" />
     <PackageVersion Include="SixLabors.ImageSharp.Drawing" Version="1.0.0-beta11" />
     <PackageVersion Include="SPB" Version="0.0.4-build28" />
-    <PackageVersion Include="System.Drawing.Common" Version="7.0.0" />
-    <PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="7.0.0" />
-    <PackageVersion Include="System.IO.Hashing" Version="7.0.0" />
-    <PackageVersion Include="System.Management" Version="7.0.2" />
+    <PackageVersion Include="System.Drawing.Common" Version="8.0.0" />
+    <PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="7.0.3" />
+    <PackageVersion Include="System.IO.Hashing" Version="8.0.0" />
+    <PackageVersion Include="System.Management" Version="8.0.0" />
     <PackageVersion Include="UnicornEngine.Unicorn" Version="2.0.2-rc1-fb78016" />
   </ItemGroup>
 </Project>

+ 1 - 1
README.md

@@ -68,7 +68,7 @@ The latest automatic build for Windows, macOS, and Linux can be found on the [Of
 If you wish to build the emulator yourself, follow these steps:
 
 ### Step 1
-Install the X64 version of [.NET 7.0 (or higher) SDK](https://dotnet.microsoft.com/download/dotnet/7.0).
+Install the X64 version of [.NET 8.0 (or higher) SDK](https://dotnet.microsoft.com/download/dotnet/8.0).
 
 ### Step 2
 Either use `git clone https://github.com/Ryujinx/Ryujinx` on the command line to clone the repository or use Code --> Download zip button to get the files.

+ 2 - 2
global.json

@@ -1,6 +1,6 @@
 {
   "sdk": {
-    "version": "7.0.200",
+    "version": "8.0.100",
     "rollForward": "latestFeature"
   }
-}
+}

+ 1 - 1
src/ARMeilleure/ARMeilleure.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 1 - 1
src/Ryujinx.Audio.Backends.OpenAL/Ryujinx.Audio.Backends.OpenAL.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
src/Ryujinx.Audio.Backends.SDL2/Ryujinx.Audio.Backends.SDL2.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 4 - 4
src/Ryujinx.Audio.Backends.SoundIo/Ryujinx.Audio.Backends.SoundIo.csproj

@@ -1,9 +1,9 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
-    <RuntimeIdentifiers>win10-x64;linux-x64;osx-x64</RuntimeIdentifiers>
+    <RuntimeIdentifiers>win-x64;osx-x64;linux-x64</RuntimeIdentifiers>
   </PropertyGroup>
 
   <ItemGroup>
@@ -15,11 +15,11 @@
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <TargetPath>libsoundio.dll</TargetPath>
     </ContentWithTargetPath>
-    <ContentWithTargetPath Include="Native\libsoundio\libs\libsoundio.dylib" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'win10-x64'">
+    <ContentWithTargetPath Include="Native\libsoundio\libs\libsoundio.dylib" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'win-x64'">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <TargetPath>libsoundio.dylib</TargetPath>
     </ContentWithTargetPath>
-    <ContentWithTargetPath Include="Native\libsoundio\libs\libsoundio.so" Condition="'$(RuntimeIdentifier)' != 'win10-x64' AND '$(RuntimeIdentifier)' != 'osx-x64'">
+    <ContentWithTargetPath Include="Native\libsoundio\libs\libsoundio.so" Condition="'$(RuntimeIdentifier)' != 'win-x64' AND '$(RuntimeIdentifier)' != 'osx-x64'">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
       <TargetPath>libsoundio.so</TargetPath>
     </ContentWithTargetPath>

+ 2 - 2
src/Ryujinx.Audio/Renderer/Utils/SpanIOHelper.cs

@@ -25,7 +25,7 @@ namespace Ryujinx.Audio.Renderer.Utils
                 throw new ArgumentOutOfRangeException(nameof(backingMemory), backingMemory.Length, null);
             }
 
-            MemoryMarshal.Write(backingMemory.Span[..size], ref data);
+            MemoryMarshal.Write(backingMemory.Span[..size], in data);
 
             backingMemory = backingMemory[size..];
         }
@@ -45,7 +45,7 @@ namespace Ryujinx.Audio.Renderer.Utils
                 throw new ArgumentOutOfRangeException(nameof(backingMemory), backingMemory.Length, null);
             }
 
-            MemoryMarshal.Write(backingMemory[..size], ref data);
+            MemoryMarshal.Write(backingMemory[..size], in data);
 
             backingMemory = backingMemory[size..];
         }

+ 1 - 1
src/Ryujinx.Audio/Ryujinx.Audio.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 13 - 3
src/Ryujinx.Ava/Ryujinx.Ava.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
-    <RuntimeIdentifiers>win10-x64;osx-x64;linux-x64</RuntimeIdentifiers>
+    <TargetFramework>net8.0</TargetFramework>
+    <RuntimeIdentifiers>win-x64;osx-x64;linux-x64</RuntimeIdentifiers>
     <OutputType>Exe</OutputType>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <Version>1.0.0-dirty</Version>
@@ -25,6 +25,16 @@
     <TrimMode>partial</TrimMode>
   </PropertyGroup>
 
+  <!--
+    FluentAvalonia, used in the Avalonia UI, requires a workaround for the json serializer used internally when using .NET 8+ System.Text.Json.
+    See:
+      https://github.com/amwx/FluentAvalonia/issues/481
+      https://devblogs.microsoft.com/dotnet/system-text-json-in-dotnet-8/
+  -->
+  <PropertyGroup>
+    <JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
+  </PropertyGroup>
+
   <ItemGroup>
     <PackageReference Include="Avalonia" />
     <PackageReference Include="Avalonia.Desktop" />
@@ -40,7 +50,7 @@
     <PackageReference Include="OpenTK.Core" />
     <PackageReference Include="Ryujinx.Audio.OpenAL.Dependencies" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'osx-x64' AND '$(RuntimeIdentifier)' != 'osx-arm64'" />
     <PackageReference Include="Ryujinx.Graphics.Nvdec.Dependencies" />
-    <PackageReference Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'win10-x64'" />
+    <PackageReference Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'win-x64'" />
     <PackageReference Include="Silk.NET.Vulkan" />
     <PackageReference Include="Silk.NET.Vulkan.Extensions.EXT" />
     <PackageReference Include="Silk.NET.Vulkan.Extensions.KHR" />

+ 1 - 1
src/Ryujinx.Ava/UI/Helpers/Win32NativeInterop.cs

@@ -86,7 +86,7 @@ namespace Ryujinx.Ava.UI.Helpers
         public static partial IntPtr SetCursor(IntPtr handle);
 
         [LibraryImport("user32.dll")]
-        public static partial IntPtr CreateCursor(IntPtr hInst, int xHotSpot, int yHotSpot, int nWidth, int nHeight, byte[] pvAndPlane, byte[] pvXorPlane);
+        public static partial IntPtr CreateCursor(IntPtr hInst, int xHotSpot, int yHotSpot, int nWidth, int nHeight, [In] byte[] pvAndPlane, [In] byte[] pvXorPlane);
 
         [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "RegisterClassExW")]
         public static partial ushort RegisterClassEx(ref WndClassEx param);

+ 1 - 1
src/Ryujinx.Common/Ryujinx.Common.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <DefineConstants Condition=" '$(ExtraDefineConstants)' != '' ">$(DefineConstants);$(ExtraDefineConstants)</DefineConstants>
   </PropertyGroup>

+ 1 - 1
src/Ryujinx.Cpu/Ryujinx.Cpu.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 1 - 1
src/Ryujinx.Graphics.Device/Ryujinx.Graphics.Device.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
 </Project>

+ 1 - 1
src/Ryujinx.Graphics.GAL/Ryujinx.Graphics.GAL.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">

+ 1 - 1
src/Ryujinx.Graphics.Gpu/Ryujinx.Graphics.Gpu.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 5 - 20
src/Ryujinx.Graphics.Gpu/Synchronization/SynchronizationManager.cs

@@ -37,10 +37,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization
         /// <returns>The incremented value of the syncpoint</returns>
         public uint IncrementSyncpoint(uint id)
         {
-            if (id >= MaxHardwareSyncpoints)
-            {
-                throw new ArgumentOutOfRangeException(nameof(id));
-            }
+            ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(id, (uint)MaxHardwareSyncpoints);
 
             return _syncpoints[id].Increment();
         }
@@ -53,10 +50,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization
         /// <returns>The value of the syncpoint</returns>
         public uint GetSyncpointValue(uint id)
         {
-            if (id >= MaxHardwareSyncpoints)
-            {
-                throw new ArgumentOutOfRangeException(nameof(id));
-            }
+            ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(id, (uint)MaxHardwareSyncpoints);
 
             return _syncpoints[id].Value;
         }
@@ -72,10 +66,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization
         /// <returns>The created SyncpointWaiterHandle object or null if already past threshold</returns>
         public SyncpointWaiterHandle RegisterCallbackOnSyncpoint(uint id, uint threshold, Action<SyncpointWaiterHandle> callback)
         {
-            if (id >= MaxHardwareSyncpoints)
-            {
-                throw new ArgumentOutOfRangeException(nameof(id));
-            }
+            ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(id, (uint)MaxHardwareSyncpoints);
 
             return _syncpoints[id].RegisterCallback(threshold, callback);
         }
@@ -88,10 +79,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization
         /// <exception cref="System.ArgumentOutOfRangeException">Thrown when id >= MaxHardwareSyncpoints</exception>
         public void UnregisterCallback(uint id, SyncpointWaiterHandle waiterInformation)
         {
-            if (id >= MaxHardwareSyncpoints)
-            {
-                throw new ArgumentOutOfRangeException(nameof(id));
-            }
+            ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(id, (uint)MaxHardwareSyncpoints);
 
             _syncpoints[id].UnregisterCallback(waiterInformation);
         }
@@ -107,10 +95,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization
         /// <returns>True if timed out</returns>
         public bool WaitOnSyncpoint(uint id, uint threshold, TimeSpan timeout)
         {
-            if (id >= MaxHardwareSyncpoints)
-            {
-                throw new ArgumentOutOfRangeException(nameof(id));
-            }
+            ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(id, (uint)MaxHardwareSyncpoints);
 
             // TODO: Remove this when GPU channel scheduling will be implemented.
             if (timeout == Timeout.InfiniteTimeSpan)

+ 1 - 1
src/Ryujinx.Graphics.Host1x/Ryujinx.Graphics.Host1x.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
src/Ryujinx.Graphics.Nvdec.FFmpeg/Ryujinx.Graphics.Nvdec.FFmpeg.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 1 - 1
src/Ryujinx.Graphics.Nvdec.Vp9/Ryujinx.Graphics.Nvdec.Vp9.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 1 - 1
src/Ryujinx.Graphics.Nvdec/Ryujinx.Graphics.Nvdec.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 1 - 1
src/Ryujinx.Graphics.OpenGL/Ryujinx.Graphics.OpenGL.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 1 - 4
src/Ryujinx.Graphics.Shader/IntermediateRepresentation/PhiNode.cs

@@ -69,10 +69,7 @@ namespace Ryujinx.Graphics.Shader.IntermediateRepresentation
 
         public Operand GetDest(int index)
         {
-            if (index != 0)
-            {
-                throw new ArgumentOutOfRangeException(nameof(index));
-            }
+            ArgumentOutOfRangeException.ThrowIfNotEqual(index, 0);
 
             return _dest;
         }

+ 1 - 1
src/Ryujinx.Graphics.Shader/Ryujinx.Graphics.Shader.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
src/Ryujinx.Graphics.Texture/Ryujinx.Graphics.Texture.csproj

@@ -1,6 +1,6 @@
 <Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 5 - 4
src/Ryujinx.Graphics.Texture/Utils/RgbaColor32.cs

@@ -1,4 +1,5 @@
 using System;
+using System.Diagnostics.CodeAnalysis;
 using System.Runtime.CompilerServices;
 using System.Runtime.Intrinsics;
 using System.Runtime.Intrinsics.X86;
@@ -102,11 +103,11 @@ namespace Ryujinx.Graphics.Texture.Utils
         }
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static RgbaColor32 operator <<(RgbaColor32 x, int shift)
+        public static RgbaColor32 operator <<(RgbaColor32 x, [ConstantExpected] byte shift)
         {
             if (Sse2.IsSupported)
             {
-                return new RgbaColor32(Sse2.ShiftLeftLogical(x._color, (byte)shift));
+                return new RgbaColor32(Sse2.ShiftLeftLogical(x._color, shift));
             }
             else
             {
@@ -115,11 +116,11 @@ namespace Ryujinx.Graphics.Texture.Utils
         }
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static RgbaColor32 operator >>(RgbaColor32 x, int shift)
+        public static RgbaColor32 operator >>(RgbaColor32 x, [ConstantExpected] byte shift)
         {
             if (Sse2.IsSupported)
             {
-                return new RgbaColor32(Sse2.ShiftRightLogical(x._color, (byte)shift));
+                return new RgbaColor32(Sse2.ShiftRightLogical(x._color, shift));
             }
             else
             {

+ 1 - 1
src/Ryujinx.Graphics.Vic/Ryujinx.Graphics.Vic.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 1 - 1
src/Ryujinx.Graphics.Video/Ryujinx.Graphics.Video.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
src/Ryujinx.Graphics.Vulkan/PipelineBase.cs

@@ -189,7 +189,7 @@ namespace Ryujinx.Graphics.Vulkan
                 PipelineStageFlags.AllCommandsBit,
                 0,
                 1,
-                new ReadOnlySpan<MemoryBarrier>(memoryBarrier),
+                new ReadOnlySpan<MemoryBarrier>(in memoryBarrier),
                 0,
                 ReadOnlySpan<BufferMemoryBarrier>.Empty,
                 0,

+ 1 - 1
src/Ryujinx.Graphics.Vulkan/Ryujinx.Graphics.Vulkan.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">

+ 0 - 4
src/Ryujinx.Graphics.Vulkan/VulkanException.cs

@@ -33,9 +33,5 @@ namespace Ryujinx.Graphics.Vulkan
         public VulkanException(string message, Exception innerException) : base(message, innerException)
         {
         }
-
-        protected VulkanException(SerializationInfo info, StreamingContext context) : base(info, context)
-        {
-        }
     }
 }

+ 0 - 2
src/Ryujinx.HLE/Exceptions/ServiceNotImplementedException.cs

@@ -35,8 +35,6 @@ namespace Ryujinx.HLE.Exceptions
             Request = context.Request;
         }
 
-        protected ServiceNotImplementedException(SerializationInfo info, StreamingContext context) : base(info, context) { }
-
         public override string Message
         {
             get

+ 1 - 4
src/Ryujinx.HLE/FileSystem/ContentManager.cs

@@ -420,10 +420,7 @@ namespace Ryujinx.HLE.FileSystem
 
             if (locationList != null)
             {
-                if (locationList.Contains(entry))
-                {
-                    locationList.Remove(entry);
-                }
+                locationList.Remove(entry);
 
                 locationList.AddLast(entry);
             }

+ 1 - 4
src/Ryujinx.HLE/HOS/Services/Nv/NvDrvServices/NvHostCtrl/Types/NvHostSyncPt.cs

@@ -85,10 +85,7 @@ namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrl
 
         public void SetSyncpointMinEqualSyncpointMax(uint id)
         {
-            if (id >= SynchronizationManager.MaxHardwareSyncpoints)
-            {
-                throw new ArgumentOutOfRangeException(nameof(id));
-            }
+            ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(id, (uint)SynchronizationManager.MaxHardwareSyncpoints);
 
             int value = (int)ReadSyncpointValue(id);
 

+ 6 - 6
src/Ryujinx.HLE/HOS/Services/Sockets/Bsd/Types/BsdMsgHdr.cs

@@ -27,7 +27,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types
             int controlLength = message.Control == null ? 0 : message.Control.Length;
             BsdSocketFlags flags = message.Flags;
 
-            if (!MemoryMarshal.TryWrite(rawData, ref msgNameLength))
+            if (!MemoryMarshal.TryWrite(rawData, in msgNameLength))
             {
                 return LinuxError.EFAULT;
             }
@@ -45,7 +45,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types
                 rawData = rawData[msgNameLength..];
             }
 
-            if (!MemoryMarshal.TryWrite(rawData, ref iovCount))
+            if (!MemoryMarshal.TryWrite(rawData, in iovCount))
             {
                 return LinuxError.EFAULT;
             }
@@ -58,7 +58,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types
                 {
                     ulong iovLength = (ulong)message.Iov[index].Length;
 
-                    if (!MemoryMarshal.TryWrite(rawData, ref iovLength))
+                    if (!MemoryMarshal.TryWrite(rawData, in iovLength))
                     {
                         return LinuxError.EFAULT;
                     }
@@ -78,7 +78,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types
                 }
             }
 
-            if (!MemoryMarshal.TryWrite(rawData, ref controlLength))
+            if (!MemoryMarshal.TryWrite(rawData, in controlLength))
             {
                 return LinuxError.EFAULT;
             }
@@ -96,14 +96,14 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Bsd.Types
                 rawData = rawData[controlLength..];
             }
 
-            if (!MemoryMarshal.TryWrite(rawData, ref flags))
+            if (!MemoryMarshal.TryWrite(rawData, in flags))
             {
                 return LinuxError.EFAULT;
             }
 
             rawData = rawData[sizeof(BsdSocketFlags)..];
 
-            if (!MemoryMarshal.TryWrite(rawData, ref message.Length))
+            if (!MemoryMarshal.TryWrite(rawData, in message.Length))
             {
                 return LinuxError.EFAULT;
             }

+ 1 - 1
src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/IResolver.cs

@@ -654,7 +654,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres
             }
 
             uint sentinel = 0;
-            MemoryMarshal.Write(data, ref sentinel);
+            MemoryMarshal.Write(data, in sentinel);
             data = data[sizeof(uint)..];
 
             return region.Memory.Span.Length - data.Length;

+ 3 - 3
src/Ryujinx.HLE/HOS/Services/Sockets/Sfdnsres/Types/AddrInfoSerialized.cs

@@ -94,7 +94,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres.Types
 
             Header.ToNetworkOrder();
 
-            MemoryMarshal.Write(buffer, ref Header);
+            MemoryMarshal.Write(buffer, in Header);
 
             buffer = buffer[Unsafe.SizeOf<AddrInfoSerializedHeader>()..];
 
@@ -103,7 +103,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres.Types
                 AddrInfo4 socketAddress = SocketAddress.Value;
                 socketAddress.ToNetworkOrder();
 
-                MemoryMarshal.Write(buffer, ref socketAddress);
+                MemoryMarshal.Write(buffer, in socketAddress);
 
                 buffer = buffer[Unsafe.SizeOf<AddrInfo4>()..];
             }
@@ -117,7 +117,7 @@ namespace Ryujinx.HLE.HOS.Services.Sockets.Sfdnsres.Types
                 Array4<byte> rawIPv4Address = RawIPv4Address.Value;
                 AddrInfo4.RawIpv4AddressNetworkEndianSwap(ref rawIPv4Address);
 
-                MemoryMarshal.Write(buffer, ref rawIPv4Address);
+                MemoryMarshal.Write(buffer, in rawIPv4Address);
 
                 buffer = buffer[Unsafe.SizeOf<Array4<byte>>()..];
             }

+ 2 - 2
src/Ryujinx.HLE/HOS/Services/Ssl/SslService/SslManagedSocketConnection.cs

@@ -161,7 +161,7 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService
                 }
                 else
                 {
-                    throw exception;
+                    throw;
                 }
             }
             finally
@@ -206,7 +206,7 @@ namespace Ryujinx.HLE.HOS.Services.Ssl.SslService
                 }
                 else
                 {
-                    throw exception;
+                    throw;
                 }
             }
             finally

+ 1 - 1
src/Ryujinx.HLE/Ryujinx.HLE.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 4 - 4
src/Ryujinx.Headless.SDL2/Ryujinx.Headless.SDL2.csproj

@@ -1,8 +1,8 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
-    <RuntimeIdentifiers>win10-x64;osx-x64;linux-x64</RuntimeIdentifiers>
+    <TargetFramework>net8.0</TargetFramework>
+    <RuntimeIdentifiers>win-x64;osx-x64;linux-x64</RuntimeIdentifiers>
     <OutputType>Exe</OutputType>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <Version>1.0.0-dirty</Version>
@@ -34,7 +34,7 @@
 
   <ItemGroup>
     <PackageReference Include="CommandLineParser" />
-    <PackageReference Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'win10-x64'" />
+    <PackageReference Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'win-x64'" />
   </ItemGroup>
 
   <ItemGroup>
@@ -69,4 +69,4 @@
     <PublishTrimmed>true</PublishTrimmed>
     <TrimMode>partial</TrimMode>
   </PropertyGroup>
-</Project>
+</Project>

+ 1 - 1
src/Ryujinx.Horizon.Common/Ryujinx.Horizon.Common.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
src/Ryujinx.Horizon/Ryujinx.Horizon.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
src/Ryujinx.Input.SDL2/Ryujinx.Input.SDL2.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 1 - 1
src/Ryujinx.Input/Ryujinx.Input.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 2 - 8
src/Ryujinx.Memory/Range/MultiRange.cs

@@ -52,10 +52,7 @@ namespace Ryujinx.Memory.Range
         {
             if (HasSingleRange)
             {
-                if (_singleRange.Size - offset < size)
-                {
-                    throw new ArgumentOutOfRangeException(nameof(size));
-                }
+                ArgumentOutOfRangeException.ThrowIfGreaterThan(size, _singleRange.Size - offset);
 
                 return new MultiRange(_singleRange.Address + offset, size);
             }
@@ -108,10 +105,7 @@ namespace Ryujinx.Memory.Range
         {
             if (HasSingleRange)
             {
-                if (index != 0)
-                {
-                    throw new ArgumentOutOfRangeException(nameof(index));
-                }
+                ArgumentOutOfRangeException.ThrowIfNotEqual(index, 0);
 
                 return _singleRange;
             }

+ 1 - 1
src/Ryujinx.Memory/Ryujinx.Memory.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 1 - 1
src/Ryujinx.SDL2.Common/Ryujinx.SDL2.Common.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
   <ItemGroup>

+ 1 - 1
src/Ryujinx.ShaderTools/Ryujinx.ShaderTools.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <OutputType>Exe</OutputType>
     <Configurations>Debug;Release</Configurations>
   </PropertyGroup>

+ 1 - 1
src/Ryujinx.Tests.Memory/Ryujinx.Tests.Memory.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <IsPackable>false</IsPackable>
   </PropertyGroup>
 

+ 1 - 1
src/Ryujinx.Tests.Unicorn/Ryujinx.Tests.Unicorn.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <Configurations>Debug;Release</Configurations>
   </PropertyGroup>

+ 1 - 1
src/Ryujinx.Tests/Ryujinx.Tests.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <OutputType>Exe</OutputType>
     <IsPackable>false</IsPackable>
 

+ 1 - 1
src/Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 

+ 3 - 3
src/Ryujinx/Ryujinx.csproj

@@ -1,8 +1,8 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
-    <RuntimeIdentifiers>win10-x64;osx-x64;linux-x64</RuntimeIdentifiers>
+    <TargetFramework>net8.0</TargetFramework>
+    <RuntimeIdentifiers>win-x64;osx-x64;linux-x64</RuntimeIdentifiers>
     <OutputType>Exe</OutputType>
     <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
     <Version>1.0.0-dirty</Version>
@@ -25,7 +25,7 @@
     <PackageReference Include="GtkSharp.Dependencies.osx" Condition="'$(RuntimeIdentifier)' == 'osx-x64' OR '$(RuntimeIdentifier)' == 'osx-arm64'" />
     <PackageReference Include="Ryujinx.Graphics.Nvdec.Dependencies" />
     <PackageReference Include="Ryujinx.Audio.OpenAL.Dependencies" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'osx-x64' AND '$(RuntimeIdentifier)' != 'osx-arm64'" />
-    <PackageReference Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'win10-x64'" />
+    <PackageReference Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Condition="'$(RuntimeIdentifier)' != 'linux-x64' AND '$(RuntimeIdentifier)' != 'win-x64'" />
     <PackageReference Include="OpenTK.Core" />
     <PackageReference Include="OpenTK.Graphics" />
     <PackageReference Include="SPB" />

+ 1 - 1
src/Spv.Generator/Spv.Generator.csproj

@@ -1,7 +1,7 @@
 <Project Sdk="Microsoft.NET.Sdk">
 
   <PropertyGroup>
-    <TargetFramework>net7.0</TargetFramework>
+    <TargetFramework>net8.0</TargetFramework>
   </PropertyGroup>
 
 </Project>