【问题标题】:How can I tell if my code has been called from the Immediate Window?如何判断我的代码是否已从即时窗口调用?
【发布时间】:2012-08-27 00:55:10
【问题描述】:

我的代码有什么方法可以区分“我在正常进程上下文中执行”和“我已从调试器的即时窗口执行”之间的区别?

我有一个公开公共属性的库对象。当使用该库的发布版本,但调试已加载包含该库的 DLL 的应用程序时,如果我从即时窗口 (x.prop = true) 更改属性,我希望我的属性代码检测到这一点并执行不同。

有没有办法检测到这一点?

为了方便起见,当我使用该库的调试版本时,我也希望它能够工作。所以,我不能只检查是否连接了调试器,然后从那里分支。

【问题讨论】:

  • 在您等待某人回答时,尝试使用 StackTrace 类,看看您是否可以从调用堆栈中分辨出调用来自何处。很明显它来自调试器程序集。
  • @Paul,谢谢,但该系统使用 Debugger.IsAttached,我指定它不能在这里工作,因为当我调试库本身时,这段代码也会运行......
  • @Habo,谢谢,我确实先检查了这个。立即窗口显然非常擅长直接挂接到现有堆栈中,因为堆栈中没有提及它。堆栈中除了通常会存在的东西外,什么都没有。我很失望。
  • +1 好问题,相关stackoverflow.com/a/10918403/495455 - 如果这个问题没有解决方案,解决方法是在从即时窗口调用时使用重载方法以不同方式执行。

标签: c# .net visual-studio-debugging immediate-window


【解决方案1】:

我一直注意到的一件事是,来自即时窗口的任何调用都至少包含一个源自以下命名空间的调用:

Microsoft.VisualStudio.HostingProcess

如果你有,说:

public static string DumpStack()
{
    return new StackTrace().ToString();
}

你会看到类似于:

   at ConsoleApplication1.Program.DumpStack()
   at ConsoleApplication1.Program.Main(String[] args)
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

【讨论】:

    【解决方案2】:

    唯一要检查的一件事是,如果调用来自即时窗口,则需要在函数的外部创建一个线程。该线程设置一个布尔值。

    通常,即时窗口不能使用其他线程,因为它们被冻结了。意思是,如果你的布尔值没有改变,那么你就是一个即时窗口。

    我希望这是可以理解的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-16
      • 2010-09-27
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      相关资源
      最近更新 更多