Răsfoiți Sursa

Replace `DllImport` usage with `LibraryImport` (#4084)

* Replace usage of `DllImport` with `LibraryImport`

* Mark methods as `partial`

* Marshalling

* More `partial` & marshalling

* More `partial` and marshalling

* More partial and marshalling

* Update GdiPlusHelper to LibraryImport

* Unicorn

* More Partial

* Marshal

* Specify EntryPoint

* Specify EntryPoint

* Change GlobalMemoryStatusEx to LibraryImport

* Change RegisterClassEx to LibraryImport

* Define EntryPoints

* Update Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs

Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>

* Update Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs

Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>

* Move return mashal

* Remove calling convention specification

* Remove calling conventions

* Update Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs

Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>

* Update Ryujinx/Modules/Updater/Updater.cs

Co-authored-by: Mary-nyan <thog@protonmail.com>

* Update Ryujinx.Ava/Modules/Updater/Updater.cs

Co-authored-by: Mary-nyan <thog@protonmail.com>

Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com>
Co-authored-by: Mary-nyan <thog@protonmail.com>
Isaac Marovitz 3 ani în urmă
părinte
comite
0fbcd630bc
30 a modificat fișierele cu 308 adăugiri și 299 ștergeri
  1. 5 5
      ARMeilleure/Signal/UnixSignalHandlerRegistration.cs
  2. 9 9
      ARMeilleure/Signal/WindowsSignalHandlerRegistration.cs
  3. 5 4
      ARMeilleure/Translation/Cache/JitUnwindWindows.cs
  4. 1 1
      Ryujinx.Ava/AppHost.cs
  5. 17 17
      Ryujinx.Ava/Helper/MetalHelper.cs
  6. 4 4
      Ryujinx.Ava/Program.cs
  7. 5 3
      Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs
  8. 23 29
      Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs
  9. 3 3
      Ryujinx.Common/GraphicsDriver/NVThreadedOptimization.cs
  10. 12 9
      Ryujinx.Common/Memory/PartialUnmaps/PartialUnmapState.cs
  11. 9 9
      Ryujinx.Common/SystemInfo/MacOSSystemInfo.cs
  12. 6 6
      Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs
  13. 4 4
      Ryujinx.Common/SystemInterop/DisplaySleep.cs
  14. 15 14
      Ryujinx.Common/SystemInterop/ForceDpiAware.cs
  15. 10 10
      Ryujinx.Common/SystemInterop/GdiPlusHelper.cs
  16. 8 8
      Ryujinx.Common/SystemInterop/WindowsMultimediaTimerResolution.cs
  17. 33 33
      Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs
  18. 3 3
      Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs
  19. 3 3
      Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs
  20. 1 1
      Ryujinx.Headless.SDL2/Program.cs
  21. 23 23
      Ryujinx.Memory/MemoryManagerUnixHelper.cs
  22. 30 25
      Ryujinx.Memory/WindowsShared/WindowsApi.cs
  23. 28 27
      Ryujinx.Tests.Unicorn/Native/Interface.cs
  24. 6 5
      Ryujinx.Ui.Common/Helper/ConsoleHelper.cs
  25. 1 0
      Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj
  26. 10 10
      Ryujinx/Program.cs
  27. 7 7
      Ryujinx/Ui/GLRenderer.cs
  28. 19 19
      Ryujinx/Ui/Helper/MetalHelper.cs
  29. 1 1
      Ryujinx/Ui/MainWindow.cs
  30. 7 7
      Ryujinx/Ui/VKRenderer.cs

+ 5 - 5
ARMeilleure/Signal/UnixSignalHandlerRegistration.cs

@@ -18,17 +18,17 @@ namespace ARMeilleure.Signal
         public IntPtr sa_restorer;
     }
 
