2017-05-25 38 views
0

我有一个属性类,我需要拦截debuggind评估。如何通过IDE调试器检测评估

我不知道我该怎么做。

class Foo 
{ 
    public bool DebugIsAllow { get; set; } = false; 
    public string Value 
    { 
     get 
     { 
      if (!DebugIsAllow && IsDebugging()) throw new Exception(); 
      return "ok"; 
     } 
    } 
    public bool IsDebugging() 
    { 
     return ????? 
    } 

    public void Main() 
    { 
     var v = Value; 
Breakpoint here !!! 
     DebugIsAllow = true; 
Breakpoint here !!! 
    } 
} 

在第一个断点,如果我为“V”和“价值”加间谍,我希望看到在监视窗口中:V =“OK”和值=“异常”

而在第二我想在观察窗口看到:v =“ok”和Value =“ok”

谢谢你的帮助。


编辑:

我尝试用 “System.Diagnostics.Debugger.IsAttached” 但却调试器始终高度。不仅当IDE类属性通过监视窗口。

+0

我们不知道您为什么需要这样做。考虑使用混淆器来让别人的生活更加困难。 –

+1

如果相关,请考虑使用'[DebuggerDisplay]'属性(https://msdn.microsoft.com/zh-cn/library/x810d419.aspx)更改在Visual Studio工具窗口中呈现的内容,但它并未设计用于混淆,并且它可以很容易地解决。 –

+0

它不适用于混淆器。实际上,这个属性附有缓存系统和远程呼叫系统。我不想调试器触发远程调用。但我想让它在缓存中获得价值。 属性[System.Diagnostics.DebuggerBrowsable]可以完全禁用评估。但在这种情况下,我可以轻松获得缓存中的值... –

回答

-1

您可以使用该编译器指令假设DEBUG常量的定义:

public bool IsDebugging() 
{ 
#if DEBUG 
    return true; 
#else 
    return false; 
#endif 
} 
+0

不,这不起作用。 “调试”常量只会说如果它编译为调试或发布。不是如果它是正常的执行或IDE调试调用... –