From 0fbcd630bc57885d6b94fd3c4b3546493e09059e Mon Sep 17 00:00:00 2001 From: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com> Date: Thu, 15 Dec 2022 12:07:31 -0500 Subject: [PATCH] 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 * Update Ryujinx.Ava/Modules/Updater/Updater.cs Co-authored-by: Mary-nyan Co-authored-by: TSRBerry <20988865+TSRBerry@users.noreply.github.com> Co-authored-by: Mary-nyan --- .../Signal/UnixSignalHandlerRegistration.cs | 10 +-- .../WindowsSignalHandlerRegistration.cs | 18 ++--- .../Translation/Cache/JitUnwindWindows.cs | 9 +-- Ryujinx.Ava/AppHost.cs | 2 +- Ryujinx.Ava/Helper/MetalHelper.cs | 34 +++++----- Ryujinx.Ava/Program.cs | 8 +-- Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs | 8 ++- Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs | 52 +++++++-------- .../GraphicsDriver/NVThreadedOptimization.cs | 6 +- .../Memory/PartialUnmaps/PartialUnmapState.cs | 21 +++--- Ryujinx.Common/SystemInfo/MacOSSystemInfo.cs | 18 ++--- .../SystemInfo/WindowsSystemInfo.cs | 12 ++-- .../{System => SystemInterop}/DisplaySleep.cs | 8 +-- .../ForceDpiAware.cs | 29 ++++---- .../GdiPlusHelper.cs | 20 +++--- .../WindowsMultimediaTimerResolution.cs | 16 ++--- .../Native/FFmpegApi.cs | 66 +++++++++---------- Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs | 6 +- Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs | 6 +- Ryujinx.Headless.SDL2/Program.cs | 2 +- Ryujinx.Memory/MemoryManagerUnixHelper.cs | 46 ++++++------- Ryujinx.Memory/WindowsShared/WindowsApi.cs | 55 +++++++++------- Ryujinx.Tests.Unicorn/Native/Interface.cs | 55 ++++++++-------- Ryujinx.Ui.Common/Helper/ConsoleHelper.cs | 11 ++-- Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj | 1 + Ryujinx/Program.cs | 20 +++--- Ryujinx/Ui/GLRenderer.cs | 14 ++-- Ryujinx/Ui/Helper/MetalHelper.cs | 38 +++++------ Ryujinx/Ui/MainWindow.cs | 2 +- Ryujinx/Ui/VKRenderer.cs | 14 ++-- 30 files changed, 308 insertions(+), 299 deletions(-) rename Ryujinx.Common/{System => SystemInterop}/DisplaySleep.cs (76%) rename Ryujinx.Common/{System => SystemInterop}/ForceDpiAware.cs (75%) rename Ryujinx.Common/{System => SystemInterop}/GdiPlusHelper.cs (74%) rename Ryujinx.Common/{System => SystemInterop}/WindowsMultimediaTimerResolution.cs (84%) diff --git a/ARMeilleure/Signal/UnixSignalHandlerRegistration.cs b/ARMeilleure/Signal/UnixSignalHandlerRegistration.cs index 12bda3de29..945a01dae4 100644 --- a/ARMeilleure/Signal/UnixSignalHandlerRegistration.cs +++ b/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) { diff --git a/ARMeilleure/Signal/WindowsSignalHandlerRegistration.cs b/ARMeilleure/Signal/WindowsSignalHandlerRegistration.cs index b74f1098b4..3219e015df 100644 --- a/ARMeilleure/Signal/WindowsSignalHandlerRegistration.cs +++ b/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; diff --git a/ARMeilleure/Translation/Cache/JitUnwindWindows.cs b/ARMeilleure/Translation/Cache/JitUnwindWindows.cs index 072c0f51b3..77727bf166 100644 --- a/ARMeilleure/Translation/Cache/JitUnwindWindows.cs +++ b/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; diff --git a/Ryujinx.Ava/AppHost.cs b/Ryujinx.Ava/AppHost.cs index 0cb3bd1384..c1b3355a4d 100644 --- a/Ryujinx.Ava/AppHost.cs +++ b/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; diff --git a/Ryujinx.Ava/Helper/MetalHelper.cs b/Ryujinx.Ava/Helper/MetalHelper.cs index ae07ce69bf..2d4d828b80 100644 --- a/Ryujinx.Ava/Helper/MetalHelper.cs +++ b/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); } } \ No newline at end of file diff --git a/Ryujinx.Ava/Program.cs b/Ryujinx.Ava/Program.cs index ba10a45996..023e31df32 100644 --- a/Ryujinx.Ava/Program.cs +++ b/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; diff --git a/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs b/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs index 2600759118..05b2cc5bd2 100644 --- a/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs +++ b/Ryujinx.Ava/Ui/Controls/EmbeddedWindow.cs @@ -125,9 +125,9 @@ namespace Ryujinx.Ava.Ui.Controls { cbSize = Marshal.SizeOf(), 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"); } diff --git a/Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs b/Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs index 124536d991..81e2fee90c 100644 --- a/Ryujinx.Ava/Ui/Controls/Win32NativeInterop.cs +++ b/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() - }; + cbSize = Marshal.SizeOf(); } } - [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, diff --git a/Ryujinx.Common/GraphicsDriver/NVThreadedOptimization.cs b/Ryujinx.Common/GraphicsDriver/NVThreadedOptimization.cs index d21d355553..c5be6e3760 100644 --- a/Ryujinx.Common/GraphicsDriver/NVThreadedOptimization.cs +++ b/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; diff --git a/Ryujinx.Common/Memory/PartialUnmaps/PartialUnmapState.cs b/Ryujinx.Common/Memory/PartialUnmaps/PartialUnmapState.cs index 7a14e616f6..3463d06cff 100644 --- a/Ryujinx.Common/Memory/PartialUnmaps/PartialUnmapState.cs +++ b/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. /// [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); /// /// Creates a global static PartialUnmapState and populates the field offsets. diff --git a/Ryujinx.Common/SystemInfo/MacOSSystemInfo.cs b/Ryujinx.Common/SystemInfo/MacOSSystemInfo.cs index 3fcb1a2532..ad022bdf06 100644 --- a/Ryujinx.Common/SystemInfo/MacOSSystemInfo.cs +++ b/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); } } \ No newline at end of file diff --git a/Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs b/Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs index ffce665e2b..11f0785e6f 100644 --- a/Ryujinx.Common/SystemInfo/WindowsSystemInfo.cs +++ b/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) { diff --git a/Ryujinx.Common/System/DisplaySleep.cs b/Ryujinx.Common/SystemInterop/DisplaySleep.cs similarity index 76% rename from Ryujinx.Common/System/DisplaySleep.cs rename to Ryujinx.Common/SystemInterop/DisplaySleep.cs index bad964b9d0..5a1f66f50e 100644 --- a/Ryujinx.Common/System/DisplaySleep.cs +++ b/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() { diff --git a/Ryujinx.Common/System/ForceDpiAware.cs b/Ryujinx.Common/SystemInterop/ForceDpiAware.cs similarity index 75% rename from Ryujinx.Common/System/ForceDpiAware.cs rename to Ryujinx.Common/SystemInterop/ForceDpiAware.cs index 8d19876e8d..f17612a6d7 100644 --- a/Ryujinx.Common/System/ForceDpiAware.cs +++ b/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; diff --git a/Ryujinx.Common/System/GdiPlusHelper.cs b/Ryujinx.Common/SystemInterop/GdiPlusHelper.cs similarity index 74% rename from Ryujinx.Common/System/GdiPlusHelper.cs rename to Ryujinx.Common/SystemInterop/GdiPlusHelper.cs index c084c65101..1001424df4 100644 --- a/Ryujinx.Common/System/GdiPlusHelper.cs +++ b/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) { diff --git a/Ryujinx.Common/System/WindowsMultimediaTimerResolution.cs b/Ryujinx.Common/SystemInterop/WindowsMultimediaTimerResolution.cs similarity index 84% rename from Ryujinx.Common/System/WindowsMultimediaTimerResolution.cs rename to Ryujinx.Common/SystemInterop/WindowsMultimediaTimerResolution.cs index d19fbe73dd..a4fbf0bd4f 100644 --- a/Ryujinx.Common/System/WindowsMultimediaTimerResolution.cs +++ b/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 { /// /// Handle Windows Multimedia timer resolution. /// [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; diff --git a/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs b/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs index 9bf71778bd..d173a41293 100644 --- a/Ryujinx.Graphics.Nvdec.FFmpeg/Native/FFmpegApi.cs +++ b/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(); } } diff --git a/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs b/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs index 7cc39708d7..9635494636 100644 --- a/Ryujinx.Graphics.OpenGL/Helper/GLXHelper.cs +++ b/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(); } } diff --git a/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs b/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs index b37134eb5e..df497ae24c 100644 --- a/Ryujinx.Graphics.OpenGL/Helper/WGLHelper.cs +++ b/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(); } } diff --git a/Ryujinx.Headless.SDL2/Program.cs b/Ryujinx.Headless.SDL2/Program.cs index 50a90763fa..9a082b6d02 100644 --- a/Ryujinx.Headless.SDL2/Program.cs +++ b/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; diff --git a/Ryujinx.Memory/MemoryManagerUnixHelper.cs b/Ryujinx.Memory/MemoryManagerUnixHelper.cs index dd31c328b2..87a81a79b2 100644 --- a/Ryujinx.Memory/MemoryManagerUnixHelper.cs +++ b/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) { diff --git a/Ryujinx.Memory/WindowsShared/WindowsApi.cs b/Ryujinx.Memory/WindowsShared/WindowsApi.cs index cbb7d99e64..67e704ea4d 100644 --- a/Ryujinx.Memory/WindowsShared/WindowsApi.cs +++ b/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) { diff --git a/Ryujinx.Tests.Unicorn/Native/Interface.cs b/Ryujinx.Tests.Unicorn/Native/Interface.cs index 889441aba6..4e34ee8b38 100644 --- a/Ryujinx.Tests.Unicorn/Native/Interface.cs +++ b/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); } } \ No newline at end of file diff --git a/Ryujinx.Ui.Common/Helper/ConsoleHelper.cs b/Ryujinx.Ui.Common/Helper/ConsoleHelper.cs index d85a8121b6..4eb3b79c1a 100644 --- a/Ryujinx.Ui.Common/Helper/ConsoleHelper.cs +++ b/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); } } \ No newline at end of file diff --git a/Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj b/Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj index d8696a9cd4..3a1cd1250b 100644 --- a/Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj +++ b/Ryujinx.Ui.Common/Ryujinx.Ui.Common.csproj @@ -2,6 +2,7 @@ net7.0 + true diff --git a/Ryujinx/Program.cs b/Ryujinx/Program.cs index 403dde3009..e27c4ae944 100644 --- a/Ryujinx/Program.cs +++ b/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; diff --git a/Ryujinx/Ui/GLRenderer.cs b/Ryujinx/Ui/GLRenderer.cs index 06d414edca..5804ed1818 100644 --- a/Ryujinx/Ui/GLRenderer.cs +++ b/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() { diff --git a/Ryujinx/Ui/Helper/MetalHelper.cs b/Ryujinx/Ui/Helper/MetalHelper.cs index 62ca29301c..1e10eb05ac 100644 --- a/Ryujinx/Ui/Helper/MetalHelper.cs +++ b/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); } } \ No newline at end of file diff --git a/Ryujinx/Ui/MainWindow.cs b/Ryujinx/Ui/MainWindow.cs index 3a5b7723d1..0e7e4d6255 100644 --- a/Ryujinx/Ui/MainWindow.cs +++ b/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; diff --git a/Ryujinx/Ui/VKRenderer.cs b/Ryujinx/Ui/VKRenderer.cs index 63d0d0a622..e49b30c3b5 100644 --- a/Ryujinx/Ui/VKRenderer.cs +++ b/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) {