-    static class UnixSignalHandlerRegistration
+    static partial class UnixSignalHandlerRegistration
     {
         private const int SIGSEGV = 11;
         private const int SIGBUS = 10;
         private const int SA_SIGINFO = 0x00000004;
 
-        [DllImport("libc", SetLastError = true)]
-        private static extern int sigaction(int signum, ref SigAction sigAction, out SigAction oldAction);
+        [LibraryImport("libc", SetLastError = true)]
+        private static partial int sigaction(int signum, ref SigAction sigAction, out SigAction oldAction);
 
-        [DllImport("libc", SetLastError = true)]
-        private static extern int sigemptyset(ref SigSet set);
+        [LibraryImport("libc", SetLastError = true)]
+        private static partial int sigemptyset(ref SigSet set);
 
         public static SigAction RegisterExceptionHandler(IntPtr action)
         {

+ 9 - 9
ARMeilleure/Signal/WindowsSignalHandlerRegistration.cs

@@ -3,19 +3,19 @@ using System.Runtime.InteropServices;
 
 namespace ARMeilleure.Signal
 {
-    unsafe class WindowsSignalHandlerRegistration
+    unsafe partial class WindowsSignalHandlerRegistration
     {
-        [DllImport("kernel32.dll")]
-        private static extern IntPtr AddVectoredExceptionHandler(uint first, IntPtr handler);
+        [LibraryImport("kernel32.dll")]
+        private static partial IntPtr AddVectoredExceptionHandler(uint first, IntPtr handler);
 
-        [DllImport("kernel32.dll")]
-        private static extern ulong RemoveVectoredExceptionHandler(IntPtr handle);
+        [LibraryImport("kernel32.dll")]
+        private static partial ulong RemoveVectoredExceptionHandler(IntPtr handle);
 
-        [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Ansi)]
-        static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName);
+        [LibraryImport("kernel32.dll", SetLastError = true, EntryPoint = "LoadLibraryA")]
+        private static partial IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName);
 
-        [DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
-        private static extern IntPtr GetProcAddress(IntPtr hModule, string procName);
+        [LibraryImport("kernel32.dll", SetLastError = true)]
+        private static partial IntPtr GetProcAddress(IntPtr hModule, [MarshalAs(UnmanagedType.LPStr)] string procName);
 
         private static IntPtr _getCurrentThreadIdPtr;
 

+ 5 - 4
ARMeilleure/Translation/Cache/JitUnwindWindows.cs

@@ -7,7 +7,7 @@ using System.Runtime.InteropServices;
 
 namespace ARMeilleure.Translation.Cache
 {
-    static class JitUnwindWindows
+    static partial class JitUnwindWindows
     {
         private const int MaxUnwindCodesArraySize = 32; // Must be an even value.
 
@@ -42,14 +42,15 @@ namespace ARMeilleure.Translation.Cache
 
         private unsafe delegate RuntimeFunction* GetRuntimeFunctionCallback(ulong controlPc, IntPtr context);
 
-        [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
-        private static unsafe extern bool RtlInstallFunctionTableCallback(
+        [LibraryImport("kernel32.dll")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private static unsafe partial bool RtlInstallFunctionTableCallback(
             ulong tableIdentifier,
             ulong baseAddress,
             uint length,
             GetRuntimeFunctionCallback callback,
             IntPtr context,
-            string outOfProcessCallbackDll);
+            [MarshalAs(UnmanagedType.LPWStr)] string outOfProcessCallbackDll);
 
         private static GetRuntimeFunctionCallback _getRuntimeFunctionCallback;
 

+ 1 - 1
Ryujinx.Ava/AppHost.cs

@@ -17,7 +17,7 @@ using Ryujinx.Ava.Ui.Windows;
 using Ryujinx.Common;
 using Ryujinx.Common.Configuration;
 using Ryujinx.Common.Logging;
-using Ryujinx.Common.System;
+using Ryujinx.Common.SystemInterop;
 using Ryujinx.Graphics.GAL;
 using Ryujinx.Graphics.GAL.Multithreading;
 using Ryujinx.Graphics.Gpu;

+ 17 - 17
Ryujinx.Ava/Helper/MetalHelper.cs

@@ -8,7 +8,7 @@ namespace Ryujinx.Ava.Ui.Helper
     public delegate void UpdateBoundsCallbackDelegate(Rect rect);
 
     [SupportedOSPlatform("macos")]
-    static class MetalHelper
+    static partial class MetalHelper
     {
         private const string LibObjCImport = "/usr/lib/libobjc.A.dylib";
 
@@ -100,28 +100,28 @@ namespace Ryujinx.Ava.Ui.Helper
             // TODO
         }
 
-        [DllImport(LibObjCImport)]
-        private static unsafe extern IntPtr sel_registerName(byte* data);
+        [LibraryImport(LibObjCImport)]
+        private static unsafe partial IntPtr sel_registerName(byte* data);
 
-        [DllImport(LibObjCImport)]
-        private static unsafe extern IntPtr objc_getClass(byte* data);
+        [LibraryImport(LibObjCImport)]
+        private static unsafe partial IntPtr objc_getClass(byte* data);
 
-        [DllImport(LibObjCImport)]
-        private static extern void objc_msgSend(IntPtr receiver, Selector selector);
+        [LibraryImport(LibObjCImport)]
+        private static partial void objc_msgSend(IntPtr receiver, Selector selector);
 
-        [DllImport(LibObjCImport)]
-        private static extern void objc_msgSend(IntPtr receiver, Selector selector, byte value);
+        [LibraryImport(LibObjCImport)]
+        private static partial void objc_msgSend(IntPtr receiver, Selector selector, byte value);
 
-        [DllImport(LibObjCImport)]
-        private static extern void objc_msgSend(IntPtr receiver, Selector selector, IntPtr value);
+        [LibraryImport(LibObjCImport)]
+        private static partial void objc_msgSend(IntPtr receiver, Selector selector, IntPtr value);
 
-        [DllImport(LibObjCImport)]
-        private static extern void objc_msgSend(IntPtr receiver, Selector selector, NSRect point);
+        [LibraryImport(LibObjCImport)]
+        private static partial void objc_msgSend(IntPtr receiver, Selector selector, NSRect point);
 
-        [DllImport(LibObjCImport)]
-        private static extern void objc_msgSend(IntPtr receiver, Selector selector, double value);
+        [LibraryImport(LibObjCImport)]
+        private static partial void objc_msgSend(IntPtr receiver, Selector selector, double value);
 
-        [DllImport(LibObjCImport, EntryPoint = "objc_msgSend")]
-        private static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector);
+        [LibraryImport(LibObjCImport, EntryPoint = "objc_msgSend")]
+        private static partial IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector);
     }
 }

+ 4 - 4
Ryujinx.Ava/Program.cs

@@ -6,7 +6,7 @@ using Ryujinx.Common;
 using Ryujinx.Common.Configuration;
 using Ryujinx.Common.GraphicsDriver;
 using Ryujinx.Common.Logging;
-using Ryujinx.Common.System;
+using Ryujinx.Common.SystemInterop;
 using Ryujinx.Common.SystemInfo;
 using Ryujinx.Modules;
 using Ryujinx.SDL2.Common;
@@ -20,7 +20,7 @@ using System.Threading.Tasks;
 
 namespace Ryujinx.Ava
 {
-    internal class Program
+    internal partial class Program
     {
         public static double WindowScaleFactor  { get; set; }
         public static double DesktopScaleFactor { get; set; } = 1.0;
@@ -28,8 +28,8 @@ namespace Ryujinx.Ava
         public static string ConfigurationPath  { get; private set; }
         public static bool   PreviewerDetached {  get; private set; }
 
-        [DllImport("user32.dll", SetLastError = true)]
-        public static extern int MessageBoxA(IntPtr hWnd, string text, string caption, uint type);
+        [LibraryImport("user32.dll", SetLastError = true)]
+        public static partial int MessageBoxA(IntPtr hWnd, [MarshalAs(UnmanagedType.LPStr)] string text, [MarshalAs(UnmanagedType.LPStr)] string caption, uint type);
 
         private const uint MB_ICONWARNING = 0x30;
 

+ 5 - 3
Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs

@@ -125,9 +125,9 @@ namespace Ryujinx.Ava.Ui.Controls
             {
                 cbSize = Marshal.SizeOf<WNDCLASSEX>(),
                 hInstance = GetModuleHandle(null),
-                lpfnWndProc = _wndProcDelegate,
+                lpfnWndProc = Marshal.GetFunctionPointerForDelegate(_wndProcDelegate),
                 style = ClassStyles.CS_OWNDC,
-                lpszClassName = _className,
+                lpszClassName = Marshal.StringToHGlobalUni(_className),
                 hCursor = LoadCursor(IntPtr.Zero, (IntPtr)Cursors.IDC_ARROW)
             };
 
@@ -148,7 +148,9 @@ namespace Ryujinx.Ava.Ui.Controls
                 IntPtr.Zero);
 
             WindowHandle = handle;
-
+            
+            Marshal.FreeHGlobal(wndClassEx.lpszClassName);
+            
             return new PlatformHandle(WindowHandle, "HWND");
         }
 

+ 23 - 29
Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs

@@ -5,7 +5,7 @@ using System.Runtime.Versioning;
 namespace Ryujinx.Ava.Ui.Controls
 {
     [SupportedOSPlatform("windows")]
-    internal class Win32NativeInterop
+    internal partial class Win32NativeInterop
     {
         [Flags]
         public enum ClassStyles : uint
@@ -48,58 +48,52 @@ namespace Ryujinx.Ava.Ui.Controls
         [UnmanagedFunctionPointer(CallingConvention.Winapi)]
         internal delegate IntPtr WindowProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam);
 
-        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
+        [StructLayout(LayoutKind.Sequential)]
         public struct WNDCLASSEX
         {
             public int cbSize;
             public ClassStyles style;
-            [MarshalAs(UnmanagedType.FunctionPtr)]
-            public WindowProc lpfnWndProc; // not WndProc
+            public IntPtr lpfnWndProc; // not WndProc
             public int cbClsExtra;
             public int cbWndExtra;
             public IntPtr hInstance;
             public IntPtr hIcon;
             public IntPtr hCursor;
             public IntPtr hbrBackground;
-            [MarshalAs(UnmanagedType.LPWStr)]
-            public string lpszMenuName;
-            [MarshalAs(UnmanagedType.LPWStr)]
-            public string lpszClassName;
+            public IntPtr lpszMenuName;
+            public IntPtr lpszClassName;
             public IntPtr hIconSm;
 
-            public static WNDCLASSEX Create()
+            public WNDCLASSEX()
             {
-                return new WNDCLASSEX
-                {
-                    cbSize = Marshal.SizeOf<WNDCLASSEX>()
-                };
+                cbSize = Marshal.SizeOf<WNDCLASSEX>();
             }
         }
 
-        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
-        public static extern ushort RegisterClassEx(ref WNDCLASSEX param);
+        [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "RegisterClassExW")]
+        public static partial ushort RegisterClassEx(ref WNDCLASSEX param);
 
-        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
-        public static extern short UnregisterClass([MarshalAs(UnmanagedType.LPWStr)] string lpClassName, IntPtr instance);
+        [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "UnregisterClassW")]
+        public static partial short UnregisterClass([MarshalAs(UnmanagedType.LPWStr)] string lpClassName, IntPtr instance);
 
-        [DllImport("user32.dll", CharSet = CharSet.Unicode)]
-        public static extern IntPtr DefWindowProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam);
+        [LibraryImport("user32.dll", EntryPoint = "DefWindowProcW")]
+        public static partial IntPtr DefWindowProc(IntPtr hWnd, WindowsMessages msg, IntPtr wParam, IntPtr lParam);
 
