반응형
원문 : http://www.rkttu.com/326 (남정현님 블로그)
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 객체 간의 간섭 효과는 걱정하지 않아도 될 것입니다.
반응형
'Program > C#' 카테고리의 다른 글
[KENIAL] 닷넷에서 윈도우 서비스 제어하기 ; ServiceController (0) | 2010.03.23 |
---|---|
ALL Operations on Active Directory (AD) using c# (0) | 2010.03.21 |
Google API를 이용한 WinForm 날씨 정보 받기 (0) | 2010.03.19 |
Form-Form 데이터 전달 (0) | 2010.03.19 |
WMI를 이용한 PC고유 정보 알아내기 (0) | 2010.03.19 |