Ejemplo n.º 1
0
        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;
                }
            }
        }
Ejemplo n.º 3
0
        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);
        }