2011년 12월 24일 토요일

[VS2010] InstallShield Limited Edition


InstallShield Limited Edition 은  Visual Studio 개발자를 위한 Install Shield 의 무료버전이다.
제한된 기능을 사용할 수 있으며 모든 기능을 사용하려면 Install Shield 2010 전체 버전으로 업그레이드를 받아야 한다.
기존  Visual Studio 설치 및 배포 프로젝트를 이용한 배포 도구는 추 후 Visual Studio 에서 지원하지 않을 예정이라고 한다.


VS2010에서 제공하는 배포 도구 비교
Windows Installer 배포 도구 선택 - MSDN



Getting Started with InstallShield Limited Edition for Visual Studio 2010
Install Shield 개발사인 FLEXERA software 에서 제공하는 메뉴얼. 여기있는 동영상이 참 유용하다.
http://www.flexerasoftware.com/promolanding/10908.htm



InstallShield Limited Edition 설치

Visual Studio 2010을 실행하여 새 프로젝트 만들기를 선택하여 대화상자를 불러온다.
Installed Templates -> Other Project Types -> Setup and Deployment -> InstallShield LE 선택
Enable InstallShield Limited Edition 템플릿 선택



아직 InstallShield LE가 설치되어 있지 않기 때문에 설치 방법에 대한 페이지가 출력된다.
페이지 하단에 "Step 2:Go to the download web site" 를 클릭한다.




하단의 제품 다운로드를 위한 정보를 입력한다. 그런 뒤 Download Now 버튼을 눌러 제품 다운로드!
Email 주소를 정확히 입력해야 한다. InstallShield LE를 설치하면 쉐어웨어 버전으로 설치되어 몇일간만 사용할 수 있다. Email로 제품키를 받을 수 있으며 이 키를 이용해 인증을 받아야 한다.



다운로드 받은 설치 파일을 실행하여 InstallShield LE를 설치!



Email로 전달받은 제품키를 입력한다.







설치 완료 후, 기존 VS2010이 실행되어 있다면 다시 실행시키자.
InstallShield LE 템플릿을 사용할 수 있다.
Installed Templates -> Other Project Types -> Setup and Deployment -> InstallShield LE 선택
Enable InstallShield Limited Edition 템플릿 선택 






2011년 12월 20일 화요일

Writing Debug and Trace Messages


원문 : Writing Debug and Trace Messages - BlackWasp

복잡한 소프트웨어는 디버깅 및 로깅 코드로 모니터링 하기 쉽게 만들어야 한다. 정말로..
고생해 보면 알아요.


What are Debug and Trace Messages?

로그는 복잡한 소프트웨에서 사용자 인터페이스(UI)만으로 동작을 관찰하기 힘들때 사용되어 진다. 로깅 메시지는 프로그램의 문제를 파악하는데 많은 도움이 된다. .NET Framework 에서는 Debug 와 Trace 메시지를 제공해 준다.

Debug messages
System.Diagnostics 네임스페이스의 Debug 클래스 사용
Visual Studio로 디버그 모드로 디버깅 시 "지역 창" 에 출력된다.
메시지 작성을 위한 메소드는 Conditional 어트리뷰트와 DEBUG 심벌을 갖는다. 따라서 프로그램이 Release 모드로 컴파일 되었다면 호출되지 않는다. (디버그 메시지가 최종 사용자에게 보여지지 않음과 디버깅 동작으로 프로그램 성능 저하 방지를 보장한다.)

Trace messages
System.Diagnostics 네임스페이스의 Trace 클래스 사용
TRACE 심벌이 정의되었을 때 코드에 포함된다. Visual Studio 는 기본적으로 TRACE 심벌을 포함하여 빌드한다. 따라서 모듈을 debug 또는 release 모드로 빌드하건 TRACE 코드가 모듈에 포함된다.


Writing Messages

디버그 메시지를 기록하는 가장 간단한 방법으로 디버그 모드에서 프로그램이 실행중일 때 출력창에 메시지를 출력시키는 방법이 있다. Debug, Trace 클래스를 사용하기 위해선 다음 네임스페이스를 using 해준다.


using System.Diagnostics;



Debug, Trace 클래스에는 Write, WriteLine 의 Static 메소드가 존재한다. 하나의 매개변수를 받으며 어떤 타입도 사용될 수 있다. String 타입일 경우 해당 값이 출력되며, 다른 타입일 경우 ToString 메소드의 결과값이 출력된다.


Debug.Write("Application started (Debug)");
Trace.Write("Application stopped (Trace)");

Debug.WriteLine("Application started"); 




Categories

출력하려는 디버그 메시지를 카테고리화 할 수 있다. Write, WriteLine 메서드의 두 번째 매개변수를 주면 되며 이 String 타입의 값이 카테고리의 이름이 된다.


Debug.Write("Application started", "Debug");
Debug.WriteLine("Application stopped", "Debug"); 






Indentation

디버그 메시지를 읽기 쉽게 하기 위해 들여쓰기를 할 수 있다. Indent 메소드를 이용하면 들여쓰기를 하고, Unindent 메소드를 호출하면 들여쓰기를 취소한다.



Debug.WriteLine("Application started", "Application");

Debug.Indent();

Debug.WriteLine("Processing input XML", "File Import");

Debug.WriteLine("Imported 300 row(s)", "File Import");

Debug.Unindent();

Debug.WriteLine("Application stopped", "Application");






Writing Messages Conditionally

