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

是否有一个variables或预处理器常量,可以知道代码是在Visual Studio的上下文中执行的?

尝试Debugger.IsAttachedDesignMode属性,或者根据需要获取ProcessName或其组合

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

这里是一个例子

 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; } } } 

DesignMode属性并不总是准确的。 我们已经使用这种方法,以便它一贯工作:

  protected new bool DesignMode { get { if (base.DesignMode) return true; return LicenseManager.UsageMode == LicenseUsageMode.Designtime; } } 

您的电话环境很重要。 如果在某些情况下运行某个事件,则DesignMode在IDE中返回false。

有组件的DesignMode属性。 当您使用VS的Design Viewer时,它非常方便。

但是当您在Visual Studio中讨论debugging时,您需要使用Debugger.IsAttached属性。 那么,你可以使用

 #if DEBUG #endif 

我认为确定你的扩展是否在WinFormsdevise器中执行的最简单也是最可靠的方法是检查当前进程。

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

我使用这种扩展方法:

 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; } } 

有一个DesignMode属性,你可以检查,但以我的经验,它并不总是准确的。 您也可以检查是否可执行文件是DevEnv.exe

看看这里 。 可能会把这个问题变成一个重复,但这一切都取决于你想要完成的事情。

我使用此代码来区分它是否在Visual Studio中运行,或者是否将其部署到客户。

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

对我来说工作好几年了。 在Visual Studio中跳过一些逻辑(如login到应用程序等)。

你可以使用这个:

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