是否有一个变量或预处理器常量允许知道代码是在Visual Studio的上下文中执行的?
wgeznvg71#
根据需要,尝试Debugger.IsAttached或DesignMode属性或获取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; } } }
zu0ti5jz2#
DesignMode属性并不总是准确的。我们已经使用了这种方法,以便它始终工作:
protected new bool DesignMode { get { if (base.DesignMode) return true; return LicenseManager.UsageMode == LicenseUsageMode.Designtime; } }
你打电话的背景很重要。我们已经让DesignMode在IDE中在某些情况下在事件中运行时返回false。
tuwxkamq3#
组件有DesignMode属性。当您使用VS的Design Viewer时,它非常方便。但是当你在Visual Studio中谈论调试时,你需要使用Debugger.IsAttached属性。然后,您可以使用
DesignMode
Debugger.IsAttached
#if DEBUG #endif
太
qv7cva1a4#
我认为确定您的扩展是否在WinForms设计器中执行的最简单和最可靠的方法是检查当前进程。
public static bool InVisualStudio() { return StringComparer.OrdinalIgnoreCase.Equals( "devenv", Process.CurrentProcess.ProcessName); }
ercv8c1e5#
我使用这个扩展方法:
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; } }
30byixjq6#
有一个DesignMode属性可以检查,但根据我的经验,它并不总是准确的。您还可以检查可执行文件是否为DevEnv.exe取一个look here。这可能会使这个问题成为一个骗局,但这一切都取决于你想完成的目标。
wfauudbj7#
您可以使用以下命令:
protected static bool IsInDesigner { get { return (Assembly.GetEntryAssembly() == null); } }
mwecs4sa8#
我使用这段代码来区分它是在VisualStudio中运行还是部署到客户。
if (ApplicationDeployment.IsNetworkDeployed) { // do stuff } else { // do stuff (within Visual Studio) }
对我来说很好用。我在Visual Studio中跳过了一些逻辑(例如登录到应用程序等)。
zbq4xfa09#
我想补充一点,在Visual Studio 2022 with .Net 6中,实际打开winforms设计器的进程称为DesignToolsServer。DesignMode在构造函数之外工作,而ProcessName = "DesignToolsServer"检查在构造函数内工作。
ProcessName = "DesignToolsServer"
9条答案
按热度按时间wgeznvg71#
根据需要,尝试Debugger.IsAttached或DesignMode属性或获取ProcessName或其组合
这是一个sample
zu0ti5jz2#
DesignMode属性并不总是准确的。我们已经使用了这种方法,以便它始终工作:
你打电话的背景很重要。我们已经让DesignMode在IDE中在某些情况下在事件中运行时返回false。
tuwxkamq3#
组件有
DesignMode
属性。当您使用VS的Design Viewer时,它非常方便。但是当你在Visual Studio中谈论调试时,你需要使用
Debugger.IsAttached
属性。然后,您可以使用太
qv7cva1a4#
我认为确定您的扩展是否在WinForms设计器中执行的最简单和最可靠的方法是检查当前进程。
ercv8c1e5#
我使用这个扩展方法:
30byixjq6#
有一个DesignMode属性可以检查,但根据我的经验,它并不总是准确的。您还可以检查可执行文件是否为DevEnv.exe
取一个look here。这可能会使这个问题成为一个骗局,但这一切都取决于你想完成的目标。
wfauudbj7#
您可以使用以下命令:
mwecs4sa8#
我使用这段代码来区分它是在VisualStudio中运行还是部署到客户。
对我来说很好用。我在Visual Studio中跳过了一些逻辑(例如登录到应用程序等)。
zbq4xfa09#
我想补充一点,在Visual Studio 2022 with .Net 6中,实际打开winforms设计器的进程称为DesignToolsServer。
DesignMode
在构造函数之外工作,而ProcessName = "DesignToolsServer"
检查在构造函数内工作。