디버그 메시지를 원하는 조건일때만 출력하고 싶을 경우가 있다. if 또는 switch 조건문안에서 디비그 메시지를 기록해도 되지만 이 방법은 코드 가독성이 떨어진다.
Debug, Trace 클래스는 조건 매개변수를 갖는 Write, WriteLine 메소드를 제공한다. WriteIf, WriteLineIf 메서드가 있으며 이 메소드는 첫 번째 매개번수 값이 true 일 경우만 메시지를 기록한다.


Debug.WriteLineIf(loggingEnabled, "Application started", "Application");




Using Trace Listeners

Debug, Trace 클래스는 Listeners 프로퍼티를 갖는다. Listeners 프로퍼티는 메시지를 받는 trace listener 들을 컬렉션값으로 갖는다. 보통 출력창을 Listener로 갖는데 상황에 따라 다른 Listener에 메시지를 출력해야 될 때가 있다.

TextWriterTraceListener 라는 Listener는 메지시를 텍스트 파일에 출력한다. 생성자에서 출력할 파일을 지정하며, 파일이 존재하지 않을 경우 새로 생성한다. Listeners 프로퍼티에 TextWriterTraceListener 를 추가한 후, 응용프로그램 종료 전에 Close 메소드를 호출해줘야 한다.

아래 예는 Windows Form 응용프로그램에서의 사용 예이다.
메인 폼이 열리기 전에 TextWriterTraceListener 를 추가하고, 메인 폼이 종료된 후 Close 메소드를 호출해준다. Close 메소드 호출 시 모든 메시지가 지정한 파일에 기록된다.


Debug.Listeners.Add(new TextWriterTraceListener(@"c:\temp\debug.log"));

Application.Run(new MainForm());

Debug.Close();






@

2011년 12월 15일 목요일

[MS SQL Server] PWDENCRYPT 데이터 암호화



데이터를 암호화 하는 함수를 Transact-SQL 함수로 제공을 하는군요!
놀랐습니다!!

*) 참조 : PWDENCRYPT(Transact-SQL) - MSDN

암호 해시 알고리즘을 이용하여 인자로 전달받은 값을 MS SQL Server 암호 해시값으로 변환한다.
오래된 함수 이므로 앞으로 어떻게 될지 모르겠다고 MSDN에 써있네요. HASHBYTES를 이용하라는~!


구문
PWDENCRYPT('password')


인자
password 는 암호화 할 값으로 sysname 값.

반환 형식
varbinary(128)타입의 값

*) sysname
NVARCHAR(128) 과 동일하며, 데이터베이스 개체의 이름에 사용된다. SQL Server 내부적으로 사용되는 형식이다.

*) varbinary
가변길이의 이진 데이터 값 타입


'1' 이라는 값을 암호화 하여 varbinary 타입에 저장할 경우
이진 데이터 값들이 16진수로 저장된다.


'1'이라는 값을 암호화 하여 nvarchar 타입에 저장할 경우
암호화 되었다는 비주얼로(!?) 문자열로 저장된다.



암호화 되어 저장된 값을 임의의 값이랑 비교할때는 PWDCOMPARE 함수를 이용하면 된다.
*) 참조 : PWDCOMPARE - MSDN 



@

[VS-] Debugging with Attach to Process


원문 : Debugging with Attach to Process - BlackWasp



Visual Studio는 프로그램을 디버깅 모드로 실행할 수 있게 한다. 또한 다양한 디버깅 툴을 지원하여 프로그램의 활동을 모니터링 할 수 있게 한다.


Attaching to a Process
이미 실행중인 프로세스에 Visual Studio를 연결할 수 있다!! 단, 몇가지 제약 조권이 있다.
- 해당 프로세스는 디버깅 모드로 컴파일된 어셈블리여야 한다.
- 해당 프로세스 어셈블리 위치에 프로그램 데이터 베이스 파일(*.PDB) 이 있어야 한다.
- PDB 파일에서 참조하는 어셈블리의 소스 코드를 이용해야 한다.
- Visual Studio 가 프로세스 연결 기능을 지원해야 한다. Visual Studio Express 버전은 프로세스 연결 기능을 지원하지 않음.

위 조건을 만족하면 Visual Studio를 실행중인 프로세스에 연결할 수 있다. breakpoint 또는 tracepoint 를 이용하여 코드를 일시 중지 시켜 디버깅할 수 있다.


Show the Attach to Process Dialog Box

실행중인 프로레스를 디버깅 하기 위해서는 "Attach to Process (프로세스에 연결)" 대화상자를 불러와야 한다.
Visual Studio 메뉴 -> Debug -> "Attach to Process..."
*) 프로젝트를 연 상태가 아닐 경우에는 Debug 메뉴에서 찾을 수 없고, "Tools" 메뉴에서 찾을 수 있다.


대화상자의 "Available Processes" 에는 현재 사용자가 실행시킨 프로세스 리스트들이 보안다.
다른 사용자 권한으로 실행중인 프로세스를 디버깅 하기 위해선 하단의 "Show processes form all users" 체크박스에 체크하면 된다.
프로세스 리스트는 실시간으로 보여주지는 않는다. "Refresh" 버튼으로 새로 고칠 수는 있다.

"Attach to:"  항목에는 연결하려는 프로세스의 타입이 나타난다.
Native code, Managed code 두가지가 존재한다.
연결하려는 프로세스를 선택하였을 경우 적절한 타입값으로 자동 설정되며 "Select" 버튼으로 설정해 줄 수 도 있다.

연결하려는 프로세스를 선택한 후 "Attach" 버튼을 누르면 해당 프로세스에 연결하게 된다. Visual Studio가 현재 디버깅중인 상태라면 디버깅에 필요한 컨트롤들이 보인다.

