Example #1
0
        public async Task <(JObject containerObject, string remaining)> ResolveStaticMembersInStaticTypes(string varName, CancellationToken token)
        {
            string classNameToFind = "";

            string[] parts = varName.Split(".", StringSplitOptions.TrimEntries);
            var      store = await proxy.LoadStore(sessionId, token);

            var methodInfo = context.CallStack.FirstOrDefault(s => s.Id == scopeId)?.Method?.Info;

            if (methodInfo == null)
            {
                return(null, null);
            }

            int typeId = -1;

            for (int i = 0; i < parts.Length; i++)
            {
                string part = parts[i];

                if (typeId != -1)
                {
                    JObject memberObject = await FindStaticMemberInType(part, typeId);

                    if (memberObject != null)
                    {
                        string remaining = null;
                        if (i < parts.Length - 1)
                        {
                            remaining = string.Join('.', parts[(i + 1)..]);
Example #2
0
        public async Task <(JObject containerObject, ArraySegment <string> remaining)> ResolveStaticMembersInStaticTypes(ArraySegment <string> parts, CancellationToken token)
        {
            string classNameToFind = "";
            var    store           = await proxy.LoadStore(sessionId, false, token);

            var methodInfo = context.CallStack.FirstOrDefault(s => s.Id == scopeId)?.Method?.Info;

            if (methodInfo == null)
            {
                return(null, null);
            }

            int typeId = -1;

            for (int i = 0; i < parts.Count; i++)
            {
                string part = parts[i];

                if (typeId != -1)
                {
                    JObject memberObject = await FindStaticMemberInType(classNameToFind, part, typeId);

                    if (memberObject != null)
                    {
                        ArraySegment <string> remaining = null;
                        if (i < parts.Count - 1)
                        {
                            remaining = parts[i..];
Example #3
0
        public async Task <JObject> TryToRunOnLoadedClasses(string varName, CancellationToken token)
        {
            string classNameToFind = "";

            string[] parts  = varName.Split(".");
            var      typeId = -1;

            foreach (string part in parts)
            {
                if (classNameToFind.Length > 0)
                {
                    classNameToFind += ".";
                }
                classNameToFind += part.Trim();
                if (typeId != -1)
                {
                    var fields = await proxy.SdbHelper.GetTypeFields(sessionId, typeId, token);

                    foreach (var field in fields)
                    {
                        if (field.Name == part.Trim())
                        {
                            var isInitialized = await proxy.SdbHelper.TypeIsInitialized(sessionId, typeId, token);

                            if (isInitialized == 0)
                            {
                                isInitialized = await proxy.SdbHelper.TypeInitialize(sessionId, typeId, token);
                            }
                            var valueRet = await proxy.SdbHelper.GetFieldValue(sessionId, typeId, field.Id, token);

                            return(await GetValueFromObject(valueRet, token));
                        }
                    }
                    var methodId = await proxy.SdbHelper.GetPropertyMethodIdByName(sessionId, typeId, part.Trim(), token);

                    if (methodId != -1)
                    {
                        var commandParamsObj       = new MemoryStream();
                        var commandParamsObjWriter = new MonoBinaryWriter(commandParamsObj);
                        commandParamsObjWriter.Write(0); //param count
                        var retMethod = await proxy.SdbHelper.InvokeMethod(sessionId, commandParamsObj.ToArray(), methodId, "methodRet", token);

                        return(await GetValueFromObject(retMethod, token));
                    }
                }
                var store = await proxy.LoadStore(sessionId, token);

                foreach (var asm in store.assemblies)
                {
                    var type = asm.GetTypeByName(classNameToFind);
                    if (type != null)
                    {
                        var assemblyId = await proxy.SdbHelper.GetAssemblyId(sessionId, type.assembly.Name, token);

                        typeId = await proxy.SdbHelper.GetTypeIdFromToken(sessionId, assemblyId, type.Token, token);
                    }
                }
            }
            return(null);
        }
        public async Task <(JObject containerObject, ArraySegment <string> remaining)> ResolveStaticMembersInStaticTypes(ArraySegment <string> expressionParts, CancellationToken token)
        {
            var store = await proxy.LoadStore(sessionId, false, token);

            var methodInfo = context.CallStack.FirstOrDefault(s => s.Id == scopeId)?.Method?.Info;

            if (methodInfo == null)
            {
                return(null, null);
            }

            string[] parts = expressionParts.ToArray();

            string fullName = methodInfo.IsAsync == 0 ? methodInfo.TypeInfo.FullName : StripAsyncPartOfFullName(methodInfo.TypeInfo.FullName);

            string[] fullNameParts = fullName.Split(".", StringSplitOptions.TrimEntries).ToArray();
            for (int i = 0; i < fullNameParts.Length; i++)
            {
                string[] fullNamePrefix = fullNameParts[..^ i];
        public async Task <JObject> TryToRunOnLoadedClasses(string varName, CancellationToken token)
        {
            string classNameToFind = "";

            string[] parts  = varName.Split(".");
            var      typeId = -1;

            foreach (string part in parts)
            {
                if (classNameToFind.Length > 0)
                {
                    classNameToFind += ".";
                }
                classNameToFind += part.Trim();
                if (typeId != -1)
                {
                    var fields = await context.SdbAgent.GetTypeFields(typeId, token);

                    foreach (var field in fields)
                    {
                        if (field.Name == part.Trim())
                        {
                            var isInitialized = await context.SdbAgent.TypeIsInitialized(typeId, token);

                            if (isInitialized == 0)
                            {
                                isInitialized = await context.SdbAgent.TypeInitialize(typeId, token);
                            }
                            var valueRet = await context.SdbAgent.GetFieldValue(typeId, field.Id, token);

                            return(await GetValueFromObject(valueRet, token));
                        }
                    }
                    var methodId = await context.SdbAgent.GetPropertyMethodIdByName(typeId, part.Trim(), token);

                    if (methodId != -1)
                    {
                        using var commandParamsObjWriter = new MonoBinaryWriter();
                        commandParamsObjWriter.Write(0); //param count
                        var retMethod = await context.SdbAgent.InvokeMethod(commandParamsObjWriter.GetParameterBuffer(), methodId, "methodRet", token);

                        return(await GetValueFromObject(retMethod, token));
                    }
                }
                var store = await proxy.LoadStore(sessionId, token);

                var methodInfo = context.CallStack.FirstOrDefault(s => s.Id == scopeId)?.Method?.Info;
                var classNameToFindWithNamespace =
                    string.IsNullOrEmpty(methodInfo?.TypeInfo?.Namespace) ?
                    classNameToFind :
                    methodInfo.TypeInfo.Namespace + "." + classNameToFind;

                var searchResult = await TryFindNameInAssembly(store.assemblies, classNameToFindWithNamespace);

                if (searchResult == null)
                {
                    searchResult = await TryFindNameInAssembly(store.assemblies, classNameToFind);
                }
                if (searchResult != null)
                {
                    typeId = (int)searchResult;
                }

                async Task <int?> TryGetTypeIdFromName(string typeName, AssemblyInfo assembly)
                {
                    var type = assembly.GetTypeByName(typeName);

                    if (type == null)
                    {
                        return(null);
                    }
                    return(await context.SdbAgent.GetTypeIdFromToken(assembly.DebugId, type.Token, token));
                }

                async Task <int?> TryFindNameInAssembly(List <AssemblyInfo> assemblies, string name)
                {
                    foreach (var asm in assemblies)
                    {
                        var typeId = await TryGetTypeIdFromName(name, asm);

                        if (typeId != null)
                        {
                            return(typeId);
                        }
                    }
                    return(null);
                }
            }
            return(null);
        }