이 질문을 다시 살펴보면서 나는 다음과 같은 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 애플리케이션),
- SubControl (dll)
- SubSubControl (dll)
그런 다음 SubControl에 SubSubControl을 삽입 한 다음 TestApp.Form에 각각 하나씩 삽입했습니다.
이 스크린 샷은 실행시 결과를 보여줍니다.
이 스크린 샷은 Visual Studio에서 열린 양식의 결과를 보여줍니다.
결론 : 리플렉션없이 생성자 내 에서 신뢰할 수있는 유일한 것은 LicenseUsage이고 생성자 외부 에서 신뢰할 수있는 유일한 것은 'IsDesignedHosted'( 아래 BlueRaja에 의해 ) 인 것으로 보입니다.
추신 : 아래 ToolmakerSteve의 의견을 참조하십시오 (내가 테스트하지 않았습니다) : " IsDesignerHosted 답변이 LicenseUsage를 포함하도록 업데이트되었으므로 이제 테스트는 단순히 (IsDesignerHosted) 일 수 있습니다. 대체 접근 방식은 생성자에서 LicenseManager를 테스트 하는 것입니다. 결과를 캐시합니다 . "