디버깅을 다 하였다면 직접 Process 창(Debug메뉴 -> Window)에서 연결끊기를 선택해줄 수 있다. 간단하게 프로세스에서 오른쪽 버튼을 클릭해 "Detach Process" 를 선택할 수 도 있다. 또한 Debug 메뉴의 "Detach All" 메뉴를 선택할 수도 있다.
연결을 끊는다고 해서 실행중인 프로세스가 종료되는 것은 아니다.

*) 원격 디버깅할 때 참고하면 되겠다.

@

2011년 12월 13일 화요일

Using the DebuggerDisplay Attribute


원문 : Using the DebuggerDisplay Attribute - BlackWasp


디버깅 시 string 타입과 numeric 타입의 값을 볼 수 있다. 사용자 정의 객체의 경우 인스턴스 이름에 해당하는 값에 클래스의 이름 또는 ToString() 메소드의 결과값을 출력된다. DebuggerDisplay 어트리뷰트를 이용하면 이 값들을 변경할 수 있다.


The DebuggerDisplay Attribute

프로그램을 디버그 모드로 Visual Studio 디버거 모드로 실행 시 '지역 창'에서 변수의 값을 관찰할 수 있다.
변수가 객체를 포함하고 있다면 객체를 트리 구조로 표현해준다.


지역 창에서 객체 트리를 펼치면 객체의 프로퍼티와 필드값을 볼 수 있다. 위 이미지에서 경우 MainWindow 타입의 인스턴스에 해당하는 값이 클래스 이름으로 출력된다. 만약 사용자 정의 객체가 ToString 메소드를 오버라이딩 하지 않았다면 객체의 이름이 출력되어 디버깅에 도움이 되지 않는다.

디버깅시 클래스 인스턴스를 위한 유용한 정보가 보여지기 원한다면 ToString 메소드를 오버라이딩 하면 된다.(.NET Framework 1.1 요구 사항) 하지만 ToString 메소드를 클래스가 다른 목적으로 사용한다면 이 방법은 실용적이지 못하다.

*) Effective C# 에서는 사용자 정의 클래스를 정의할 때 항상 ToString 메소드를 적절하게 오버라이딩 하라고 조언한다.

ToString 메소드를 오버라이딩 하지 않고 DebuggerDisplay 어트리뷰트를 적용하면 지역 창에 표시되는 인스턴스값을 바꿀 수 있다. DebuggingDisplay 어트리뷰트는 .NET Framework 2.0 이상에서 지원한다.

DebuggerDisplay 어트리뷰트 대상
- 클래스, 구조체 및 기타 타입에도 사용할 수 있다.

DebuggerDisplay 어트리뷰트 매개변수
- 한개의 String 타입의 매개변수를 갖는다. 이 매개변수값이 지역 창의 Value 값에 출력된다.


Adding the DebuggerDisplay Attribute to a Class

테스트를 해보자! 간단한 사용자 정의 클래스를 갖는 콘솔 어플리케이션을 만든다.
Square 클래스는 Dimension 자동 프로퍼티를 갖으며 영역값을 리턴하는 Square 메소드를 갖는다.


디버깅 모드에서 s.Dimensions = 5 코드에 위치하였을 때 지역창에는 다음과 같이 출력된다. 즉, Square 클래스의 인스턴스인 s 에 값에는 클래스 이름이 출력된다.


Adding the Attribute
DebuggerDisplay 어트리뷰트는 System.Diagnostics 네임스페이스에 있으므로 네임스페이스를 using 해준다.


DebuggerDisplay 어트리뷰트 매개변수에는 출력할 값을 {} 안에 넣어준다. 프로퍼티, 메소드의 리턴값 등이 사용되어 진다.


DebuggerDisplay 에 사용한 프로퍼티가 string 타입이라면 해당 값이 "" 큰따옴표에 묶여 출력되게 된다. 해당 프로퍼티 이름에 nq를 지정하면 큰따옴표 없이 출력된다.




Using Expressions
DebuggerDisplay 어트리뷰트에 간단한 식을 사용할 수 있다. 산술 연산 및 논리 연산이 가능하다.



Demo Source





@

2011년 12월 8일 목요일

[VS-] Visual Studio Debug Mode


원문 : Visual Studio Debug Mode - BlackWasp


Visual Studio 디버그 모드를 사용하는 이유는?!
알고는 있지만 말로하자니~ 위 글에서는 말하는 이유는
코드를 라인 단위로 실행하여 변수의 값을 관찰하거나, 버그를 확인할 때 사용한다! 라고 한다!!


The Visual Studio Debugger

프로그램을 디버거로 디버깅 할 수 있게 하려면 어셈블리에 디버깅 심벌이 포함되어 있어야 한다. 이 디버깅 심벌은 어셈블리를 디버깅 모드로 컴파일 할 때 자동으로 추가된다. 반면, 릴리즈 모드로 컴파일 시 디버깅 심벌은 삭제된다.

테스트 하기 위한 소스코드이다. 콘솔 어플리케이션에 다음 코드를 추가하자.


        static void Main(string[] args)

        {

            int table = 12;

            Console.WriteLine("Multiplication Table for {0}", table);



            for (int i = 1; i <= 12; i++)

            {

                int multiplied = Multiply(i, table);

                Console.WriteLine("{0} x {1} = {2}", i, table, multiplied);

            }

        }



        private static int Multiply(int value, int table)

        {

            int multiplied = value;

            multiplied *= table;

            return multiplied;

        }





Starting a Program in Debug Mode

Visual Studio에서 디버거로 프로그램을 실행시키기 위해서 Debug 메뉴의 Debugging 명령을 클릭하거나, F5 단축키를 누른다.
프로그램을 일시 중지 시키기 위해서는 breakpoint를 추가해애 한다. 프로그램이 처리되지 않은 예외를 던지거나 assertion이 실패되었을때도 프로그램이 일시 중지된다.

