我的代码是否有任何方法可以区分“我在正常进程上下文中执行”和“我是从调试器的立即窗口执行的”?
我有一个公开属性的库对象。当使用该库的发行版本,但调试已加载包含该库的DLL的应用程序时,如果我从立即窗口(x.prop = true)更改属性,我希望我的属性代码检测到并执行不同。
有没有办法检测到这个?
为方便起见,我还希望在使用该库的调试版本时能够正常工作。所以,我不能只检查是否附加了调试器,并从那里进行分支。
答案 0 :(得分: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()
答案 1 :(得分:0)
如果调用是从“即时窗口”进行的,唯一要检查的一件事是在函数的外部创建一个线程。该线程设置了布尔值。
通常,立即窗口无法使用其他线程,因为它们被冻结。意味着,如果您的布尔值变了,那么您就是直接窗口。
我希望这是可以理解的。