3

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

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

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

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

4

2 回答 2

2

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

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()
于 2012-09-29T06:09:36.590 回答
0

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

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

我希望,这是可以理解的。

于 2018-06-28T12:15:04.703 回答