테스트를 위해 다음 코드에 breakpoint를 추가하자.


F5 버튼으로 디버깅 모드로 실행시킨다. 프로그램 실행 중 breakpoint 부분을 만나면 해당 코드에 노란색 배경색이 칠해진다.
해당 코드 부분은 앞으로 실행되어질 코드이다. 그 코드를 실행시키기 전에 일시 중지된것이다. 다시 F5를 누르면 다음 breakpoint 를 만날때 까지 프로그램이 계속 실행된다.





Stepping Through Code

Step Into (한 단계씩 코드 실행)

디버깅 모드에서 F11키는 "Step Into (한 단계씩 코드실행)" 이다. 해당 라인에서 메소드 내부로 디버깅할 때 사용된다.
F11 키를 누르면 프로그램의 메인 메소드가 실행되기 바로 전에 디버그 모드로 들어가며 일시 중지된다.

Step Over (프로시저 단위 실행)
F10 키를 이용하면 메소드나 프로퍼티 내부로 이동하지 않고 바로 다음 코드로 이동한다.

Step Out (프로시저 나가기)
F11 또는 F10 키를 이용하여 현재 메소드나 프로퍼티에 디버깅중일 때, 코드의 나머지 부분을 실행시켜 빠져 나오고 싶다면 Shift + F11 키를 누른다.


Stopping and Restarting

Shift + F5 (디버깅 중지)
디버깅 중, 디버깅을 종료하고 프로그램을 종료한다.

Ctrl + Shift + F5 (다시 시작)
디버깅 중, 디버깅을 종료하고 프로그램을 다시 디버깅 모드로 시작 한다.


Controlling the Program Flow

Run to Cursor (커서까지 실행)
코드의 특정 위치에서 프로그램이 일시 중지하길 원한다면 해당 위치에 breakpoint를 넣고 디버그 모드로 실행시키게 된다. breakpoint를 넣지 않고 특정 코드 위치에서 마우스 오른쪽 버튼을 누른 후, "Run to Cursor (코드까지 실행)"을 선택하면 프로그램을 실행하여 해당 위치가 실행될 때 프로그램이 디버그 모드로 들어와 일시 정지된다.


Set Next Statement (다음 문 설정)
디버그 중 프로그램의 흐름을 바꾸고 싶을 때 Set Next Statement (다음 문 설정) 을 사용한다. 원하는 위치에 마우스 오른쪽 버튼 클릭 후 "Set Next Statement" 를 선택한다. 이 때, 현재 break 되어 있는 메소드나 프로퍼티에서만 사용할 수 있다. 또한 현재 break 되어 있는 곳과 Set Next Statement 로 선택한 곳 중간의 코드는 무시된다.



Using the Locals Window

디버깅 중 현재 메소드에 위치한 지역 변수의 값을 관찰할 수 있다.


또한 마우스를 해당 변수에 가져가면 툴팁으로도 확인할 수 있다.

@

2011년 11월 28일 월요일

KeyEventArgs 의 Control 키와 Shift 키에 대하여.


WinForm의 키 이벤트 정보 인자로 KeyEventArgs가 있다.
이 이벤트 정보를 이용하는 이벤트는 다음 두 가지가 있다.
- KeyDown
- KeyUp

리스트뷰와 같은 컨트롤에서 여러개의 노드를 선택하기 위해서는 다음 방법을 사용한다.
1. Shift 키 + 방향 버튼
2. Control 키 + 방향 버튼

따라서 Shift 키 또는 Control 키가 눌려있는지 판별해야 할 필요가 있다.

해당 컨트롤의 KeyDown 이벤트 핸들러에서 키가 눌렀을 때 플래그값을 설정한다.


if (e.Control || e.Shift)

    key = true;




해당 컨트롤의 KeyUp 이벤트 핸들러에서 키가 눌렀다 띄었을 때 플래그값을 설정한다.


if ((e.KeyData == (Keys.LButton | Keys.ShiftKey)) || e.KeyData == Keys.ShiftKey)

     key = false;





의문스러운 것은 KeyUp 이벤트 핸들러에서 e.Control 과 e.Shift 값으로는 해당 이벤트 값을 잡을 수 없었다.
Control 키를 띄었을 때 e.KeyData == (Keys.LButton | Keys.ShiftKey) 

Shift 키를 띄었을 때e.KeyData == Keys.ShiftKey
아.. 왜 그런걸까??

우선 위와 같이 처리!


*) Conrol + a 키 처리
KeyDown 이벤트 핸들러에서


if (e.Control)

{
     if (e.KeyCode.ToString() == "A" || e.KeyCode.ToString() == "a")
     { ... }




*) Keboard Events - http://visualcsharptutorials.com

2011년 11월 24일 목요일

C# Conditional Methods


원문 : C# Conditional Methods - Black Wasp


C# 및 .NET Framework를 이용해 만들어진 어플리케이션은 conditional method (조건부 메소드) 를 포함할 수 있다. conditional method는 지정된 컴파일러 심벌이 정의되어 있을 경우만 호출되는 특별한 메소드 이다. 이 메소드를 사용하면 tracing 및 디버깅을 위한 코드를 더 이상적?!으로 만들 수 있다.


What are Conditinal Methods?

conditional method는 Conditional 어트리뷰터와 컴파일러 심벌 이름을 갖는 메소드이다. 지정한 컴파일러 심벌이 정의되었다면 코드 실행 시 conditional method가 실행된다. 지정한 컴파일러 심벌이 정의되어 있지 않다면 컴파일된 어셈블리에 포함되지 않는다.

