如何检测Visual Studio中执行C#Windows窗体代码?
是否有一个variables或预处理器常量,可以知道代码是在Visual Studio的上下文中执行的?
尝试Debugger.IsAttached或DesignMode属性,或者根据需要获取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); } }