如何检测C#Windows窗体代码是否在Visual Studio中执行?

时间:2010-03-11 17:55:42

标签: c# winforms

是否有变量或预处理器常量允许知道代码是在Visual Studio的上下文中执行的?

8 个答案:

答案 0 :(得分:61)

尝试Debugger.IsAttachedDesignMode属性或获取ProcessName或其组合,视情况而定

Debugger.IsAttached // or                                       
LicenseUsageMode.Designtime // or 
System.Diagnostics.Process.GetCurrentProcess().ProcessName

这是sample

public static class DesignTimeHelper {
    public static bool IsInDesignMode {
        get {
            bool isInDesignMode = LicenseManager.UsageMode == LicenseUsageMode.Designtime || Debugger.IsAttached == true;

            if (!isInDesignMode) {
                using (var process = Process.GetCurrentProcess()) {
                    return process.ProcessName.ToLowerInvariant().Contains("devenv");
                }
            }

            return isInDesignMode;
        }
    }
}

答案 1 :(得分:17)

DesignMode属性并不总是准确的。我们已经使用了这种方法,因此它可以保持一致:

    protected new bool DesignMode
    {
        get
        {
            if (base.DesignMode)
                return true;

            return LicenseManager.UsageMode == LicenseUsageMode.Designtime;
        }
    }

您的通话环境非常重要。如果在某些情况下在事件中运行,我们已经让IDE中的DesignMode返回false。

答案 2 :(得分:6)

组件有DesignMode属性。使用VS的设计查看器时非常方便。

但是当你谈到在Visual Studio中进行调试时,你需要使用Debugger.IsAttached属性。然后,您可以使用

#if DEBUG
#endif

答案 3 :(得分:4)

我使用这种扩展方法:

internal static class ControlExtension
{
    public static bool IsInDesignMode(this Control control)
    {
        while (control != null)
        {
            if (control.Site != null && control.Site.DesignMode)
                return true;
            control = control.Parent;
        }
        return false;
    }
}

答案 4 :(得分:3)

我认为确定您的扩展是否在WinForms设计器中执行的最简单,最可靠的方法是检查当前进程。

public static bool InVisualStudio() {
  return StringComparer.OrdinalIgnoreCase.Equals(
    "devenv", 
    Process.CurrentProcess.ProcessName);
}

答案 5 :(得分:2)

您可以检查DesignMode属性,但根据我的经验,它并不总是准确的。您还可以检查可执行文件是否为DevEnv.exe

拿一个look here。可能会把这个问题变成一个副本,但这一切都取决于你想要完成的事情。

答案 6 :(得分:2)

您可以使用:

protected static bool IsInDesigner
{
    get { return (Assembly.GetEntryAssembly() == null); }
}

答案 7 :(得分:1)

我使用此代码来区分它是在Visual Studio中运行还是部署到客户。

if (ApplicationDeployment.IsNetworkDeployed) {
    // do stuff 
} else {
   // do stuff (within Visual Studio)
}

多年来一直适合我。我在Visual Studio中跳过一些逻辑(例如登录到应用程序等)。