如何检测 C# Windows Forms 代码在 Visual Studio 中执行?
Posted
技术标签:
【中文标题】如何检测 C# Windows Forms 代码在 Visual Studio 中执行?【英文标题】:How to detect that C# Windows Forms code is executed within Visual Studio? 【发布时间】:2011-01-26 12:14:11 【问题描述】:是否有变量或预处理器常量可以让我们知道代码是在 Visual Studio 的上下文中执行的?
【问题讨论】:
您是否希望此信息知道您的代码是否正在调试?如果是,则有一个宏告诉您是否将调试器附加到您的应用程序,请参阅:***.com/questions/2188201/… 在 C# 中你可以使用:***.com/questions/361077/… 【参考方案1】:我想补充一点,在带有 .Net 6 的 Visual Studio 2022 中,实际打开 winforms 设计器的过程称为 DesignToolsServer。根据我目前的经验,DesignMode 在构造函数之外工作,而检查 ProcessName = "DesignToolsServer" 在构造函数内工作。
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:我使用这个扩展方法:
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;
【讨论】:
【参考方案3】:你可以用这个:
protected static bool IsInDesigner
get return (Assembly.GetEntryAssembly() == null);
【讨论】:
Excel VSTO 对话框编码期间返回的误报。【参考方案4】:尝试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;
【讨论】:
不要忘记 Process.GetCurrentProcess() 上疯狂的内存泄漏记得处理 在我的代码中,我添加了一个静态 bool 变量以了解何时调用 IsInDesignMode 以及另一个用于保存函数结果的变量。在函数的开头,我返回第一次调用的结果。有了这个,函数的内部只在设计时调用一次,在运行时调用一次。我没有看到设计时间与运行时合并的任何冲突,当您对此函数有大量调用时,这会更快。 这不会区分运行 VS 设计器/预览版和运行附加调试器的应用程序。【参考方案5】:DesignMode 属性并不总是准确的。我们已经使用过这种方法,因此它可以始终如一地工作:
protected new bool DesignMode
get
if (base.DesignMode)
return true;
return LicenseManager.UsageMode == LicenseUsageMode.Designtime;
您的通话内容很重要。如果在某些情况下在事件中运行,我们已经让 DesignMode 在 IDE 中返回 false。
【讨论】:
【参考方案6】:我使用此代码来区分它是在 Visual Studio 中运行还是部署给客户。
if (ApplicationDeployment.IsNetworkDeployed)
// do stuff
else
// do stuff (within Visual Studio)
多年来对我来说都很好。我在 Visual Studio 中跳过了一些逻辑(例如登录到应用程序等)。
【讨论】:
这不是假定使用了ClickOnce(在Visual Studio 中伪装成“发布”)吗?如果一个安装项目用于生成一个普通的MSI安装程序,它会工作吗?【参考方案7】:我认为确定您的扩展是否在 WinForms 设计器中执行的最简单和最可靠的方法是检查当前进程。
public static bool InVisualStudio()
return StringComparer.OrdinalIgnoreCase.Equals(
"devenv",
Process.CurrentProcess.ProcessName);
【讨论】:
【参考方案8】:组件有DesignMode
属性。使用 VS 的 Design Viewer 时很方便。
但是当您谈论在 Visual Studio 中进行调试时,您需要使用 Debugger.IsAttached
属性。然后,您可以使用
#if DEBUG
#endif
太
【讨论】:
【参考方案9】:您可以检查一个 DesignMode 属性,但根据我的经验,它并不总是准确的。您还可以检查可执行文件是否为 DevEnv.exe
参加look here。可能会使这个问题成为一个问题,但这完全取决于您要完成的工作。
【讨论】:
以上是关于如何检测 C# Windows Forms 代码在 Visual Studio 中执行?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Ubuntu 上的 MonoDevelop 中使用 System.Windows.Forms?
无法在 C# 中将类型“System.EventHandler”隐式转换为“System.Windows.Forms.KeyPressEventHandler”[重复]