private static ExecuteResponse ExecuteLoadedAssemblyString(byte[] loadedAssemblyBytes, Activity activity) { 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[] { activity, activity.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); }