목적?!
대부분의 경우 tracing 및 디버깅을 위한 용도로 사용한다.
이 경우 DEBUG 심벌을 사용한다. 디버깅 모드로 컴파일 시 컴파일 옵션에 자동으로 DEBUG 심벌이 추가되므로 디버깅시 어셈블리에 포함된다.
릴리즈 모드로 컴파일 시, DEBUG 심벌을 사용한 Conditional method는 빌드된 어셈블리에서 제외된다.

#if - #endif 와의 차이
#if - #endif 와 비슷하지만 중요한 차이점이 있다.
#if - #endif 에 둘러쌓인 부분은 지정된 심벌이 정의되지 않으면 빌드에서 제외된다.
conditional method 는 항상 빌드되어 최종 어셈블리에 포함된다. 지정한 컴파일 심벌이 존재하지 않으면 해당 메소드는 최종 어셈블리에 포함은 되지만 호출은 되지 않는다.

Conditional Method의 장점, 단점
단점으로 항상 conditional method가 어셈블리에 포함되기 때문에 어셈블리의 크기가 커진다.
장점으로는 하나의 어셈블리가 프로그램과 라이브러리에서 공유될 수 있다. 즉,  conditional method를 포함하는 하나의 어셈블리가 이 어셈블리를 호출하는 프로그램에 따라 다르게 사용될 수 있다. #if - #endif 를 사용하는 코드보다 깔끔하다?!는 장점도 있다.


Conditional Attribute

conditional 어트리뷰트를 적용할 수 있는 메소드는 void 리턴값을 갖어야 한다.
conditional 어트리뷰트는 하나의 string 매개 변수를 갖는다. 이 매개 변수에는 컴파일 심벌값이 들어가야한다.

ex)
[Conditional("DEBUG")]

public static void OutputTraceInformation()

{

    Console.WriteLine("Trace information");

}



2011년 11월 21일 월요일

Debugging Using Assertions


출처 : Debugging Using Assertions - BlackWasp


What is an Assertion?

Assertion은 유용한 디버깅 툴을 제공한다. 프로그램의 실행시간에 Assertion을 수행한다. 모든 Assertion은 필수 조건, Boolean 조건을 갖으며 항상 true가 됨을 예측한다. 만약 조건이 거짓이 된다는 것은 가정이 잘못됬다는 것이고 코드에 버그가 있다는 것이다. 이 때 프로그램을 계속 진행시키는것 보다는 코드를 중지시키고 문제를 해결하는게 정신건강에 좋다.

개발하는 동안 Assertion을 활성화 시키지만 프로그램이 개발 완료되어 사용자에게 전달할 때에는 Assertion을 비활성화 시킨다. .NET 프로그램은 Release모드로 컴파일된 어셈블리는 자동으로 Assertion이 제거되어진다.

Assertion은 private 메소드의 precondition 과 postcondition을 검증하는데 사용되기도 한다.

Assertion은 단지 디버깅의 목적만으로 사용될 수 도 있다. Assert 되는 것을 프로그램의 정상적이지 않은 처리로 여겨진다. 또는 예외 처리 메소드로 사용되어진다.


Debug.Assert Method
Debug 클래스의 Assert 정적 메소드를 이용하면 C# 코드에서 쉽게 Assertion을 생성할 수 있다. Debug 클래스는 System.Diagnostics 네임스페이스에 있다.

다음은 간단한 콘솔 데모 프로그램이다.

Debug 클래스를 사용하는 클래스 파일 최 상단에 네임스페이스를 선언한다.


        using System.Diagnostics;




        public static void Main(string[] args)
        {
            string inputString;
            int minutes;


            do
            {
                Console.WriteLine("Enter a number of minutes to add.");
                inputString = Console.ReadLine();
            } while (!int.TryParse(inputString, out minutes));


            ShowTimePlusMinutes(minutes);
            Console.ReadLine();
        }



        private static void ShowTimePlusMinutes(int minutes)
        {
            Debug.Assert(minutes >= 0);


            DateTime time = DateTime.Now.AddMinutes(minutes);
            Console.WriteLine("In {0} minutes it will be {1}", minutes, time);
        }



 간단히 Debug.Assert 메소드에 Boolean 조건식을 매개변수로 전달하여 사용할 수 있다. 이 조건식이 참이면 Assert를 통과하고 거짓이면 Assert 실패 대화상자가 출력된다.
 위 예제에서 ShowTimePlusMinutes 메소드에 Assert 메소드가 있다. minutes 값이 0보다 크거나 같으면 다음 코드로 이동하고, minutes 값이 0보다 작으면 Assertion Failed 대화상자가 출력된다. 대화상자에는 Assert 한 곳에서의 stack trace 가 출력된다.



Assertion Failed 대화상자는 3개의 옵션 버튼을 갖는다.

1. Abort (중단)
: 프로그램이 즉시 중단되고 종료된다.

2. Retry (다시 시도)
: Assert 한 곳에서 부터 Debug 모드로 들어간다.

3. Ignore
: Assertion을 무시하고 프로그램을 계속 동작시킨다.


Adding Assertion Messages
위 Assertion Failed 대화상자를 보면 X 아이콘 옆이 비어있는것을 볼 수 있다. Assert 메소드의 두 번째 매개변수를 전달하면 X 아이콘 옆에 설정한 메시지가 출력된다.


Debug.Assert(minutes >= 0, "Minutes must be zero or more");





 

X 아이콘 옆에 자세한 메시지도 추가할 수 있다. Assert 메소드의 세 번째 매개변수를 이용한다.


