コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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;
            }));
        }
コード例 #3
0
        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);
        }