3using System.Runtime.InteropServices;
8#if FIRST_PASS == false && IMPORTER == FALSE && EXPORTER == false
14 internal class LibIkvm
28 [DllImport(
"ikvm", SetLastError =
false)]
29 internal static extern nint IKVM_dl_open([MarshalAs(UnmanagedType.LPUTF8Str)]
string path);
37 [DllImport(
"ikvm", SetLastError =
false)]
38 internal static extern nint IKVM_dl_sym(nint handle, [MarshalAs(UnmanagedType.LPStr)]
string symbol);
45 [DllImport(
"ikvm", SetLastError =
false)]
46 internal static extern void IKVM_dl_close(nint handle);
52 [DllImport(
"ikvm", SetLastError =
false)]
53 internal static unsafe
extern int IKVM_sig_get_size_sigaction();
60 [DllImport(
"ikvm", SetLastError =
false)]
61 internal static unsafe
extern int IKVM_sig_get_chld_action(
void* sig);
68 [DllImport(
"ikvm", SetLastError =
false)]
69 internal static unsafe
extern int IKVM_sig_set_chld_action(
void* sig);
78 [DllImport(
"kernel32", SetLastError =
false)]
79 static extern nint LoadLibrary(
string lpLibFileName);
86 [DllImport(
"kernel32", SetLastError =
false)]
87 static extern nint FreeLibrary(nint handle);
94 static nint LoadImpl(
string nameOrPath)
97 if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
99 return LoadLibrary(nameOrPath);
104 return Externs.IKVM_dl_open(nameOrPath);
107 return System.
Runtime.InteropServices.NativeLibrary.TryLoad(nameOrPath, typeof(LibIkvm).
Assembly,
null, out var h) ? h : 0;
116 static void FreeImpl(nint handle)
119 if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
127 Externs.IKVM_dl_close(handle);
137 public static readonly LibIkvm Instance =
new();
142 public nint Handle {
get;
private set; }
149 if ((Handle = Load()) == 0)
150 throw new InternalException(
"Could not load ikvm native library.");
159 if (LoadImpl(
"ikvm") is nint h1 and not 0)
163 var asml = typeof(NativeLibrary).Assembly.Location is
string s && !
string.IsNullOrEmpty(s) ? Path.GetDirectoryName(s) :
null;
164 var root = Environment.GetEnvironmentVariable(
"IKVM_LIBRARY_PATH") ?? asml ?? AppContext.BaseDirectory;
167 if (
string.IsNullOrEmpty(root))
171 if (Path.Combine(root, NativeLibrary.MapLibraryName(
"ikvm")) is
string lib1)
172 if (File.Exists(lib1) && LoadImpl(lib1) is nint h2 and not 0)
176 foreach (var rid
in RuntimeUtil.SupportedRuntimeIdentifiers)
177 if (Path.Combine(root,
"runtimes", rid,
"native", NativeLibrary.MapLibraryName(
"ikvm")) is
string lib2)
178 if (File.Exists(lib2) && LoadImpl(lib2) is nint h3 and not 0)
189 public nint dl_open(
string path) => Externs.IKVM_dl_open(path);
197 public nint dl_sym(nint handle,
string symbol) => Externs.IKVM_dl_sym(handle, symbol);
204 public void dl_close(nint handle) => Externs.IKVM_dl_close(handle);
210 public unsafe
int sig_get_size_sigaction() => Externs.IKVM_sig_get_size_sigaction();
217 public unsafe
int sig_get_chld_action(
void* sig) => Externs.IKVM_sig_get_chld_action(sig);
224 public unsafe
int sig_set_chld_action(
void* sig) => Externs.IKVM_sig_set_chld_action(sig);
IKVM.Reflection.Assembly Assembly