Debug.Assert(minutes >= 0, "Minutes must be zero or more", "The number of minutes was " + minutes);






Demo Program


2011년 11월 17일 목요일

[VS-] Breakpoints and Tracepoints in Visual Studio


원문 : Breakpoints and Tracepoints in Visual Studio - BlackWasp


 프로그램 코드를 디버깅할 때 원하는 위치에서 코드를 멈추게 하는게 중요해요!!
Visual Studio 에서는 breakpoint 를 이용하여 코드를 특정 위치에 멈추게 하며 Trace 정보를 출력시킬 수 도 있다.


What are Breakpoints?

Release 모드로 컴파일된 프로그램이 실행되었을 경우와 디버거가 활성화 되지 않을 경우 breakpoint를 이용할 수 없다.


Settings and Clearing Breakpoints

breakpoint는 프로그램이 실행될 때 실행되는 코드 라인과 클래스 라이브러리에 추가할 수 있다.
주석이나 공백 라인, 클래스 선언부에는 breakpoint를 추가할 수 없다.

테스트할 코드이다. 새로운 콘솔 응용프로그램을 만들고 다음 코드를 메인 메소드에 추가 추가!


for (int i = 1; i <= 12; i++)

{

    Console.WriteLine("Multiplication table {0}.\n", i);

    for (int j = 1; j <= 12; j++)

    {

        Console.WriteLine("{0} x {1} = {2}", j, i, i * j);

    }

    Console.WriteLine("\n");

}




Setting a Breakpoint

breakpoint 추가하는 방법 몇가지가 있는데 우선 Visual Studio의 메뉴를 이용한다. 이 경우 커서가 위치한 곳에 breakpoint가 찍힌다. 단축키 F9를 이용해도 된다.




맨 좌측에 빨간색 동그라미를 "Breakpoint Glyph" 라고 부른다고 한다. (실제로는 한 번도 못들어봤음 ㅋ)


F5키를 눌러 디버깅 모드로 돌입! 프로그램 실행 중 코드의 breakpoint를 만나면 프로그램은 break 모드로 들어간다.
break 모드에서 디버깅 툴을 이용해 코드를 단계별로 디버깅 할 수 있다. 다시 F5를 누르면 break 모드를 빠져나온다.

breakpoint는 맨 좌측 부분을 마우스로 클릭해서도 추가 가능!


Removing a Breakpoint

breakpoint를 추가하는 방법으로 breakpoint를 제거할 수 있다.
규모가 큰 프로그램을 디버깅 할 때 많은 breakpoint를 설정한다. 디버깅이 끝났다면 디버그 메뉴의 "Delete All Breakpoints"를 선택하여 모든 breakpoint를 제거할 수 있다.


Disabling Breakpoints

지정한 breakpoint를 해제하지 않고 일시적으로 비활성화 시킬 수 있다. 지정한 breakpoint에서 마우스 오른쪽 버튼을 누른 후 "Disable Breakpoint"를 선택해 준다. (커맨드 메뉴의 디버그 메뉴 에서도 가능) 비활성화된 breakpoit는 가운데 색이 빠진 원 모양으로 표시된다.






File Breakpoint Dialog

위와 같은 간단한 breakpoint를 생성하는 것 외에 Visual Studio 에서 breakpoint의 추가 설정을 할 수 있다.






활성화된 breakpoint 에서 마우스 오른쪽 버튼을 눌러 "Location..."을 선택한다.
File Breakpoint dialog box 에서 3가지 설정을 이용하여 breakpoint의 위치 정보를 설정한다.
- File           : breakpoint가 위치될 코드 파일의 파일 이름
- Line          : breakpoint가 위치될 코드 라인(행) 번호
- Character  :  breakpoint가 위치될 코드의 열 번호

Character 설정을 이용하면 한 라인에 여러개의 커맨드가 있을 때 break할 커맨드를 설정할 수 있다.


일반적으로 break 모드로 디버깅할때 소스 코드 파일은 반드시 컴파일된 파일과 일치해야 한다. 때때로 사소한 수정을 코드에 했지만 기존 breakpoint를 그대로 사용하고 싶은 경우가 있다. 이 때 "Allow the source code to be different from the original version"(소스 코드가 원래 버전과 일치하지 않아도 됨) 옵션을 선택해 준다.


Conditional Breakpoints

conditional breakpoints는 조건에 맞을때만 break모드로 들어간다. 조건은 Breakpoint Condition dialog box를 이용하여 지정한다.


Condition 체크박스를 체크해야 조건을 판별한다. 조건식을 텍스트박스에 입력한다.
조건은 두가지가 있다.
- Is true           : 텍스트박스의 조건이 참일때만 break 모드로 들어간다.
- Has changed : 조건의 값이 변경되었을 경우 break 모드로 들어간다.

테스트를 위해 조건식에 "i == 10"을 입력한다. 옵션은 "Is true" 옵션 선택.

프로그램을 디버그 모드로 실행시키면 i 가 10일 경우에만 break 모드로 들어간다.
*) 이 경우 File breakpoint 옵션에서 character값을 수정하여 "i<=12"에 breakpoint가 지정되어 있어야 한다.


Setting a Hit Count

모든 breakpoints 는 디버그 모드로 실행중일 동안 hit count를 유지한다. hit count는 0부터 시작하며 breakpoint로 break모드로 들어갈 경우 그 수가 증가한다. Breakpoint Hit Count dialog box를 통해 현재 hit count에 해당하는 행동을 설정할 수 있다.
breakpoint에 마우스 오른쪽 버튼을 클릭하여 컨텍스트메뉴에서 Breakpoint Hit Count dialog box를 불러온다.

