この質問を再検討して、これを行う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"))
}
提案された3つのソリューションを試してみるために、3つのプロジェクトを含む小さなテストソリューションを作成しました。
- TestApp(winformsアプリケーション)、
- サブコントロール(dll)
- SubSubControl(dll)
次に、SubSubControlをSubControlに埋め込み、それぞれをTestApp.Formに埋め込みました。
このスクリーンショットは、実行時の結果を示しています。
このスクリーンショットは、Visual Studioでフォームを開いた結果を示しています。
結論:思わ反射せずに信頼性がある唯一の内コンストラクタがLicenseUsageであり、かつ信頼性のある唯一の外部コンストラクタを(により「IsDesignedHosted」はBlueRaja以下)
PS:(私がテストしていないもの)は、以下を参照してくださいToolmakerSteveさんのコメント:「という注意IsDesignerHosted。答えは今(IsDesignerHosted)場合、テストは簡単にすることができ、... LicenseUsageを含むように更新されました別のアプローチは、コンストラクタでテストLicenseManagerの結果をキャッシュします。」