using System.Runtime.InteropServices; namespace NativeEngine; /// /// Mimmicks the engine internal CreateInterface system, allowing us to /// get the interfaces without asking native. /// internal static class CreateInterface { static Dictionary loadedModules = new(); static IntPtr LoadModule( string dll ) { if ( loadedModules.TryGetValue( dll, out var module ) ) return module; if ( !NativeLibrary.TryLoad( dll, out module ) ) return default; loadedModules[dll] = module; return module; } [UnmanagedFunctionPointer( CallingConvention.Cdecl )] public delegate IntPtr CreateInterfaceFn( string pName, IntPtr pReturnCode ); public static IntPtr GetCreateInterface( string dll ) { IntPtr module = LoadModule( dll ); if ( module == IntPtr.Zero ) return default; return NativeLibrary.GetExport( module, "CreateInterface" ); } internal static IntPtr LoadInterface( string dll, string interfacename ) { var createInterface = GetCreateInterface( dll ); if ( createInterface == IntPtr.Zero ) return default; CreateInterfaceFn fn = Marshal.GetDelegateForFunctionPointer( createInterface ); return fn( interfacename, default ); } }