옵션
- break always.
: 기본 설정으로 breakpoint로 매번 hit될 때마다 break 모드로 들어간다.

- break when the hit count is equal to.
: 이 설정으로 breakpoint가 단 한번만 활성화 된다. hit count가 텍스트박스에 입력한 값과 같을때만 활성화됨.

- break when the hit count is a multiple of.
: hit count 가 지정한 수의 배수일 경우만 break 모드로 들어간다.

- break when the hit count is greater than or equal to.
: hit count 가 지정한 수보다 크거나 같을 경우만 break 모드로 들어간다.




Breakpoint Filters

한글 Visual Studio 의 Breakpoint Filter dialog box의 설명을 보자!
(자주 사용하는 기능이 아니라 읽어만 봐서는...)


다른 추가 설정과 마찬가지로 breakpont의 마우스 오른쪽 버튼을 눌러 컨텍스트 메뉴에서 "Filter..."를 선택해서 호출한다.


Creating Tracepoints

breakpoint를 tracepoint로 변환하는 방법을 알아보자. tracepoint는 메시지를 출력하거나 매크로를 실행시킨다는 점을 제외하고선 breakpoint와 비슷한다. 게다가 tracepoint를 사용할 경우 프로그램의 실행 중단은 선택적이다.

breakpoint를 tracepoint로 변경하기 위한 dialog box를 실행시킨다. breakpoint 에서 마우스 오른쪽 버튼을 누른 후 컨텍스트 메뉴에서 "When Hit..." (적중될 때)를 선택하면 된다.



breakpoint를 tracepoint로 변경하기 위해 tracepoint가 실행될 경우 출력될 메시지 또는 실행될 매크로 또는 이 두 옵션 모두를 설정한다. 메시지를 출력하기 위해 "Print a message" (메시지 표시) 옵션을 체크한다. 메시지는 breakpoint 주변의 변수이름을 이용하여 변수값을 출력할 수 있다. ("{변수}" 형식 이용). 또한 현재 함수, 프로세스, 스레드 정보를 출력하는 키워드를 사용할 수 있다.

테스트를 위해 메시지 표시 텍스트박스에 다음과 같이 입력한다.
New multiplication table {i}

tracepoint를 만날때 마다 출력 메시지로 설정한 메시지는 Visual Studio의 출력 윈도우에 출력된다.





두 번째 옵션인 "Run a macro" 를 선택하여 tracepoint가 hit되었을 경우 실행할 매크로를 지정할 수 있다. 매크로는 Visual Studio가 미리 정의한 매크로를 사용할 수 있으며 또한 사용자가 작성한 매크로도  사용할 수 있다.

마지막 옵션인 "Continue execution" (계속 실행) 는 tracepont가 breakpoint 처럼 동작할 것인지를 설정한다. 만약 이 옵션이 선택되었을 경우 tracepoint는 출력 및 매크로 실행 후 계속 프로그램을 진행시킨다. 옵션이 체크 해제되었을 경우 breapoint 처럼 hit되었을 경우 프로그램을 break 모드로 들어가게 한다.


The Breakpoint Window

Visual Studio는 Breakpoint 윈도우를 통해 현재 프로젝트의 breakpoint 와 tracepoint를 관리할 수 있게 도와준다.
메뉴의 Debug -> Windows -> Breakpoints 선택






Demo program


 

2011년 11월 16일 수요일

[VS-] Visual Studio Debug and Release Modes


원문 : Visual Studio Debug and Release Modes - BlackWasp
*) 개인적인 학습(?!)을 위해 작성하였으므로 정확하지 않을 수 있습니다.


Native Code 와 마찬가지로 .NET Framework 로 개발된 소프트웨어는 Debug 모드와 Release 모드로 컴파일될 수 있다. 두가지 모드로 컴파일된 모듈은 큰 차이가 있다.


Release Mode

Release 모드로 컴파일 할 때 컴파일러는 결과 모듈이 효율적으로 실행될 수 있도록 이용 가능한 모든 최적화 작업을 수행한다.
일반적으로 결과 모듈은 빠르고 경량이지만 디버깅툴로 접근할 수 없다.


Debug Mode

개발중인 모듈을 컴파일 할 때 사용하는 모드로 추가적인 정보가 모듈에 포함된다. 모듈의 최적화 과정은 수행되지 않는다.
결과 모듈은 사이즈가 크고, 수행 속도가 느리며 효율적이지 않다. 하지만 디버깅 툴로 모듈에 접근할 수 있다.


Setting the Build Mode

빌드 모드를 변경하는 가장 간단한 방법은 Visual Studio 툴바에서 변경하는 것으로, 기본적으로 Debug, Release, Configuration Manager 가 있다. 툴바로 변경하게 되면 솔루션에 포함된 모든 프로젝트에 영향을 주게 된다.


Using the Configuration Manager


<이미지 출처 : http://www.blackwasp.co.uk/images/ConfigurationManager.png>

Configuration Manager 로 솔루션의 빌드 모드를 선택할 수 있다. Debug 및 Release 모드 외에 사용자의 솔루션에 새로운 설정을 생성할 수도 있다. (<New...>를 이용해서) 새로 설정한 빌드 모드를 솔루션의 각각의 프로젝트에 적용할 수 있다.
각각의 프로젝트의 플랫폼을 설정할 수 있으며, 솔루션 빌드 시 각각의 프로젝트의 빌드 여부도 결정할 수 있다.



2011년 11월 13일 일요일

Detecting File Changes with FileSystemWatcher


FileSystemWatcher 클래스에 대해 잘 설명해 놓았다.
Detecting File Changes with FileSystemWatcher

