/// <summary> /// Perform needed configuration. /// </summary> public static void Setup() { if (Ready) { Engine.Log.Warning("Native libraries are already setup.", MessageSource.Bootstrap); return; } Engine.Log.Info("Adfectus Native Loader", MessageSource.Bootstrap); Engine.Log.Info("-----------", MessageSource.Bootstrap); Engine.Log.Info($"OS: {RuntimeInformation.OSDescription}", MessageSource.Bootstrap); Engine.Log.Info($"64Bit: {Environment.Is64BitProcess}", MessageSource.Bootstrap); Engine.Log.Info($"Execution Directory: {Environment.CurrentDirectory}", MessageSource.Bootstrap); Engine.Log.Info($"Execution Assembly: {Assembly.GetCallingAssembly()}", MessageSource.Bootstrap); // Get lib folder and libs depending on platform. Dictionary <string, string> libs = null; // Check if a 64 bit system. if (RuntimeInformation.OSArchitecture != Architecture.X64) { ErrorHandler.SubmitError(new Exception("Only 64bit OSes are supported.")); return; } if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { LibFolder = $"{Environment.CurrentDirectory}\\Libraries\\win\\"; libs = LibrariesWindows; } else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { // Check for capitalized folder. Yes, really. if (Directory.Exists($"{Environment.CurrentDirectory}/Libraries/MacOS/")) { LibFolder = $"{Environment.CurrentDirectory}/Libraries/MacOS/"; } LibFolder = $"{Environment.CurrentDirectory}/Libraries/macOS/"; libs = LibrariesMacOs; } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { // Check for capitalized folder. Yes, really. if (Directory.Exists($"{Environment.CurrentDirectory}/Libraries/Linux/")) { LibFolder = $"{Environment.CurrentDirectory}/Libraries/Linux/"; } LibFolder = $"{Environment.CurrentDirectory}/Libraries/linux/"; libs = LibrariesLinux; } // If no lib folder or libs - exit. if (LibFolder == null || libs == null) { ErrorHandler.SubmitError(new Exception("Cannot identify library folder or libraries to load.")); return; } // Check if the folder exists. if (!Directory.Exists(LibFolder)) { ErrorHandler.SubmitError(new Exception($"Library folder {LibFolder} not found.")); return; } Engine.Log.Info($"Library Folder: {LibFolder}", MessageSource.Bootstrap); // Load libraries. LoadedLibraries = new Dictionary <string, IntPtr>(); foreach (KeyValuePair <string, string> libArr in libs) { string curLib = libArr.Value; Engine.Log.Trace($"Loading library {curLib}...", MessageSource.Bootstrap); // Get the true path to the file. string libPath = $"{LibFolder}{curLib}"; // Check if the file exists. if (!File.Exists(libPath)) { Engine.Log.Warning($"Couldn't load library {curLib} - it doesn't exist.", MessageSource.Bootstrap); continue; } // Load the library. bool success = NativeLibrary.TryLoad(libPath, out IntPtr libAddr); if (!success) { ErrorHandler.SubmitError(new Exception($"Couldn't load library {curLib}.")); } else { // Add to the list of loaded libraries with the specified key. Library invokers will use this afterward. LoadedLibraries.Add(libArr.Key, libAddr); Engine.Log.Trace($"Loaded library at address {libAddr}.", MessageSource.Bootstrap); } } // Init libraries. FreeImage.Init(LoadedLibraries["freeimage"]); FT.Init(LoadedLibraries["freetype"]); Al.Init(LoadedLibraries["openal"]); Alc.Init(LoadedLibraries["openal"]); Ready = true; Engine.Log.Info("Bootstrap complete!", MessageSource.Bootstrap); }