如何检测 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.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;
        
    

【讨论】:

不要忘记 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 中执行?的主要内容,如果未能解决你的问题,请参考以下文章

在 xamarin.forms 中使用 c# 的长按检测器

检测 WebBrowser 完整页面加载

如何检测windows窗体中的控件并对其进行编辑c#

如何在 Ubuntu 上的 MonoDevelop 中使用 System.Windows.Forms?

无法在 C# 中将类型“System.EventHandler”隐式转换为“System.Windows.Forms.KeyPressEventHandler”[重复]

防止 System.Windows.Forms.ComboBox 的自动选择行为(C#)