⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stepper.cs

📁 SharpDevelop2.0.0 c#开发免费工具
💻 CS
字号:
// <file>
//     <copyright see="prj:///doc/copyright.txt"/>
//     <license see="prj:///doc/license.txt"/>
//     <owner name="David Srbecký" email="dsrbecky@gmail.com"/>
//     <version>$Revision$</version>
// </file>

using System;

using Debugger.Wrappers.CorDebug;

namespace Debugger
{
	class Stepper
	{
		public enum StepperOperation {Idle, StepIn, StepOver, StepOut};
			
		Function function;
		string name;
		ICorDebugStepper corStepper;
		StepperOperation operation = StepperOperation.Idle;
		bool pauseWhenComplete = true;
		
		public event EventHandler<StepperEventArgs> StepComplete;
		
		public NDebugger Debugger {
			get {
				return function.Debugger;
			}
		}
		
		public Function Function {
			get {
				return function;
			}
		}
		
		public string Name {
			get {
				return name;
			}
		}
		
		public StepperOperation Operation {
			get {
				return operation;
			}
		}
		
		public bool PauseWhenComplete {
			get {
				return pauseWhenComplete;
			}
			set {
				pauseWhenComplete = value;
			}
		}
		
		public Stepper(Function function, string name): this(function)
		{
			this.name = name;
		}
		
		public Stepper(Function function)
		{
			this.function = function;
			
			corStepper = function.CorILFrame.CreateStepper();
			
			// Turn on Just-My-Code
			if (corStepper.Is<ICorDebugStepper2>()) { // Is the debuggee .NET 2.0?
				corStepper.SetUnmappedStopMask(CorDebugUnmappedStop.STOP_NONE);
				corStepper.CastTo<ICorDebugStepper2>().SetJMC(1 /* true */);
			}
			
			function.Thread.Steppers.Add(this);
		}
		
		protected internal virtual void OnStepComplete() {
			if (StepComplete != null) {
				StepComplete(this, new StepperEventArgs(this));
			}
		}
		
		public bool IsCorStepper(ICorDebugStepper corStepper)
		{
			return this.corStepper == corStepper;
		}
		
		// NOTE: corStepper.StepOut(); finishes when pevious frame is activated, not when function is exited
		//       this is important for events with multiple handlers
		// NOTE: StepRange callbacks go first (probably in order),
		//       StepOut callback are called after that
		public void StepOut()
		{
			operation = StepperOperation.StepOut;
			// corStepper.StepOut(); // Don't! see note
			corStepper.StepRange(false, new int[] {0, int.MaxValue});
		}
		
		public void StepIn(int[] ranges)
		{
			operation = StepperOperation.StepIn;
			corStepper.StepRange(true /* step in */, ranges);
		}
		
		public void StepOver(int[] ranges)
		{
			operation = StepperOperation.StepOver;
			corStepper.StepRange(false /* step over */, ranges);
		}
		
		public override string ToString()
		{
			return string.Format("{0} in {1} pause={2} {3}", Operation, Function.Name, PauseWhenComplete, name);
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -