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