public static void InitHelper(SymbolResolver engineResolver) { Util.LoadExtenderLibrary("LuaHelper.dll"); var helperModule = Util.GetModule("LuaHelper.dll"); var helperResolver = new ExportResolver(helperModule); var symbols = helperResolver.FindSymbolsMatching(new Regex("lua*")).ToArray(); if (symbols.Length == 0) { throw new UnresolvedSymbolException("Could not find LuaHelper symbols"); } var toSkip = new HashSet <string>() { "luaL_checkudata", "luaL_execresult", "luaL_file" }; var addresses = symbols .Select(name => { engineResolver.TryResolve(name, out var result); return(result); }) .ToArray(); InitProxy(symbols, addresses, symbols.Length); luaopen_package = helperResolver.Resolve("luaopen_package"); luaopen_io = helperResolver.Resolve("luaopen_io"); luaopen_os = helperResolver.Resolve("luaopen_os"); }
internal unsafe static void ImportSymbols(SymbolResolver resolver) { foreach (var field in GetFieldsWithAttribute <PdbSymbolAttribute>()) { try { if (!field.IsStatic) { Console.Error.WriteLine("{0}.{1} must be static.", field.DeclaringType, field.Name); continue; } var symbolAttribute = GetCustomAttribute <PdbSymbolAttribute>(field); var symbolName = string.IsNullOrEmpty(symbolAttribute.SymbolName) ? field.Name : symbolAttribute.SymbolName; if (!resolver.TryResolve(symbolName, out var address)) { var errorMessage = string.Format("{0} in {1}.{2}", symbolName, field.DeclaringType, field.Name); throw new UnresolvedSymbolException(errorMessage); } if (field.FieldType == typeof(IntPtr)) { field.SetValue(null, address); } else if (field.FieldType == typeof(UIntPtr)) { field.SetValue(null, new UIntPtr(address.ToPointer())); } else if (field.FieldType.IsPointer) { CreateStaticSetter <IntPtr>(field).Invoke(address); } else if (field.FieldType.IsSubclassOf(typeof(Delegate))) { field.SetValue(null, Marshal.GetDelegateForFunctionPointer(address, field.FieldType)); } else { Console.Error.WriteLine("{0}.{1} must be of IntPtr, UIntPtr or delegate type.", field.DeclaringType, field.Name); } } catch (MarshalDirectiveException ex) { Console.Error.WriteLine("Error importing {0}.{1}", field.DeclaringType, field.Name); throw; } } }
void LogEngineSymbols(SymbolResolver engineResolver) { var engineSymbols = engineResolver.FindSymbolsMatching(new Regex("lua*")); File.WriteAllLines("engine_symbols.txt", engineSymbols); Util.LoadExtenderLibrary("LuaHelper.dll"); var helperModule = Util.GetModule("LuaHelper.dll"); var helperResolver = new ExportResolver(helperModule); var symbols = helperResolver.FindSymbolsMatching(new Regex("lua*")); var missingSymbols = symbols. Where(name => !engineResolver.TryResolve(name, out var _)); File.WriteAllLines("missing_symbols.txt", missingSymbols); }