protected override void Dispose(bool disposing)
		{
			Trace.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Dispose() of: {0}", this.ToString()));
			Debug.Assert(disposing);

			if (m_ExpressionCompilerThread != null)
			{
				m_ExpressionCompilerThread.Dispose();
				m_ExpressionCompilerThread = null;
			}

			PackageGlobals.DeinitInstance();

			if (m_UpdateTimer != null)
				m_UpdateTimer.Stop();

			IVsSolution vs_solution = (IVsSolution)GetService(typeof(IVsSolution));
			if (vs_solution != null)
				vs_solution.UnadviseSolutionEvents(m_SolutionEventsCookie);

			IVsDebugger debugger = (IVsDebugger)GetService(typeof(IVsDebugger));
			if (debugger != null)
				debugger.UnadviseDebuggerEvents(m_DebuggerEventsCookie);

			if (m_VSMainWindow != null)
			{
				m_VSMainWindow.Deinitialize();
				m_VSMainWindow = null;
			}

			base.Dispose(disposing);
		}
		private void DelayedInit()
		{
			DTE dte = (DTE)GetService(typeof(DTE));
			if (dte == null)
			{
				// Usually this branch never executes but I want to make sure...
				PackageGlobals.BeginInvokeOnUIThread(DelayedInit);
				return;
			}

			m_VSMainWindow = new VSMainWindow();
			m_VSMainWindow.Initialize((IntPtr)dte.MainWindow.HWnd);
			m_VSMainWindow.OnWindowTitleUpdateNeeded += m_VSMainWindow_OnWindowTitleUpdateNeeded;

			m_UpdateTimer = new System.Windows.Forms.Timer();
			m_UpdateTimer.Tick += UpdateTimer_Tick;
			m_UpdateTimer.Interval = UPDATE_PERIOD_MILLISECS;
			m_UpdateTimer.Start();

			IVsSolution vs_solution = (IVsSolution)GetService(typeof(IVsSolution));
			vs_solution.AdviseSolutionEvents(this, out m_SolutionEventsCookie);

			IVsDebugger debugger = (IVsDebugger)GetService(typeof(IVsDebugger));
			debugger.AdviseDebuggerEvents(this, out m_DebuggerEventsCookie);

			PackageGlobals.InitInstance(this);

			m_PrevVariableValues = PackageGlobals.Instance().CreateFreshEvalContext().VariableValues;

			m_ExpressionCompilerThread = new ExpressionCompilerThread();
			// During normal use the expression doesn't change except when configuring so a cache size of 1 does the job quite well.
			// Usually what changes is the variables.
			m_CompiledExpressionCache = new CompiledExpressionCache(PackageGlobals.Instance().ExecFuncEvaluator, PackageGlobals.Instance().CompileTimeConstants, 1);

			UpdateWindowTitle();
		}