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)..]);
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..];
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); }