我的代码有什么方法可以区分"我在正常流程上下文中执行"one_answers"我是从调试器的即时窗口执行的"吗?
我有一个公开公共属性的库对象。当使用该库的发布版本,但调试已加载包含该库的DLL的应用程序时,如果我从即时窗口更改属性(x.prop=true),我希望我的属性代码检测到这一点并以不同的方式执行。
有办法检测到这一点吗?
为了方便起见,我还希望在使用该库的调试版本时可以使用此功能。所以,我不能只是检查是否附加了调试器,然后从那里进行分支。
我一直注意到,来自即时窗口的任何调用都至少包含一个源自以下命名空间的调用:
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()
如果调用来自即时窗口,唯一需要检查的是创建函数的OUTSIDE一个线程。该线程设置布尔值。
通常,即时窗口不能使用其他线程,因为它们被冻结了。意味着,如果你的布尔值doenst发生了变化,那么你就是一个即时窗口。
我希望这是可以理解的。