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

8aqjt8rx  于 2023-06-24  发布在  C#
关注(0)|答案(9)|浏览(174)

是否有一个变量或预处理器常量允许知道代码是在Visual Studio的上下文中执行的?

wgeznvg7

wgeznvg71#

根据需要,尝试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;
        }
    }
}
zu0ti5jz

zu0ti5jz2#

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

protected new bool DesignMode
    {
        get
        {
            if (base.DesignMode)
                return true;

            return LicenseManager.UsageMode == LicenseUsageMode.Designtime;
        }
    }

你打电话的背景很重要。我们已经让DesignMode在IDE中在某些情况下在事件中运行时返回false。

tuwxkamq

tuwxkamq3#

组件有DesignMode属性。当您使用VS的Design Viewer时,它非常方便。
但是当你在Visual Studio中谈论调试时,你需要使用Debugger.IsAttached属性。然后,您可以使用

#if DEBUG
#endif

qv7cva1a

qv7cva1a4#

我认为确定您的扩展是否在WinForms设计器中执行的最简单和最可靠的方法是检查当前进程。

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

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

30byixjq6#

有一个DesignMode属性可以检查,但根据我的经验,它并不总是准确的。您还可以检查可执行文件是否为DevEnv.exe
取一个look here。这可能会使这个问题成为一个骗局,但这一切都取决于你想完成的目标。

wfauudbj

wfauudbj7#

您可以使用以下命令:

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

mwecs4sa8#

我使用这段代码来区分它是在VisualStudio中运行还是部署到客户。

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

对我来说很好用。我在Visual Studio中跳过了一些逻辑(例如登录到应用程序等)。

zbq4xfa0

zbq4xfa09#

我想补充一点,在Visual Studio 2022 with .Net 6中,实际打开winforms设计器的进程称为DesignToolsServer
DesignMode在构造函数之外工作,而ProcessName = "DesignToolsServer"检查在构造函数内工作。

相关问题