-        [DllImport("kernel32.dll")]
-        public static extern IntPtr GetModuleHandle(string lpModuleName);
+        [LibraryImport("kernel32.dll", EntryPoint = "GetModuleHandleA")]
+        public static partial IntPtr GetModuleHandle([MarshalAs(UnmanagedType.LPStr)] string lpModuleName);
 
-        [DllImport("user32.dll", SetLastError = true)]
+        [LibraryImport("user32.dll", SetLastError = true)]
         [return: MarshalAs(UnmanagedType.Bool)]
-        public static extern bool DestroyWindow(IntPtr hwnd);
+        public static partial bool DestroyWindow(IntPtr hwnd);
 
-        [DllImport("user32.dll", SetLastError = true)]
-        public static extern IntPtr LoadCursor(IntPtr hInstance, IntPtr lpCursorName);
+        [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "LoadCursorA")]
+        public static partial IntPtr LoadCursor(IntPtr hInstance, IntPtr lpCursorName);
 
-        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
-        public static extern IntPtr CreateWindowEx(
+        [LibraryImport("user32.dll", SetLastError = true, EntryPoint = "CreateWindowExW")]
+        public static partial IntPtr CreateWindowEx(
            uint dwExStyle,
-           string lpClassName,
-           string lpWindowName,
+           [MarshalAs(UnmanagedType.LPWStr)] string lpClassName,
+           [MarshalAs(UnmanagedType.LPWStr)] string lpWindowName,
            WindowStyles dwStyle,
            int x,
            int y,

+ 3 - 3
Ryujinx.Common/GraphicsDriver/NVThreadedOptimization.cs

@@ -5,7 +5,7 @@ using System.Runtime.InteropServices;
 
 namespace Ryujinx.Common.GraphicsDriver
 {
-    static class NVThreadedOptimization
+    static partial class NVThreadedOptimization
     {
         private const string ProfileName = "Ryujinx Nvidia Profile";
 
@@ -19,8 +19,8 @@ namespace Ryujinx.Common.GraphicsDriver
         private const uint NvAPI_DRS_SaveSettings_ID = 0xFCBC7E14;
         private const uint NvAPI_DRS_DestroySession_ID = 0x0DAD9CFF8;
 
-        [DllImport("nvapi64")]
-        private static extern IntPtr nvapi_QueryInterface(uint id);
+        [LibraryImport("nvapi64")]
+        private static partial IntPtr nvapi_QueryInterface(uint id);
 
         private delegate int NvAPI_InitializeDelegate();
         private static NvAPI_InitializeDelegate NvAPI_Initialize;

+ 12 - 9
Ryujinx.Common/Memory/PartialUnmaps/PartialUnmapState.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
+using System.Runtime.InteropServices.Marshalling;
 using System.Runtime.Versioning;
 using System.Threading;
 
@@ -12,7 +13,7 @@ namespace Ryujinx.Common.Memory.PartialUnmaps
     /// State for partial unmaps. Intended to be used on Windows.
     /// </summary>
     [StructLayout(LayoutKind.Sequential, Pack = 1)]
-    public struct PartialUnmapState
+    public partial struct PartialUnmapState
     {
         public NativeReaderWriterLock PartialUnmapLock;
         public int PartialUnmapsCount;
@@ -25,20 +26,22 @@ namespace Ryujinx.Common.Memory.PartialUnmaps
         public readonly static IntPtr GlobalState;
 
         [SupportedOSPlatform("windows")]
-        [DllImport("kernel32.dll")]
-        public static extern int GetCurrentThreadId();
+        [LibraryImport("kernel32.dll")]
+        public static partial int GetCurrentThreadId();
 
         [SupportedOSPlatform("windows")]
-        [DllImport("kernel32.dll", SetLastError = true)]
-        static extern IntPtr OpenThread(int dwDesiredAccess, bool bInheritHandle, uint dwThreadId);
+        [LibraryImport("kernel32.dll", SetLastError = true)]
+        private static partial IntPtr OpenThread(int dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, uint dwThreadId);
 
         [SupportedOSPlatform("windows")]
-        [DllImport("kernel32.dll", SetLastError = true)]
-        public static extern bool CloseHandle(IntPtr hObject);
+        [LibraryImport("kernel32.dll", SetLastError = true)]
+        [return: MarshalAs (UnmanagedType.Bool)]
+        public static partial bool CloseHandle(IntPtr hObject);
 
         [SupportedOSPlatform("windows")]
-        [DllImport("kernel32.dll", SetLastError = true)]
-        static extern bool GetExitCodeThread(IntPtr hThread, out uint lpExitCode);
+        [LibraryImport("kernel32.dll", SetLastError = true)]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private static partial bool GetExitCodeThread(IntPtr hThread, out uint lpExitCode);
 
         /// <summary>
         /// Creates a global static PartialUnmapState and populates the field offsets.

+ 9 - 9
Ryujinx.Common/SystemInfo/MacOSSystemInfo.cs

@@ -8,7 +8,7 @@ using Ryujinx.Common.Logging;
 namespace Ryujinx.Common.SystemInfo
 {
     [SupportedOSPlatform("macos")]
-    class MacOSSystemInfo : SystemInfo
+    partial class MacOSSystemInfo : SystemInfo
     {
         internal MacOSSystemInfo()
         {
@@ -60,8 +60,8 @@ namespace Ryujinx.Common.SystemInfo
 
         private const string SystemLibraryName = "libSystem.dylib";
 
-        [DllImport(SystemLibraryName, CharSet = CharSet.Ansi, SetLastError = true)]
-        private static extern int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize, IntPtr newValue, ulong newValueSize);
+        [LibraryImport(SystemLibraryName, SetLastError = true)]
+        private static partial int sysctlbyname([MarshalAs(UnmanagedType.LPStr)] string name, IntPtr oldValue, ref ulong oldSize, IntPtr newValue, ulong newValueSize);
 
         private static int sysctlbyname(string name, IntPtr oldValue, ref ulong oldSize)
         {
@@ -116,11 +116,11 @@ namespace Ryujinx.Common.SystemInfo
             return res;
         }
 
-        [DllImport(SystemLibraryName, CharSet = CharSet.Ansi, SetLastError = true)]
-        private static extern uint mach_host_self();
+        [LibraryImport(SystemLibraryName, SetLastError = true)]
+        private static partial uint mach_host_self();
 
-        [DllImport(SystemLibraryName, CharSet = CharSet.Ansi, SetLastError = true)]
-        private static extern int host_page_size(uint host, ref uint out_page_size);
+        [LibraryImport(SystemLibraryName, SetLastError = true)]
+        private static partial int host_page_size(uint host, ref uint out_page_size);
 
         [StructLayout(LayoutKind.Sequential, Pack = 8)]
         struct VMStatistics64
@@ -151,7 +151,7 @@ namespace Ryujinx.Common.SystemInfo
             public ulong TotalUncompressedPagesInCompressor;
         }
 
-        [DllImport(SystemLibraryName, CharSet = CharSet.Ansi, SetLastError = true)]
-        private static extern int host_statistics64(uint host_priv, int host_flavor, ref VMStatistics64 host_info64_out, ref uint host_info64_outCnt);
+        [LibraryImport(SystemLibraryName, SetLastError = true)]
+        private static partial int host_statistics64(uint host_priv, int host_flavor, ref VMStatistics64 host_info64_out, ref uint host_info64_outCnt);
     }
 }

+ 6 - 6
Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs

@@ -7,7 +7,7 @@ using Ryujinx.Common.Logging;
 namespace Ryujinx.Common.SystemInfo
 {
     [SupportedOSPlatform("windows")]
-    class WindowsSystemInfo : SystemInfo
+    partial class WindowsSystemInfo : SystemInfo
     {
         internal WindowsSystemInfo()
         {
@@ -18,7 +18,7 @@ namespace Ryujinx.Common.SystemInfo
         private static (ulong Total, ulong Available) GetMemoryStats()
         {
             MemoryStatusEx memStatus = new MemoryStatusEx();
-            if (GlobalMemoryStatusEx(memStatus))
+            if (GlobalMemoryStatusEx(ref memStatus))
             {
                 return (memStatus.TotalPhys, memStatus.AvailPhys); // Bytes
             }
@@ -45,8 +45,8 @@ namespace Ryujinx.Common.SystemInfo
             return Environment.GetEnvironmentVariable("PROCESSOR_IDENTIFIER").Trim();
         }
 
-        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
-        private class MemoryStatusEx
+        [StructLayout(LayoutKind.Sequential)]
+        private struct MemoryStatusEx
         {
             public uint Length;
             public uint MemoryLoad;
@@ -64,9 +64,9 @@ namespace Ryujinx.Common.SystemInfo
             }
         }
 
+        [LibraryImport("kernel32.dll", SetLastError = true)]
         [return: MarshalAs(UnmanagedType.Bool)]
-        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
-        private static extern bool GlobalMemoryStatusEx([In, Out] MemoryStatusEx lpBuffer);
+        private static partial bool GlobalMemoryStatusEx(ref MemoryStatusEx lpBuffer);
 
         private static ManagementObjectCollection GetWMIObjects(string scope, string query)
         {

+ 4 - 4
Ryujinx.Common/System/DisplaySleep.cs → Ryujinx.Common/SystemInterop/DisplaySleep.cs

@@ -1,9 +1,9 @@
 using System;
 using System.Runtime.InteropServices;
 
-namespace Ryujinx.Common.System
+namespace Ryujinx.Common.SystemInterop
 {
-    public class DisplaySleep
+    public partial class DisplaySleep
     {
         [Flags]
         enum EXECUTION_STATE : uint
@@ -13,8 +13,8 @@ namespace Ryujinx.Common.System
             ES_SYSTEM_REQUIRED = 0x00000001
         }
 
-        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
-        static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
+        [LibraryImport("kernel32.dll", SetLastError = true)]
+        private static partial EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
 
         static public void Prevent()
         {

+ 15 - 14
Ryujinx.Common/System/ForceDpiAware.cs → Ryujinx.Common/SystemInterop/ForceDpiAware.cs

@@ -3,29 +3,30 @@ using System;
 using System.Globalization;
 using System.Runtime.InteropServices;
 
-namespace Ryujinx.Common.System
+namespace Ryujinx.Common.SystemInterop
 {
-    public static class ForceDpiAware
+    public static partial class ForceDpiAware
     {
-        [DllImport("user32.dll")]
-        private static extern bool SetProcessDPIAware();
+        [LibraryImport("user32.dll")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private static partial bool SetProcessDPIAware();
 
         private const string X11LibraryName = "libX11.so.6";
 
-        [DllImport(X11LibraryName)]
-        private static extern IntPtr XOpenDisplay(string display);
+        [LibraryImport(X11LibraryName)]
+        private static partial IntPtr XOpenDisplay([MarshalAs(UnmanagedType.LPStr)] string display);
 
-        [DllImport(X11LibraryName)]
-        private static extern IntPtr XGetDefault(IntPtr display, string program, string option);
+        [LibraryImport(X11LibraryName)]
+        private static partial IntPtr XGetDefault(IntPtr display, [MarshalAs(UnmanagedType.LPStr)] string program, [MarshalAs(UnmanagedType.LPStr)] string option);
 
-        [DllImport(X11LibraryName)]
-        private static extern int XDisplayWidth(IntPtr display, int screenNumber);
+        [LibraryImport(X11LibraryName)]
+        private static partial int XDisplayWidth(IntPtr display, int screenNumber);
 
-        [DllImport(X11LibraryName)]
-        private static extern int XDisplayWidthMM(IntPtr display, int screenNumber);
+        [LibraryImport(X11LibraryName)]
+        private static partial int XDisplayWidthMM(IntPtr display, int screenNumber);
 
-        [DllImport(X11LibraryName)]
-        private static extern int XCloseDisplay(IntPtr display);
+        [LibraryImport(X11LibraryName)]
+        private static partial int XCloseDisplay(IntPtr display);
 
         private static readonly double _standardDpiScale = 96.0;
         private static readonly double _maxScaleFactor   = 1.25;

+ 10 - 10
Ryujinx.Common/System/GdiPlusHelper.cs → Ryujinx.Common/SystemInterop/GdiPlusHelper.cs

@@ -2,10 +2,10 @@
 using System.Runtime.InteropServices;
 using System.Runtime.Versioning;
 
-namespace Ryujinx.Common.System
+namespace Ryujinx.Common.SystemInterop
 {
     [SupportedOSPlatform("windows")]
-    public static class GdiPlusHelper
+    public static partial class GdiPlusHelper
     {
         private const string LibraryName = "gdiplus.dll";
 
@@ -52,17 +52,17 @@ namespace Ryujinx.Common.System
             public IntPtr NotificationUnhook;
         }
 
-        [DllImport(LibraryName)]
-        private static extern int GdiplusStartup(out IntPtr token, in StartupInputEx input, out StartupOutput output);
+        [LibraryImport(LibraryName)]
+        private static partial int GdiplusStartup(out IntPtr token, in StartupInputEx input, out StartupOutput output);
 
-        [DllImport(LibraryName)]
-        private static extern int GdipCreateFromHWND(IntPtr hwnd, out IntPtr graphics);
+        [LibraryImport(LibraryName)]
+        private static partial int GdipCreateFromHWND(IntPtr hwnd, out IntPtr graphics);
 
-        [DllImport(LibraryName)]
-        private static extern int GdipDeleteGraphics(IntPtr graphics);
+        [LibraryImport(LibraryName)]
+        private static partial int GdipDeleteGraphics(IntPtr graphics);
 
-        [DllImport(LibraryName)]
-        private static extern int GdipGetDpiX(IntPtr graphics, out float dpi);
+        [LibraryImport(LibraryName)]
+        private static partial int GdipGetDpiX(IntPtr graphics, out float dpi);
 
         public static float GetDpiX(IntPtr hwnd)
         {

+ 8 - 8
Ryujinx.Common/System/WindowsMultimediaTimerResolution.cs → Ryujinx.Common/SystemInterop/WindowsMultimediaTimerResolution.cs

@@ -4,13 +4,13 @@ using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 using System.Runtime.Versioning;
 
-namespace Ryujinx.Common.System
+namespace Ryujinx.Common.SystemInterop
 {
     /// <summary>
     /// Handle Windows Multimedia timer resolution.
     /// </summary>
     [SupportedOSPlatform("windows")]
-    public class WindowsMultimediaTimerResolution : IDisposable
+    public partial class WindowsMultimediaTimerResolution : IDisposable
     {
         [StructLayout(LayoutKind.Sequential)]
         public struct TimeCaps
@@ -19,14 +19,14 @@ namespace Ryujinx.Common.System
             public uint wPeriodMax;
         };
 
-        [DllImport("winmm.dll", EntryPoint = "timeGetDevCaps", SetLastError = true)]
-        private static extern uint TimeGetDevCaps(ref TimeCaps timeCaps, uint sizeTimeCaps);
+        [LibraryImport("winmm.dll", EntryPoint = "timeGetDevCaps", SetLastError = true)]
+        private static partial uint TimeGetDevCaps(ref TimeCaps timeCaps, uint sizeTimeCaps);
 
-        [DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")]
-        private static extern uint TimeBeginPeriod(uint uMilliseconds);
+        [LibraryImport("winmm.dll", EntryPoint = "timeBeginPeriod")]
+        private static partial uint TimeBeginPeriod(uint uMilliseconds);
 
-        [DllImport("winmm.dll", EntryPoint = "timeEndPeriod")]
-        private static extern uint TimeEndPeriod(uint uMilliseconds);
+        [LibraryImport("winmm.dll", EntryPoint = "timeEndPeriod")]
+        private static partial uint TimeEndPeriod(uint uMilliseconds);
 
         private uint _targetResolutionInMilliseconds;
         private bool _isActive;

+ 33 - 33
Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs

@@ -5,7 +5,7 @@ using System.Runtime.InteropServices;
 
 namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
 {
-    static class FFmpegApi
+    static partial class FFmpegApi
     {
         public const string AvCodecLibraryName = "avcodec";
         public const string AvUtilLibraryName = "avutil";
@@ -78,52 +78,52 @@ namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
 
         public unsafe delegate void av_log_set_callback_callback(void* a0, AVLog level, [MarshalAs(UnmanagedType.LPUTF8Str)] string a2, byte* a3);
 
-        [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern AVFrame* av_frame_alloc();
+        [LibraryImport(AvUtilLibraryName)]
+        internal static unsafe partial AVFrame* av_frame_alloc();
 
-        [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern void av_frame_unref(AVFrame* frame);
+        [LibraryImport(AvUtilLibraryName)]
+        internal static unsafe partial void av_frame_unref(AVFrame* frame);
 
-        [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern void av_free(AVFrame* frame);
+        [LibraryImport(AvUtilLibraryName)]
+        internal static unsafe partial void av_free(AVFrame* frame);
 
-        [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern void av_log_set_level(AVLog level);
+        [LibraryImport(AvUtilLibraryName)]
+        internal static unsafe partial void av_log_set_level(AVLog level);
 
-        [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern void av_log_set_callback(av_log_set_callback_callback callback);
+        [LibraryImport(AvUtilLibraryName)]
+        internal static unsafe partial void av_log_set_callback(av_log_set_callback_callback callback);
 
-        [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern AVLog av_log_get_level();
+        [LibraryImport(AvUtilLibraryName)]
+        internal static unsafe partial AVLog av_log_get_level();
 
-        [DllImport(AvUtilLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern void av_log_format_line(void* ptr, AVLog level, [MarshalAs(UnmanagedType.LPUTF8Str)] string fmt, byte* vl, byte* line, int lineSize, int* printPrefix);
+        [LibraryImport(AvUtilLibraryName)]
+        internal static unsafe partial void av_log_format_line(void* ptr, AVLog level, [MarshalAs(UnmanagedType.LPUTF8Str)] string fmt, byte* vl, byte* line, int lineSize, int* printPrefix);
 
-        [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern AVCodec* avcodec_find_decoder(AVCodecID id);
+        [LibraryImport(AvCodecLibraryName)]
+        internal static unsafe partial AVCodec* avcodec_find_decoder(AVCodecID id);
 
-        [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern AVCodecContext* avcodec_alloc_context3(AVCodec* codec);
+        [LibraryImport(AvCodecLibraryName)]
+        internal static unsafe partial AVCodecContext* avcodec_alloc_context3(AVCodec* codec);
 
-        [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern int avcodec_open2(AVCodecContext* avctx, AVCodec* codec, void **options);
+        [LibraryImport(AvCodecLibraryName)]
+        internal static unsafe partial int avcodec_open2(AVCodecContext* avctx, AVCodec* codec, void **options);
 
-        [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern int avcodec_close(AVCodecContext* avctx);
+        [LibraryImport(AvCodecLibraryName)]
+        internal static unsafe partial int avcodec_close(AVCodecContext* avctx);
 
-        [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern void avcodec_free_context(AVCodecContext** avctx);
+        [LibraryImport(AvCodecLibraryName)]
+        internal static unsafe partial void avcodec_free_context(AVCodecContext** avctx);
 
-        [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern AVPacket* av_packet_alloc();
+        [LibraryImport(AvCodecLibraryName)]
+        internal static unsafe partial AVPacket* av_packet_alloc();
 
-        [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern void av_packet_unref(AVPacket* pkt);
+        [LibraryImport(AvCodecLibraryName)]
+        internal static unsafe partial void av_packet_unref(AVPacket* pkt);
 
-        [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern void av_packet_free(AVPacket** pkt);
+        [LibraryImport(AvCodecLibraryName)]
+        internal static unsafe partial void av_packet_free(AVPacket** pkt);
 
-        [DllImport(AvCodecLibraryName, CallingConvention = CallingConvention.Cdecl)]
-        internal static unsafe extern int avcodec_version();
+        [LibraryImport(AvCodecLibraryName)]
+        internal static unsafe partial int avcodec_version();
     }
 }

+ 3 - 3
Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs

@@ -5,7 +5,7 @@ using System.Runtime.Versioning;
 namespace Ryujinx.Graphics.OpenGL.Helper
 {
     [SupportedOSPlatform("linux")]
-    internal static class GLXHelper
+    internal static partial class GLXHelper
     {
         private const string LibraryName = "glx.dll";
 
@@ -30,7 +30,7 @@ namespace Ryujinx.Graphics.OpenGL.Helper
             });
         }
 
-        [DllImport(LibraryName, EntryPoint = "glXGetCurrentContext")]
-        public static extern IntPtr GetCurrentContext();
+        [LibraryImport(LibraryName, EntryPoint = "glXGetCurrentContext")]
+        public static partial IntPtr GetCurrentContext();
     }
 }

+ 3 - 3
Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs

@@ -5,11 +5,11 @@ using System.Runtime.Versioning;
 namespace Ryujinx.Graphics.OpenGL.Helper
 {
     [SupportedOSPlatform("windows")]
-    internal static class WGLHelper
+    internal static partial class WGLHelper
     {
         private const string LibraryName = "OPENGL32.DLL";
 
-        [DllImport(LibraryName, EntryPoint = "wglGetCurrentContext")]
-        public extern static IntPtr GetCurrentContext();
+        [LibraryImport(LibraryName, EntryPoint = "wglGetCurrentContext")]
+        public static partial IntPtr GetCurrentContext();
     }
 }

+ 1 - 1
Ryujinx.Headless.SDL2/Program.cs

@@ -10,7 +10,7 @@ using Ryujinx.Common.Configuration.Hid.Controller;
 using Ryujinx.Common.Configuration.Hid.Controller.Motion;
 using Ryujinx.Common.Configuration.Hid.Keyboard;
 using Ryujinx.Common.Logging;
-using Ryujinx.Common.System;
+using Ryujinx.Common.SystemInterop;
 using Ryujinx.Common.Utilities;
 using Ryujinx.Graphics.GAL;
 using Ryujinx.Graphics.GAL.Multithreading;

+ 23 - 23
Ryujinx.Memory/MemoryManagerUnixHelper.cs

@@ -3,7 +3,7 @@ using System.Runtime.InteropServices;
 
 namespace Ryujinx.Memory
 {
-    public static class MemoryManagerUnixHelper
+    public static partial class MemoryManagerUnixHelper
     {
         [Flags]
         public enum MmapProts : uint
@@ -51,38 +51,38 @@ namespace Ryujinx.Memory
         public const int MADV_DONTNEED = 4;
         public const int MADV_REMOVE = 9;
 
-        [DllImport("libc", EntryPoint = "mmap", SetLastError = true)]
-        private static extern IntPtr Internal_mmap(IntPtr address, ulong length, MmapProts prot, int flags, int fd, long offset);
+        [LibraryImport("libc", EntryPoint = "mmap", SetLastError = true)]
+        private static partial IntPtr Internal_mmap(IntPtr address, ulong length, MmapProts prot, int flags, int fd, long offset);
 
-        [DllImport("libc", SetLastError = true)]
-        public static extern int mprotect(IntPtr address, ulong length, MmapProts prot);
+        [LibraryImport("libc", SetLastError = true)]
+        public static partial int mprotect(IntPtr address, ulong length, MmapProts prot);
 
-        [DllImport("libc", SetLastError = true)]
-        public static extern int munmap(IntPtr address, ulong length);
+        [LibraryImport("libc", SetLastError = true)]
+        public static partial int munmap(IntPtr address, ulong length);
 
-        [DllImport("libc", SetLastError = true)]
-        public static extern IntPtr mremap(IntPtr old_address, ulong old_size, ulong new_size, int flags, IntPtr new_address);
+        [LibraryImport("libc", SetLastError = true)]
+        public static partial IntPtr mremap(IntPtr old_address, ulong old_size, ulong new_size, int flags, IntPtr new_address);
 
-        [DllImport("libc", SetLastError = true)]
-        public static extern int madvise(IntPtr address, ulong size, int advice);
+        [LibraryImport("libc", SetLastError = true)]
+        public static partial int madvise(IntPtr address, ulong size, int advice);
 
-        [DllImport("libc", SetLastError = true)]
-        public static extern int mkstemp(IntPtr template);
+        [LibraryImport("libc", SetLastError = true)]
+        public static partial int mkstemp(IntPtr template);
 
-        [DllImport("libc", SetLastError = true)]
-        public static extern int unlink(IntPtr pathname);
+        [LibraryImport("libc", SetLastError = true)]
+        public static partial int unlink(IntPtr pathname);
 
-        [DllImport("libc", SetLastError = true)]
-        public static extern int ftruncate(int fildes, IntPtr length);
+        [LibraryImport("libc", SetLastError = true)]
+        public static partial int ftruncate(int fildes, IntPtr length);
 
-        [DllImport("libc", SetLastError = true)]
-        public static extern int close(int fd);
+        [LibraryImport("libc", SetLastError = true)]
+        public static partial int close(int fd);
 
-        [DllImport("libc", SetLastError = true)]
-        public static extern int shm_open(IntPtr name, int oflag, uint mode);
+        [LibraryImport("libc", SetLastError = true)]
+        public static partial int shm_open(IntPtr name, int oflag, uint mode);
 
-        [DllImport("libc", SetLastError = true)]
-        public static extern int shm_unlink(IntPtr name);
+        [LibraryImport("libc", SetLastError = true)]
+        public static partial int shm_unlink(IntPtr name);
 
         private static int MmapFlagsToSystemFlags(MmapFlags flags)
         {

+ 30 - 25
Ryujinx.Memory/WindowsShared/WindowsApi.cs

@@ -3,20 +3,20 @@ using System.Runtime.InteropServices;
 
 namespace Ryujinx.Memory.WindowsShared
 {
-    static class WindowsApi
+    static partial class WindowsApi
     {
         public static readonly IntPtr InvalidHandleValue = new IntPtr(-1);
         public static readonly IntPtr CurrentProcessHandle = new IntPtr(-1);
 
-        [DllImport("kernel32.dll", SetLastError = true)]
-        public static extern IntPtr VirtualAlloc(
+        [LibraryImport("kernel32.dll", SetLastError = true)]
+        public static partial IntPtr VirtualAlloc(
             IntPtr lpAddress,
             IntPtr dwSize,
             AllocationType flAllocationType,
             MemoryProtection flProtect);
 
-        [DllImport("KernelBase.dll", SetLastError = true)]
-        public static extern IntPtr VirtualAlloc2(
+        [LibraryImport("KernelBase.dll", SetLastError = true)]
+        public static partial IntPtr VirtualAlloc2(
             IntPtr process,
             IntPtr lpAddress,
             IntPtr dwSize,
@@ -25,18 +25,20 @@ namespace Ryujinx.Memory.WindowsShared
             IntPtr extendedParameters,
             ulong parameterCount);
 
-        [DllImport("kernel32.dll", SetLastError = true)]
-        public static extern bool VirtualProtect(
+        [LibraryImport("kernel32.dll", SetLastError = true)]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        public static partial bool VirtualProtect(
             IntPtr lpAddress,
             IntPtr dwSize,
             MemoryProtection flNewProtect,
             out MemoryProtection lpflOldProtect);
 
-        [DllImport("kernel32.dll", SetLastError = true)]
-        public static extern bool VirtualFree(IntPtr lpAddress, IntPtr dwSize, AllocationType dwFreeType);
+        [LibraryImport("kernel32.dll", SetLastError = true)]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        public static partial bool VirtualFree(IntPtr lpAddress, IntPtr dwSize, AllocationType dwFreeType);
 
-        [DllImport("kernel32.dll", SetLastError = true)]
-        public static extern IntPtr CreateFileMapping(
+        [LibraryImport("kernel32.dll", SetLastError = true, EntryPoint = "CreateFileMappingW")]
+        public static partial IntPtr CreateFileMapping(
             IntPtr hFile,
             IntPtr lpFileMappingAttributes,
             FileMapProtection flProtect,
@@ -44,19 +46,20 @@ namespace Ryujinx.Memory.WindowsShared
             uint dwMaximumSizeLow,
             [MarshalAs(UnmanagedType.LPWStr)] string lpName);
 
-        [DllImport("kernel32.dll", SetLastError = true)]
-        public static extern bool CloseHandle(IntPtr hObject);
+        [LibraryImport("kernel32.dll", SetLastError = true)]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        public static partial bool CloseHandle(IntPtr hObject);
 
-        [DllImport("kernel32.dll", SetLastError = true)]
-        public static extern IntPtr MapViewOfFile(
+        [LibraryImport("kernel32.dll", SetLastError = true)]
+        public static partial IntPtr MapViewOfFile(
             IntPtr hFileMappingObject,
             uint dwDesiredAccess,
             uint dwFileOffsetHigh,
             uint dwFileOffsetLow,
             IntPtr dwNumberOfBytesToMap);
 
-        [DllImport("KernelBase.dll", SetLastError = true)]
-        public static extern IntPtr MapViewOfFile3(
+        [LibraryImport("KernelBase.dll", SetLastError = true)]
+        public static partial IntPtr MapViewOfFile3(
             IntPtr hFileMappingObject,
             IntPtr process,
             IntPtr baseAddress,
@@ -67,17 +70,19 @@ namespace Ryujinx.Memory.WindowsShared
             IntPtr extendedParameters,
             ulong parameterCount);
 
-        [DllImport("kernel32.dll", SetLastError = true)]
-        public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);
+        [LibraryImport("kernel32.dll", SetLastError = true)]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        public static partial bool UnmapViewOfFile(IntPtr lpBaseAddress);
 
-        [DllImport("KernelBase.dll", SetLastError = true)]
-        public static extern bool UnmapViewOfFile2(IntPtr process, IntPtr lpBaseAddress, ulong unmapFlags);
+        [LibraryImport("KernelBase.dll", SetLastError = true)]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        public static partial bool UnmapViewOfFile2(IntPtr process, IntPtr lpBaseAddress, ulong unmapFlags);
 
-        [DllImport("kernel32.dll")]
-        public static extern uint GetLastError();
+        [LibraryImport("kernel32.dll")]
+        public static partial uint GetLastError();
 
-        [DllImport("kernel32.dll")]
-        public static extern int GetCurrentThreadId();
+        [LibraryImport("kernel32.dll")]
+        public static partial int GetCurrentThreadId();
 
         public static MemoryProtection GetProtection(MemoryPermission permission)
         {

+ 28 - 27
Ryujinx.Tests.Unicorn/Native/Interface.cs

@@ -3,11 +3,12 @@ using System;
 using System.Diagnostics.CodeAnalysis;
 using System.IO;
 using System.Reflection;
+using System.Runtime.CompilerServices;
 using System.Runtime.InteropServices;
 
 namespace Ryujinx.Tests.Unicorn.Native
 {
-    public static class Interface
+    public static partial class Interface
     {
         public static bool IsUnicornAvailable { get; private set; } = true;
 
@@ -58,43 +59,43 @@ namespace Ryujinx.Tests.Unicorn.Native
             }
         }
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern uint uc_version(out uint major, out uint minor);
+        [LibraryImport("unicorn")]
+        public static partial uint uc_version(out uint major, out uint minor);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern Error uc_open(Arch arch, Mode mode, out IntPtr uc);
+        [LibraryImport("unicorn")]
+        public static partial Error uc_open(Arch arch, Mode mode, out IntPtr uc);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern Error uc_close(IntPtr uc);
+        [LibraryImport("unicorn")]
+        public static partial Error uc_close(IntPtr uc);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern IntPtr uc_strerror(Error err);
+        [LibraryImport("unicorn")]
+        public static partial IntPtr uc_strerror(Error err);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern Error uc_reg_write(IntPtr uc, int regid, byte[] value);
+        [LibraryImport("unicorn")]
+        public static partial Error uc_reg_write(IntPtr uc, int regid, byte[] value);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern Error uc_reg_read(IntPtr uc, int regid, byte[] value);
+        [LibraryImport("unicorn")]
+        public static partial Error uc_reg_read(IntPtr uc, int regid, byte[] value);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern Error uc_mem_write(IntPtr uc, ulong address, byte[] bytes, ulong size);
+        [LibraryImport("unicorn")]
+        public static partial Error uc_mem_write(IntPtr uc, ulong address, byte[] bytes, ulong size);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern Error uc_mem_read(IntPtr uc, ulong address, byte[] bytes, ulong size);
+        [LibraryImport("unicorn")]
+        public static partial Error uc_mem_read(IntPtr uc, ulong address, byte[] bytes, ulong size);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern Error uc_emu_start(IntPtr uc, ulong begin, ulong until, ulong timeout, ulong count);
+        [LibraryImport("unicorn")]
+        public static partial Error uc_emu_start(IntPtr uc, ulong begin, ulong until, ulong timeout, ulong count);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern Error uc_mem_map(IntPtr uc, ulong address, ulong size, uint perms);
+        [LibraryImport("unicorn")]
+        public static partial Error uc_mem_map(IntPtr uc, ulong address, ulong size, uint perms);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern Error uc_mem_unmap(IntPtr uc, ulong address, ulong size);
+        [LibraryImport("unicorn")]
+        public static partial Error uc_mem_unmap(IntPtr uc, ulong address, ulong size);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern Error uc_mem_protect(IntPtr uc, ulong address, ulong size, uint perms);
+        [LibraryImport("unicorn")]
+        public static partial Error uc_mem_protect(IntPtr uc, ulong address, ulong size, uint perms);
 
-        [DllImport("unicorn", CallingConvention = CallingConvention.Cdecl)]
-        public static extern Error uc_mem_regions(IntPtr uc, out IntPtr regions, out uint count);
+        [LibraryImport("unicorn")]
+        public static partial Error uc_mem_regions(IntPtr uc, out IntPtr regions, out uint count);
     }
 }

+ 6 - 5
Ryujinx.Ui.Common/Helper/ConsoleHelper.cs

@@ -5,7 +5,7 @@ using System.Runtime.Versioning;
 
 namespace Ryujinx.Ui.Common.Helper
 {
-    public static class ConsoleHelper
+    public static partial class ConsoleHelper
     {
         public static bool SetConsoleWindowStateSupported => OperatingSystem.IsWindows();
 
@@ -39,11 +39,12 @@ namespace Ryujinx.Ui.Common.Helper
         }
 
         [SupportedOSPlatform("windows")]
-        [DllImport("kernel32")]
-        static extern IntPtr GetConsoleWindow();
+        [LibraryImport("kernel32")]
+        private static partial IntPtr GetConsoleWindow();
 
         [SupportedOSPlatform("windows")]
-        [DllImport("user32")]
-        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
+        [LibraryImport("user32")]
+        [return: MarshalAs(UnmanagedType.Bool)]
+        private static partial bool ShowWindow(IntPtr hWnd, int nCmdShow);
     }
 }

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

@@ -2,6 +2,7 @@
 
   <PropertyGroup>
     <TargetFramework>net7.0</TargetFramework>
+    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
   </PropertyGroup>
 
   <ItemGroup>

+ 10 - 10
Ryujinx/Program.cs

@@ -4,7 +4,7 @@ using Ryujinx.Common;
 using Ryujinx.Common.Configuration;
 using Ryujinx.Common.GraphicsDriver;
 using Ryujinx.Common.Logging;
-using Ryujinx.Common.System;
+using Ryujinx.Common.SystemInterop;
 using Ryujinx.Common.SystemInfo;
 using Ryujinx.Modules;
 using Ryujinx.SDL2.Common;
@@ -23,7 +23,7 @@ using System.Threading.Tasks;
 
 namespace Ryujinx
 {
-    class Program
+    partial class Program
     {
         public static double WindowScaleFactor { get; private set; }
 
@@ -35,17 +35,17 @@ namespace Ryujinx
 
         private const string X11LibraryName = "libX11";
 
-        [DllImport(X11LibraryName)]
-        private extern static int XInitThreads();
+        [LibraryImport(X11LibraryName)]
+        private static partial int XInitThreads();
 
-        [DllImport("user32.dll", SetLastError = true)]
-        public static extern int MessageBoxA(IntPtr hWnd, string text, string caption, uint type);
+        [LibraryImport("user32.dll", SetLastError = true)]
+        public static partial int MessageBoxA(IntPtr hWnd, [MarshalAs(UnmanagedType.LPStr)] string text, [MarshalAs(UnmanagedType.LPStr)] string caption, uint type);
 
-        [DllImport("libc", SetLastError = true)]
-        static extern int setenv(string name, string value, int overwrite);
+        [LibraryImport("libc", SetLastError = true)]
+        private static partial int setenv([MarshalAs(UnmanagedType.LPStr)] string name, [MarshalAs(UnmanagedType.LPStr)] string value, int overwrite);
 
-        [DllImport("libc")]
-        static extern IntPtr getenv(string name);
+        [LibraryImport("libc")]
+        private static partial IntPtr getenv([MarshalAs(UnmanagedType.LPStr)] string name);
 
         private const uint MB_ICONWARNING = 0x30;
 

+ 7 - 7
Ryujinx/Ui/GLRenderer.cs

@@ -13,7 +13,7 @@ using System.Runtime.InteropServices;
 
 namespace Ryujinx.Ui
 {
-    public class GlRenderer : RendererWidgetBase
+    public partial class GlRenderer : RendererWidgetBase
     {
         private GraphicsDebugLevel _glLogLevel;
 
@@ -74,14 +74,14 @@ namespace Ryujinx.Ui
             throw new NotImplementedException();
         }
 
-        [DllImport("libgdk-3-0.dll")]
-        private static extern IntPtr gdk_win32_window_get_handle(IntPtr d);
+        [LibraryImport("libgdk-3-0.dll")]
+        private static partial IntPtr gdk_win32_window_get_handle(IntPtr d);
 
-        [DllImport("libgdk-3.so.0")]
-        private static extern IntPtr gdk_x11_display_get_xdisplay(IntPtr gdkDisplay);
+        [LibraryImport("libgdk-3.so.0")]
+        private static partial IntPtr gdk_x11_display_get_xdisplay(IntPtr gdkDisplay);
 
-        [DllImport("libgdk-3.so.0")]
-        private static extern IntPtr gdk_x11_window_get_xid(IntPtr gdkWindow);
+        [LibraryImport("libgdk-3.so.0")]
+        private static partial IntPtr gdk_x11_window_get_xid(IntPtr gdkWindow);
 
         private static FramebufferFormat GetGraphicsMode()
         {

+ 19 - 19
Ryujinx/Ui/Helper/MetalHelper.cs

@@ -8,7 +8,7 @@ namespace Ryujinx.Ui.Helper
     public delegate void UpdateBoundsCallbackDelegate(Window window);
 
     [SupportedOSPlatform("macos")]
-    static class MetalHelper
+    static partial class MetalHelper
     {
         private const string LibObjCImport = "/usr/lib/libobjc.A.dylib";
 
@@ -104,31 +104,31 @@ namespace Ryujinx.Ui.Helper
             return metalLayer;
         }
 
-        [DllImport(LibObjCImport)]
-        private static unsafe extern IntPtr sel_registerName(byte* data);
+        [LibraryImport(LibObjCImport)]
+        private static unsafe partial IntPtr sel_registerName(byte* data);
 
-        [DllImport(LibObjCImport)]
-        private static unsafe extern IntPtr objc_getClass(byte* data);
+        [LibraryImport(LibObjCImport)]
+        private static unsafe partial IntPtr objc_getClass(byte* data);
 
-        [DllImport(LibObjCImport)]
-        private static extern void objc_msgSend(IntPtr receiver, Selector selector);
+        [LibraryImport(LibObjCImport)]
+        private static partial void objc_msgSend(IntPtr receiver, Selector selector);
 
-        [DllImport(LibObjCImport)]
-        private static extern void objc_msgSend(IntPtr receiver, Selector selector, byte value);
+        [LibraryImport(LibObjCImport)]
+        private static partial void objc_msgSend(IntPtr receiver, Selector selector, byte value);
 
-        [DllImport(LibObjCImport)]
-        private static extern void objc_msgSend(IntPtr receiver, Selector selector, IntPtr value);
+        [LibraryImport(LibObjCImport)]
+        private static partial void objc_msgSend(IntPtr receiver, Selector selector, IntPtr value);
 
-        [DllImport(LibObjCImport)]
-        private static extern void objc_msgSend(IntPtr receiver, Selector selector, NSRect point);
+        [LibraryImport(LibObjCImport)]
+        private static partial void objc_msgSend(IntPtr receiver, Selector selector, NSRect point);
 
-        [DllImport(LibObjCImport)]
-        private static extern void objc_msgSend(IntPtr receiver, Selector selector, double value);
+        [LibraryImport(LibObjCImport)]
+        private static partial void objc_msgSend(IntPtr receiver, Selector selector, double value);
 
-        [DllImport(LibObjCImport, EntryPoint = "objc_msgSend")]
-        private static extern IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector);
+        [LibraryImport(LibObjCImport, EntryPoint = "objc_msgSend")]
+        private static partial IntPtr IntPtr_objc_msgSend(IntPtr receiver, Selector selector);
 
-        [DllImport("libgdk-3.0.dylib")]
-        private static extern IntPtr gdk_quartz_window_get_nsview(IntPtr gdkWindow);
+        [LibraryImport("libgdk-3.0.dylib")]
+        private static partial IntPtr gdk_quartz_window_get_nsview(IntPtr gdkWindow);
     }
 }

+ 1 - 1
Ryujinx/Ui/MainWindow.cs

@@ -15,7 +15,7 @@ using Ryujinx.Audio.Integration;
 using Ryujinx.Common;
 using Ryujinx.Common.Configuration;
 using Ryujinx.Common.Logging;
-using Ryujinx.Common.System;
+using Ryujinx.Common.SystemInterop;
 using Ryujinx.Graphics.GAL;
 using Ryujinx.Graphics.GAL.Multithreading;
 using Ryujinx.Graphics.OpenGL;

+ 7 - 7
Ryujinx/Ui/VKRenderer.cs

@@ -12,7 +12,7 @@ using System.Runtime.InteropServices;
 
 namespace Ryujinx.Ui
 {
-    public class VKRenderer : RendererWidgetBase
+    public partial class VKRenderer : RendererWidgetBase
     {
         public NativeWindowBase NativeWindow { get; private set; }
         private UpdateBoundsCallbackDelegate _updateBoundsCallback;
@@ -44,14 +44,14 @@ namespace Ryujinx.Ui
             throw new NotImplementedException();
         }
 
-        [DllImport("libgdk-3-0.dll")]
-        private static extern IntPtr gdk_win32_window_get_handle(IntPtr d);
+        [LibraryImport("libgdk-3-0.dll")]
+        private static partial IntPtr gdk_win32_window_get_handle(IntPtr d);
 
-        [DllImport("libgdk-3.so.0")]
-        private static extern IntPtr gdk_x11_display_get_xdisplay(IntPtr gdkDisplay);
+        [LibraryImport("libgdk-3.so.0")]
+        private static partial IntPtr gdk_x11_display_get_xdisplay(IntPtr gdkDisplay);
 
-        [DllImport("libgdk-3.so.0")]
-        private static extern IntPtr gdk_x11_window_get_xid(IntPtr gdkWindow);
+        [LibraryImport("libgdk-3.so.0")]
+        private static partial IntPtr gdk_x11_window_get_xid(IntPtr gdkWindow);
 
         protected override bool OnConfigureEvent(EventConfigure evnt)
         {