回顾这个问题,我现在“发现”了5种不同的方法,如下所示:
System.ComponentModel.DesignMode property
System.ComponentModel.LicenseManager.UsageMode property
private string ServiceString()
{
if (GetService(typeof(System.ComponentModel.Design.IDesignerHost)) != null)
return "Present";
else
return "Not present";
}
public bool IsDesignerHosted
{
get
{
Control ctrl = this;
while(ctrl != null)
{
if((ctrl.Site != null) && ctrl.Site.DesignMode)
return true;
ctrl = ctrl.Parent;
}
return false;
}
}
public static bool IsInDesignMode()
{
return System.Reflection.Assembly.GetExecutingAssembly()
.Location.Contains("VisualStudio"))
}
为了尝试解决建议的三个解决方案,我创建了一个包含三个项目的小测试解决方案:
- TestApp(winforms应用程序),
- 子控件(dll)
- SubSubControl(dll)
然后,我将SubSubControl嵌入SubControl中,然后将其中之一嵌入TestApp.Form中。
此屏幕快照显示了运行时的结果。
此屏幕快照显示了在Visual Studio中打开表单的结果:
结论:似乎没有经过反思,构造函数内唯一可信赖的是LicenseUsage,构造函数外唯一可信赖的是'IsDesignedHosted'(由下面的BlueRaja提出)
PS:请参阅下面的ToolmakerSteve的评论(我尚未测试):“请注意,IsDesignerHosted答案已更新为包含LicenseUsage ...,因此现在可以简单地进行if(IsDesignerHosted)测试。另一种方法是在构造函数中测试LicenseManager并缓存结果。”