public ulong GetRVA(string fullName)
        {
            string[] fullNameParts = fullName.Split('.');
            if (fullNameParts.Length != 3)
            {
                return(0);
            }

            for (int imageIndex = 0; imageIndex < metadata.imageDefs.Length; imageIndex++)
            {
                var    imageDef  = metadata.imageDefs[imageIndex];
                string imageName = metadata.GetStringFromIndex(imageDef.nameIndex);
                if (imageName.IndexOf(fullNameParts[0], StringComparison.OrdinalIgnoreCase) != 0)
                {
                    continue;
                }

                var typeEnd = imageDef.typeStart + imageDef.typeCount;
                for (int typeDefIndex = imageDef.typeStart; typeDefIndex < typeEnd; typeDefIndex++)
                {
                    var    typeDef       = metadata.typeDefs[typeDefIndex];
                    string namespaceName = metadata.GetStringFromIndex(typeDef.namespaceIndex);
                    string typeName      = executor.GetTypeDefName(typeDef, false, true);
                    if (!typeName.Equals(fullNameParts[1], StringComparison.OrdinalIgnoreCase))
                    {
                        continue;
                    }

                    //var fieldEnd = typeDef.fieldStart + typeDef.field_count;
                    //for (int i = typeDef.fieldStart; i < fieldEnd; ++i) {
                    //    var fieldDef = metadata.fieldDefs[i];
                    //    var fieldType = il2Cpp.types[fieldDef.typeIndex];
                    //    var isStatic = false;

                    //    string fieldTypeName = executor.GetTypeName(fieldType, false, false);
                    //    string fieldName = metadata.GetStringFromIndex(fieldDef.nameIndex);
                    //    int fieldOffset = il2Cpp.GetFieldOffsetFromIndex(typeDefIndex, i - typeDef.fieldStart, i, typeDef.IsValueType, isStatic);
                    //}

                    var methodEnd = typeDef.methodStart + typeDef.method_count;
                    for (var i = typeDef.methodStart; i < methodEnd; ++i)
                    {
                        var methodDef  = metadata.methodDefs[i];
                        var methodName = metadata.GetStringFromIndex(methodDef.nameIndex);
                        if (!methodName.Equals(fullNameParts[2], StringComparison.OrdinalIgnoreCase))
                        {
                            continue;
                        }

                        var methodPointer = il2Cpp.GetMethodPointer(methodDef.methodIndex, i, imageIndex, methodDef.token);
                        if (methodPointer > 0)
                        {
                            return(il2Cpp.GetRVA(methodPointer));
                        }
                        return(0);
                    }
                }
            }
            return(0);
        }
        public ulong GetRVA(string fullName)
        {
            string[] fullNameParts = fullName.Split('.');
            if (fullNameParts.Length != 3)
            {
                return(0);
            }

            lock (syncLock) {
                for (int imageIndex = 0; imageIndex < metadata.imageDefs.Length; imageIndex++)
                {
                    var    imageDef  = metadata.imageDefs[imageIndex];
                    string imageName = metadata.GetStringFromIndex(imageDef.nameIndex);
                    if (imageName.IndexOf(fullNameParts[0], StringComparison.OrdinalIgnoreCase) != 0)
                    {
                        continue;
                    }

                    var typeEnd = imageDef.typeStart + imageDef.typeCount;
                    for (int typeDefIndex = imageDef.typeStart; typeDefIndex < typeEnd; typeDefIndex++)
                    {
                        var    typeDef  = metadata.typeDefs[typeDefIndex];
                        string typeName = executor.GetTypeDefName(typeDef, false, true);
                        if (!typeName.Equals(fullNameParts[1], StringComparison.OrdinalIgnoreCase))
                        {
                            continue;
                        }

                        var methodEnd = typeDef.methodStart + typeDef.method_count;
                        for (var i = typeDef.methodStart; i < methodEnd; ++i)
                        {
                            var methodDef  = metadata.methodDefs[i];
                            var methodName = metadata.GetStringFromIndex(methodDef.nameIndex);
                            if (!methodName.Equals(fullNameParts[2], StringComparison.OrdinalIgnoreCase))
                            {
                                continue;
                            }

                            var methodPointer = il2Cpp.GetMethodPointer(methodDef.methodIndex, i, imageIndex, methodDef.token);
                            if (methodPointer > 0)
                            {
                                return(il2Cpp.GetRVA(methodPointer));
                            }
                            return(0);
                        }
                    }
                }
            }
            return(0);
        }