是否有变量或预处理器常量允许知道代码是在Visual Studio的上下文中执行的?
答案 0 :(得分:61)
尝试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;
}
}
}
答案 1 :(得分:17)
DesignMode属性并不总是准确的。我们已经使用了这种方法,因此它可以保持一致:
protected new bool DesignMode
{
get
{
if (base.DesignMode)
return true;
return LicenseManager.UsageMode == LicenseUsageMode.Designtime;
}
}
您的通话环境非常重要。如果在某些情况下在事件中运行,我们已经让IDE中的DesignMode返回false。
答案 2 :(得分:6)
组件有DesignMode
属性。使用VS的设计查看器时非常方便。
但是当你谈到在Visual Studio中进行调试时,你需要使用Debugger.IsAttached
属性。然后,您可以使用
#if DEBUG
#endif
太
答案 3 :(得分:4)
我使用这种扩展方法:
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;
}
}
答案 4 :(得分:3)
我认为确定您的扩展是否在WinForms设计器中执行的最简单,最可靠的方法是检查当前进程。
public static bool InVisualStudio() {
return StringComparer.OrdinalIgnoreCase.Equals(
"devenv",
Process.CurrentProcess.ProcessName);
}
答案 5 :(得分:2)
您可以检查DesignMode属性,但根据我的经验,它并不总是准确的。您还可以检查可执行文件是否为DevEnv.exe
拿一个look here。可能会把这个问题变成一个副本,但这一切都取决于你想要完成的事情。
答案 6 :(得分:2)
您可以使用:
protected static bool IsInDesigner
{
get { return (Assembly.GetEntryAssembly() == null); }
}
答案 7 :(得分:1)
我使用此代码来区分它是在Visual Studio中运行还是部署到客户。
if (ApplicationDeployment.IsNetworkDeployed) {
// do stuff
} else {
// do stuff (within Visual Studio)
}
多年来一直适合我。我在Visual Studio中跳过一些逻辑(例如登录到应用程序等)。