public void Serialize(string path, IEnumerable <MDbgValue> valuesList) { var values = valuesList.ToList(); CorEval eval = debugger.Processes.Active.Threads.Active.CorThread.CreateEval(); var functionName = "BigBrother.Serialization.JsonSerializer.Serialize" + (values.Count + 1); CorAppDomain appDomain = debugger.Processes.Active.Threads.Active.CorThread.AppDomain; if (serializers.Count == 0) { //Load BigBrother into the AppDomain. Then we can call BigBrother.Serialization.JsonSerializer's methods. if (useLoadFrom) { eval.NewString("BigBrother.dll"); debugger.Processes.Active.Go().WaitOne(); var evalAssemblyName = eval.Result; var fnLoad = debugger.Processes.Active.ResolveFunctionNameFromScope("System.Reflection.Assembly.LoadFrom", appDomain); eval.CallParameterizedFunction(fnLoad.CorFunction, null, new CorValue[] { evalAssemblyName }); debugger.Processes.Active.Go().WaitOne(); } else { eval.NewString("BigBrother"); debugger.Processes.Active.Go().WaitOne(); var evalAssemblyName = eval.Result; var fnLoad = debugger.Processes.Active.ResolveFunctionNameFromScope("System.Reflection.Assembly.Load", appDomain); eval.CallParameterizedFunction(fnLoad.CorFunction, null, new CorValue[] { evalAssemblyName }); debugger.Processes.Active.Go().WaitOne(); } } if (!serializers.ContainsKey(functionName)) { serializers[functionName] = debugger.Processes.Active.ResolveFunctionNameFromScope(functionName, appDomain); } eval.NewString(path); debugger.Processes.Active.Go().WaitOne(); CorValue fileName = (debugger.Processes.Active.StopReason as EvalCompleteStopReason).Eval.Result; var corValues = new List <CorValue>(); corValues.Add(fileName); corValues.AddRange(values.Select(v => v.CorValue)); eval.CallParameterizedFunction(serializers[functionName].CorFunction, corValues.Select(v => v.ExactType).ToArray(), corValues.ToArray()); debugger.Processes.Active.Go().WaitOne(); if (debugger.Processes.Active.StopReason is EvalExceptionStopReason) { var stopReason = (EvalExceptionStopReason)debugger.Processes.Active.StopReason; string message = new MDbgValue(debugger.Processes.Active, stopReason.Eval.Result).GetStringValue(true); shell.WriteLine(message); } }
protected override Task <OperationResult <CorValue> > InvokeAsyncImpl() { SubscribeOnEvals(); if (function.GetMethodInfo(context.Session).Name == ".ctor") { eval.NewParameterizedObject(function, typeArgs, args); } else { eval.CallParameterizedFunction(function, typeArgs, args); } context.Session.Process.SetAllThreadsDebugState(CorDebugThreadState.THREAD_SUSPEND, context.Thread); context.Session.ClearEvalStatus(); context.Session.OnStartEvaluating(); context.Session.Process.Continue(false); Task = tcs.Task; // Don't pass token here, because it causes immediately task cancellation which must be performed by debugger event or real timeout return(Task.ContinueWith(task => { UnSubcribeOnEvals(); return task.Result; })); }
public CorValue RuntimeInvoke(CorEvaluationContext ctx, CorFunction function, CorType[] typeArgs, CorValue thisObj, CorValue[] arguments) { if (!ctx.Thread.ActiveChain.IsManaged) { throw new EvaluatorException("Cannot evaluate expression because the thread is stopped in native code."); } CorValue[] args; if (thisObj == null) { args = arguments; } else { args = new CorValue[arguments.Length + 1]; args[0] = thisObj; arguments.CopyTo(args, 1); } CorMethodCall mc = new CorMethodCall(); CorValue exception = null; CorEval eval = ctx.Eval; EvalEventHandler completeHandler = delegate(object o, CorEvalEventArgs eargs) { OnEndEvaluating(); mc.DoneEvent.Set(); eargs.Continue = false; }; EvalEventHandler exceptionHandler = delegate(object o, CorEvalEventArgs eargs) { OnEndEvaluating(); exception = eargs.Eval.Result; mc.DoneEvent.Set(); eargs.Continue = false; }; process.OnEvalComplete += completeHandler; process.OnEvalException += exceptionHandler; mc.OnInvoke = delegate { if (function.GetMethodInfo(this).Name == ".ctor") { eval.NewParameterizedObject(function, typeArgs, args); } else { eval.CallParameterizedFunction(function, typeArgs, args); } process.SetAllThreadsDebugState(CorDebugThreadState.THREAD_SUSPEND, ctx.Thread); ClearEvalStatus(); OnStartEvaluating(); process.Continue(false); }; mc.OnAbort = delegate { eval.Abort(); }; mc.OnGetDescription = delegate { System.Reflection.MethodInfo met = function.GetMethodInfo(ctx.Session); if (met != null) { return(met.Name); } else { return("<Unknown>"); } }; try { ObjectAdapter.AsyncExecute(mc, ctx.Options.EvaluationTimeout); } finally { process.OnEvalComplete -= completeHandler; process.OnEvalException -= exceptionHandler; } if (exception != null) { /* ValueReference<CorValue, CorType> msg = ctx.Adapter.GetMember (ctx, val, "Message"); * if (msg != null) { * string s = msg.ObjectValue as string; * mc.ExceptionMessage = s; * } * else * mc.ExceptionMessage = "Evaluation failed.";*/ CorValRef vref = new CorValRef(exception); throw new EvaluatorException("Evaluation failed: " + ObjectAdapter.GetValueTypeName(ctx, vref)); } return(eval.Result); }