private static ExecuteResponse ExecuteLoadedAssemblyString(byte[] loadedAssemblyBytes, View window) { MethodInfo printMethod; object loadedInstance; try { // TODO: create new AppDomain for each loaded assembly, to prevent memory leakage var loadedAssembly = AppDomain.CurrentDomain.Load(loadedAssemblyBytes); var loadedType = loadedAssembly.GetType("__MTDynamicCode"); if (loadedType == null) return null; loadedInstance = Activator.CreateInstance(loadedType); printMethod = loadedInstance.GetType().GetMethod("Main"); } catch (Exception e) { return new ExecuteResponse { ErrorMessage = e.Message }; } var response = new ExecuteResponse(); try { printMethod.Invoke(loadedInstance, new object[] { window }); response.DumpValues = loadedInstance.GetType().GetField("___dumps").GetValue(loadedInstance) as List<Tuple<string, object, int, bool>>; response.MaxEnumerableItemCount = Convert.ToInt32(loadedInstance.GetType().GetField("___maxEnumerableItemCount").GetValue(loadedInstance)); } catch (Exception e) { var lineNumber = loadedInstance.GetType().GetField("___lastExecutedStatementOffset").GetValue(loadedInstance); response.ErrorMessage = String.Format("___EXCEPTION_____At offset: {0}__{1}", lineNumber, e.InnerException.Message); } return response; }
private static ExecuteResponse ExecuteAssembly(byte[] loadedAssemblyBytes, UIApplicationDelegate appDelegate, UIWindow window) { MethodInfo printMethod; object loadedInstance; try { // TODO: create new AppDomain for each loaded assembly, to prevent memory leakage var loadedAssembly = AppDomain.CurrentDomain.Load(loadedAssemblyBytes); var loadedType = loadedAssembly.GetType("__MTDynamicCode"); if (loadedType == null) return null; loadedInstance = Activator.CreateInstance(loadedType); printMethod = loadedInstance.GetType().GetMethod("Main"); } catch (Exception e) { return new ExecuteResponse { ErrorMessage = e.Message }; } var response = new ExecuteResponse(); try { printMethod.Invoke(loadedInstance, new object[] { appDelegate, window }); var dumpsRaw = loadedInstance.GetType().GetField("___dumps").GetValue(loadedInstance) as IEnumerable; response.SetDumpValues(dumpsRaw.Cast<object>().Select(GetDumpObjectFromObject).ToList()); response.SetMaxEnumerableItemCount(Convert.ToInt32(loadedInstance.GetType().GetField("___maxEnumerableItemCount").GetValue(loadedInstance))); } catch (Exception e) { var lineNumber = loadedInstance.GetType().GetField("___lastExecutedStatementOffset").GetValue(loadedInstance); response.ErrorMessage = String.Format("___EXCEPTION_____At offset: {0}__{1}", lineNumber, e.InnerException.Message); } return response; }