Visual Studio, 특히 Windows Forms 기반 프로젝트를 진행하면서, 사용자 정의 컴포넌트나 사용자 정의 컨트롤을 개발할 때 쉽게 파악하기 힘든 사항 중에 하나가 현재 로드된 컴포넌트나 컨트롤이 디자인 타임 위에서 실행 중인지 런타임 위에서 실행 중인지를 파악하는 것입니다. 저 또한 이 문제 때문에 꽤 많은 고민과 테스트를 수행해보았습니다만 시원치 않은 결과들 뿐이었습니다.
그러다가 결론을 하나 구했고 다음과 같은 내용들입니다.
- Component.DesignMode 속성은 Component.Site 속성이 null 참조가 아니고, 지정된 Site 객체의 DesignMode 속성을 읽어서 반환하는 것이므로 큰 의미는 없습니다.
- Component.Site 속성이 null 참조를 반환하는지 검사하는 방법은 논리적인 오류가 내포되어있을 가능성이 있습니다. 무조건 이런 검사를 사용하면, 디자인 타임이 아니면서도 Site 속성을 이용할 때 문제가 발생할 수 있습니다.
- 외국 포럼의 자료를 검색한 결과 System.ComponentModel.LicenseManager 클래스의 UsageMode 속성을 이용하는 방법을 찾을 수 있었습니다. 이 속성은, LicenseManager 클래스의 Context 객체가 null 참조가 아니고, 해당 객체의 UsageMode 속성 값을 반환하는 것이며, null 참조일 경우 런타임으로 이해합니다.
- Site 속성에 비해 훨씬 목적이 분명하고 제한적이므로 Site 속성을 이용한 판정보다는 안전한 선택이라고 예상됩니다.
- 다만, 초기에 컴포넌트나 컨트롤의 생성자 단계에서만 유효한 정보이므로 이 때 캐치하지 못하면 디자인 타임 위인지 런타임 위인지 판정하지 못한채 런타임으로 인지하고 실행해버리므로 별도의 변수에 보관할 필요가 있습니다.
그 결과 아래와 같이 코드를 구성할 수 있었습니다.
public class MyComponent : Component
{
private readonly bool inDesign;
public MyComponent()
{
// 중략
this.inDesign = (LicenseManager.UsageMode == LicenseUsageMode.Design);
}
}
디자인 타임 때 만들어진 객체의 유효 기간은, Visual Studio에서 디자인 타임 편집 창을 닫기 전까지이므로 싱글턴 패턴을 이용하지 않는다면 만들어질 여러 MyComponent 객체 간의 간섭 효과는 걱정하지 않아도 될 것입니다.
'Software Development > Useful Solutions' 카테고리의 다른 글
| Visual Studio 2010 RC 패치 (KB980610)가 발표되었습니다. (0) | 2010/03/09 |
|---|---|
| Visual Studio 빌드 후 이벤트 기능 확장하기 (0) | 2010/01/18 |
| 디자인 타임과 런타임 구분에 대한 분석 (0) | 2009/12/10 |
| 원하는대로 마음껏 요리하는 Windows Forms 데이터 바인딩 (0) | 2009/12/06 |
| 루씬 라이브러리를 닷넷에서 사용하기 (3) | 2009/09/27 |
| App_Code 폴더를 통하여 여러 프로그래밍 언어 동시에 사용하기 (0) | 2009/09/14 |
CustomBindingSource.cs