X Tutup
using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Security; using System.Text; namespace Python.Runtime { [SuppressUnmanagedCodeSecurity] public class NativeMethods_Linux { #if NETSTANDARD || NETCOREAPP private static int RTLD_NOW = 0x2; private static int RTLD_GLOBAL = 0x100; private static IntPtr RTLD_DEFAULT = IntPtr.Zero; private const string NativeDll = "libdl.so"; public static IntPtr LoadLibrary(string fileName) { return dlopen($"lib{fileName}.so", RTLD_NOW | RTLD_GLOBAL); } #else private static int RTLD_NOW = 0x2; private static int RTLD_SHARED = 0x20; private static IntPtr RTLD_DEFAULT = IntPtr.Zero; private const string NativeDll = "libdl.so"; public static IntPtr LoadLibrary(string fileName) { return dlopen(fileName, RTLD_NOW | RTLD_SHARED); } #endif public static void FreeLibrary(IntPtr handle) { dlclose(handle); } public static IntPtr GetProcAddress(IntPtr dllHandle, string name) { // look in the exe if dllHandle is NULL if (dllHandle == IntPtr.Zero) { dllHandle = RTLD_DEFAULT; } // clear previous errors if any dlerror(); IntPtr res = dlsym(dllHandle, name); IntPtr errPtr = dlerror(); if (errPtr != IntPtr.Zero) { throw new Exception("dlsym: " + Marshal.PtrToStringAnsi(errPtr)); } return res; } [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] public static extern IntPtr dlopen(String fileName, int flags); [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] private static extern IntPtr dlsym(IntPtr handle, String symbol); [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)] private static extern int dlclose(IntPtr handle); [DllImport(NativeDll, CallingConvention = CallingConvention.Cdecl)] private static extern IntPtr dlerror(); } }
X Tutup