지정한 폴더의 Changed 이벤트에 대한 활용이 어렵지만 참고할 만 하다.



2011년 10월 25일 화요일

[RadioButton] RadioButton 컨트롤이 Focus를 받는다면


 RadioButton 컨트롤 인스턴스의 Focus() 메소드를 호출하면 RadioButton 컨트롤 인스턴스의 Checked 속성이 true가 되는군요. 원래 MFC때부터 그래왔었나 모르겠네요. MSDN을 잘 못 읽었는지 그런 내용은 못찾았는데..




*) .NET Framework 3.5 SP1
*) Visual Studio 2010






2011년 10월 20일 목요일

폼의 시스템 메뉴에 항목을 추가하는 방법




폼의 좌측 시스템 메뉴를 열었을때 임의로 메뉴를 추가하는 방법이다.
※ 폼 좌측에서 열리는 메뉴를 시스템 메뉴(System menu) 또는 컨트롤 메뉴(Control menu) 라고 한다.



Source


        public const Int32 WM_SYSCOMMAND = 0x112;

        public const Int32 MF_SEPARATOR = 0x800;

        public const Int32 MF_STRING = 0x0;

        public const Int32 IDM_ABOUT = 1000;



        protected override void OnLoad(EventArgs e)

        {

            base.OnLoad(e);


            IntPtr sysMenuHandle = GetSystemMenu(Handle, false);

            AppendMenu(sysMenuHandle, MF_SEPARATOR, 0, string.Empty);

            AppendMenu(sysMenuHandle, MF_STRING, IDM_ABOUT, "About...");

        }


        protected override void WndProc(ref Message m)

        {

            if (m.Msg == WM_SYSCOMMAND)

            {

                switch (m.WParam.ToInt32())

                {

                    case IDM_ABOUT:

                        MessageBox.Show("This is About dialog");

                        return;

                    default:

                        break;

                }

            }


            base.WndProc(ref m);

        }



        [DllImport("user32.dll")]

        private static extern bool AppendMenu(IntPtr hMenu, Int32 wFlags, Int32 wIdNewItem, string lpNewItem);


        [DllImport("user32.dll")]

        private static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);





GetSystemMenu, AppendMenu

GetSystemMenu 와 AppendMenu Win32API를 사용한다.

GetSystemMenu
- 응용프로그램에서 시스템 메뉴에 접근하기 위한 함수.
- 첫 번째 인수로 시스템 메뉴를 얻고자 하는 윈도우의 핸들을,
   두 번째 인수로 시스템 메뉴를 얻어오는 설정을 지정해 준다.
   false 값을 지정하면 시스템 메뉴를 수정할 수 있고, true값을 주면 시스템 메뉴를 기본값으로 설정한다. 
- cf) GetSystemMenu function
AppendMenu
- 지정한 메뉴에 새로운 항목을 추가할 때 사용
- 두 번째 인자로 추가할 아이템의 모양과 행동을 플래그값으로 지정한다.
  MF_SEPARATOR 는 분할선을, MF_STRING 은 텍스트 항목을 추가한다고 지정했다.
- 세 번째 인자는 추가하려는 항목의 ID
- 네 번째 인자는  추가하려는 항목의 내용이다.

- cf) AppendMenu function

WndProc
- 새로 추가한 메뉴의 메시지를 처리하기 위해 윈도우 프로시저를 재정의 한다.


Sample




참조
Windows Forms FAQ



2011년 10월 19일 수요일

폼을 활성화 하지 않고 표시


폼을 활성화 하지 않고 표시
음 그러니까 메인폼에서 새로운 폼을 호출 하 되, 포커스는 메인폼에 유지하고 싶을 때를 말한다.


Utility Class

user32.dll 을 임포트하여 Win32API를 이용하는 유틸리티 클래스를 정의한다.
SetVisibleNoActivate 메소드에서 SetWindowPos Win32API를 호출한다. 윈도우 스타일로 SWP_NOACTIVATE 플래그를
지정함으로 구현하는 것 같다.



public static class UtilFuncs

{

        [DllImport("user32.dll")]

        extern public static bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter,
                                                                 int x, int y, int cx, int cy, int uFlags);



        public const int HWND_TOPMOST = -1;     // 0xffff 

        public const int SWP_NOSIZE = 1;            // 0x0001 

        public const int SWP_NOMOVE = 2;          // 0x0002 

        public const int SWP_NOACTIVATE = 16;   // 0x0010 

        public const int SWP_SHOWWINDOW = 64; // 0x0040 



        public static void ShowWindowTopMost(IntPtr handle)

        {

            SetWindowPos(handle, (IntPtr)HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE |
                                                                                                 SWP_NOMOVE |
                                                                                                 SWP_NOACTIVATE |
                                                                                                 SWP_SHOWWINDOW );

        } 

        

        public static void SetVisibleNoActivate(Control control, bool visible )

        {

            if (visible) 

                ShowWindowTopMost(control.Handle);

            

            control.Visible = visible;

        }






폼 비활성화 / 숨기기

위에서 정의한 클래스의 SetVisibleNoActivate 메소드를 호출한다.

폼을 활성화 하지않고 표시
- SetVisibleNoActivate(form, true);

폼을 숨김
- SetVisibleNoActivate(form, false);



private void btnCall_Click(object sender, EventArgs e)

{

            Form2 obj = new Form2();

            //obj.Show();



            //UtilFuncs.SetVisibleNoActivate(obj, false);

            UtilFuncs.SetVisibleNoActivate(obj, true);

 }







Sample :  FormActivateDemo.zip

참조 페이지 : MSDN - Windows Forms FAQ