From 8046cfb2699aea6ec52587379b63630eeabe4cc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20C=C3=A1ceres?= Date: Wed, 11 Sep 2024 10:55:34 +0200 Subject: [PATCH] replace custom library load with net8 NativeLibrary --- .../Evergine.Bindings.RenderDoc/Kernel32.cs | 19 --- .../Evergine.Bindings.RenderDoc/Libdl.cs | 21 ---- .../NativeLibrary.cs | 112 ------------------ .../Evergine.Bindings.RenderDoc/RenderDoc.cs | 23 ++-- 4 files changed, 10 insertions(+), 165 deletions(-) delete mode 100644 RenderDocGen/Evergine.Bindings.RenderDoc/Kernel32.cs delete mode 100644 RenderDocGen/Evergine.Bindings.RenderDoc/Libdl.cs delete mode 100644 RenderDocGen/Evergine.Bindings.RenderDoc/NativeLibrary.cs diff --git a/RenderDocGen/Evergine.Bindings.RenderDoc/Kernel32.cs b/RenderDocGen/Evergine.Bindings.RenderDoc/Kernel32.cs deleted file mode 100644 index 54d0518..0000000 --- a/RenderDocGen/Evergine.Bindings.RenderDoc/Kernel32.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; - -namespace Evergine.Bindings.RenderDoc -{ - internal static class Kernel32 - { - [DllImport("kernel32")] - public static extern IntPtr LoadLibrary(string fileName); - - [DllImport("kernel32")] - public static extern IntPtr GetProcAddress(IntPtr module, string procName); - - [DllImport("kernel32")] - public static extern int FreeLibrary(IntPtr module); - } -} diff --git a/RenderDocGen/Evergine.Bindings.RenderDoc/Libdl.cs b/RenderDocGen/Evergine.Bindings.RenderDoc/Libdl.cs deleted file mode 100644 index 04a80d1..0000000 --- a/RenderDocGen/Evergine.Bindings.RenderDoc/Libdl.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Runtime.InteropServices; -using System.Text; - -namespace Evergine.Bindings.RenderDoc -{ - internal static class Libdl - { - public const int RTLD_NOW = 0x002; - - [DllImport("libdl")] - public static extern IntPtr dlopen(string fileName, int flags); - - [DllImport("libdl")] - public static extern IntPtr dlsym(IntPtr module, string procName); - - [DllImport("libdl")] - public static extern void dlclose(IntPtr module); - } -} diff --git a/RenderDocGen/Evergine.Bindings.RenderDoc/NativeLibrary.cs b/RenderDocGen/Evergine.Bindings.RenderDoc/NativeLibrary.cs deleted file mode 100644 index d916287..0000000 --- a/RenderDocGen/Evergine.Bindings.RenderDoc/NativeLibrary.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Text; - -namespace Evergine.Bindings.RenderDoc -{ - public abstract class NativeLibrary - { - private readonly string libraryName; - private readonly IntPtr libraryHandle; - - public IntPtr NativeHandle => libraryHandle; - - public NativeLibrary(string libraryName) - { - this.libraryName = libraryName; - libraryHandle = LoadLibrary(this.libraryName); - if (libraryHandle == IntPtr.Zero) - { - throw new InvalidOperationException("Could not load " + libraryName); - } - } - - public unsafe void LoadFunction(string name, out T field) - { - IntPtr funcPtr = LoadFunction(name); - - if (funcPtr != IntPtr.Zero) - { - field = Marshal.GetDelegateForFunctionPointer(funcPtr); - } - else - { - field = default(T); - Debug.WriteLine($" ===> Error loading function {name}"); - } - } - - protected abstract IntPtr LoadLibrary(string libraryName); - protected abstract void FreeLibrary(IntPtr libraryHandle); - protected abstract IntPtr LoadFunction(string functionName); - - public void Dispose() - { - FreeLibrary(libraryHandle); - } - - public static NativeLibrary Load(string libraryName) - { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - return new WindowsNativeLibrary(libraryName); - } - else if(RuntimeInformation.IsOSPlatform(OSPlatform.Linux) || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - return new UnixNativeLibrary(libraryName); - } - else - { - throw new PlatformNotSupportedException("Cannot load native libraries on this platform: " + RuntimeInformation.OSDescription); - } - } - - private class WindowsNativeLibrary : NativeLibrary - { - public WindowsNativeLibrary(string libraryName) : base(libraryName) - { - } - - protected override IntPtr LoadLibrary(string libraryName) - { - return Kernel32.LoadLibrary(libraryName); - } - - protected override void FreeLibrary(IntPtr libraryHandle) - { - Kernel32.FreeLibrary(libraryHandle); - } - - protected override IntPtr LoadFunction(string functionName) - { - Debug.WriteLine("Loading " + functionName); - return Kernel32.GetProcAddress(NativeHandle, functionName); - } - } - - private class UnixNativeLibrary : NativeLibrary - { - public UnixNativeLibrary(string libraryName) : base(libraryName) - { - } - - protected override IntPtr LoadLibrary(string libraryName) - { - return Libdl.dlopen(libraryName, Libdl.RTLD_NOW); - } - - protected override void FreeLibrary(IntPtr libraryHandle) - { - Libdl.dlclose(libraryHandle); - } - - protected override IntPtr LoadFunction(string functionName) - { - Debug.WriteLine("Loading " + functionName); - return Libdl.dlsym(NativeHandle, functionName); - } - } - } -} diff --git a/RenderDocGen/Evergine.Bindings.RenderDoc/RenderDoc.cs b/RenderDocGen/Evergine.Bindings.RenderDoc/RenderDoc.cs index fb3d892..79b89c2 100644 --- a/RenderDocGen/Evergine.Bindings.RenderDoc/RenderDoc.cs +++ b/RenderDocGen/Evergine.Bindings.RenderDoc/RenderDoc.cs @@ -1,9 +1,6 @@ using System; -using System.Collections.Generic; -using System.Text; using System.Runtime.InteropServices; using System.IO; -using System.Net; namespace Evergine.Bindings.RenderDoc { @@ -24,22 +21,22 @@ public unsafe class RenderDoc /// Whether RenderDoc was successfully loaded. public static bool Load(out RenderDoc renderDoc) { - try + var libName = GetRenderDocLibName(); + if (NativeLibrary.TryLoad(libName, out var lib) || + NativeLibrary.TryLoad(libName, typeof(RenderDoc).Assembly, null, out lib)) { - var nativeLib = NativeLibrary.Load(GetRenderDocLibName()); - renderDoc = new RenderDoc(nativeLib); + renderDoc = new RenderDoc(lib); return true; } - catch - { - renderDoc = null; - return false; - } + + renderDoc = null; + return false; } - private unsafe RenderDoc(NativeLibrary nativeLib) + private unsafe RenderDoc(IntPtr nativeLib) { - nativeLib.LoadFunction("RENDERDOC_GetAPI", out pRENDERDOC_GetAPI getApiDelegate); + NativeLibrary.TryGetExport(nativeLib, "RENDERDOC_GetAPI", out IntPtr funcPtr); + var getApiDelegate = Marshal.GetDelegateForFunctionPointer(funcPtr); void* apiPointers; int result = getApiDelegate(RENDERDOC_Version.eRENDERDOC_API_Version_1_4_1, &apiPointers); if (result != 1)