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

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


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

@