기본 콘텐츠로 건너뛰기

[ MSBUILD ] 개념 잡기... #1 기본 설정과 동작

  기본 제공되는 Visual Studio 빌드를 이용해서도 큰 무리는 없지만 파일 배포나 경로 변경 또는 상황적인 파일의 필터링 등을 활용하기 위해서는 MSBUILD 또는 NAnt 와 같은 3rd 빌드 툴을 이용해야 한다. 관련해서 이런 저런 정보를 검색하던 중에 마이크로소프트웨어(마소)에 연재된 MSBUILD 관련 글을 읽어 보고 나름대로 정리를 해 놓도록 한다. MSBUILD 개념   우선 반드시 알고 넘어가야 하는 것은 *.csproj 파일의 정체다. 대 부분은 프로젝트 파일이라고 알고 있지만 정확하게는 MSBUILD 파일이다. 여기에 구성된 파일과 빌드에 필요한 정보를 가지고 있는 XML 파일인 것이다. 기본적인 구성   빌드 스크립트는 아래의 구성과 같이 기본적인 구성이 존재한다. 이 구성을 기준으로 필요한 부분들을 추가하고 조정해 나가면 되는 것이다. 아래의 파일은 build.xml 이라고 생성해 놓는다) <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="Clean"> <Message Text="타겟: Clean" /> </Target> <Target Name="Build"> <Message Text="타겟: Build" /> </Target> <Target Name="Rebuild" DependsOnTargets="Clean; Build"> <Message Text="타겟: Rebuild" /> </Target> </Project>   위의 코드는 말 그대로 뼈대만 존재하는 것이다. 어떤 스크

[ TIP ] OS 에 다른 Language Pack 이 설치된 경우의 코드 페이지 찾기

C# 에서 Code Page 를 찾는 방법은 여러 가지가 존재하지만 그중에서 좀 많이 사용되는 방식은 아래와 같다. Thread.CurrentThread.CurrentCulture.TextInfo.OEMCodePage Encoding.Default.CodePage 그런데 영문 OS 를 설치해 놓고 한글 Language Pack을 설치하여 한글을 사용하는 경우는 위의 두 가지 방식으로는 제대로된 Code Page를 얻을 수 없다. 테스트를 해 본 결과 모두 1521 을 반환한다. Windows 의 Code Page 리스트는 여기 를 참고하면 알 수 있다. 그런데 실제로 해당 PC 에서 Command 창을 열고 chcp 명령을 치면 한글 Language Pack을 쓰고 있기 때문에 "949"로 나온다. 실제 영문 OS 에서는 chcp 를 치면 437 이 나온다. 437 이라는 코드는 MS-DOS 의 미국 코드 페이지 번호를 의미한다. 물론 949 는 한글 코드 페이지를 의미한다. 그럼 949 코드를 얻을 수 있는 방법은 뭘까? 영문 OS 에 한글 Language Pack 을 설치한 PC 에서는 437 대신에 949 가 나온다. 그리고 Culture 나 Encoding 을 통해서는 1521 이 나온다. 그럼 949 는 뭘 기준으로 나온 값일까???? 혹시나 해서 UI 와 관련된 UICulture 를 검사해 봐도 1521 이 나온다. 여기서 힌트가 될 수 있는 것이 cmd 를 실행해서 chcp 를 한 것이다. 즉, 콘솔로 출력이 되는 상황에서 코드 페이지를 검사하면 되지 않을까??? 하는 엉뚱한 생각이 들었다.... 바로 테스트... Console.OutputEncoding.WindowsCodePage 쩝!!! 949 나온다 -_-;;; 나름대로 짱구를 굴려 본 것이 OS 자체는 영문이기 때문에 기본 Culture는 제어판에서 변경하지 않는 한은 영문일 것이고, 기본 Encoding 도 영문

[VSIX] IntelliCommand 패키지 분석 및 교정(?) - Non-EN Visual Studio 에 적용하기.

Visual Studio Extension 들 중에 쓸만한 것들이 많이 있다. 그리고 Visual Studio에는 다양한 기능을 제공하는 Shortcut 들이 존재하지만 일일이 기억하지 못하기 때문에 좋은 기능이 있어서 노가다(?)를 줄여줄 수 있음에도 몰라서 못 쓰는 경우가 많다. IntelliCommand 라는 Visual Studio Extension은 Ctrl, Alt, Shift 등의 기능키를 누르고 있으면 (대략 2초 - 설정에서 변경 가능) 해당 기능키에 배정되어 있는 Shortcut 들을 보여주는 기능을 가지고 있다. 제작자도 언급한 것과 같이 영문 Visual Studio 에서만 동작을 하고 그외 언어로 설치된 Visual Studio에서는 (한글에 영문 Language Pack 설치 포함) 동작하지 않는다. 이왕 패키지를 구성하는 것을 테스트하고 있기 때문에 IntelliCommand를 한글버전에서도 동작할 수 있도록 분석과 교정을 해 보도록 한다. Initialize Settings 패키지가 시작되면 다음과 같은 흐름을 가지고 처리가 진행된다. Get Shell Service (IVsShell) Shell의 속성이 변경되면 처리할 수 있도록 AdviseShellPropertyChanges 를 설정한다. 속성이 변경되면 InitializeCommandServices 를 수행한다. DTE2 서비스를 얻고, Command 출력을 위한 OutputWindowService를 생성한다. (디버그용으로 Visual Studio의 "출력 창"을 열고 정보를 출력하는 기능) DTE 개체에 대해서 다음과 같은 처리 서비스를 등록한다. CommandScopeService Dispatcher.CurrentDispatcher KeyboardListenerService IntelliCommandOptionsDialogPage Main Window 인 CommandsInfoWindow 를 등록하고 Show 한

[VSIX] Visual Studio 확장에 대해서... #5 Events and Commands

Events and Commands 이전 게시글 에서 Wizard를 활용하는 방법을 정리해 보았다. 이번에는 추가된 INI 파일을 변경하고 저장하는 시점을 알아내서 관련된 처리를 수행할 수 있도록 처리하는 방법을 정리해 보도록 한다. 이 과정에서 필요한 것들이 Visual Stuidio에서 발생하는 이벤트들을 처리하는 것이며, 관련된 처리를 하기 위해서 Commands 를 호출하는 방법에 대해서 검토하게 된다. Visual Studio Events 가장 먼저 처리해야 하는 부분이 DTE 와 Events 에 관련된 부분을 패키지에서 설정하는 부분이다. 아래의 그림과 같이 패키지 클래스에 관련된 정보를 설정할 수 있도록 코드를 구성한다. 1: private DTE dte; 2: private Events dteEvents; 3: private DocumentEvents documentEvents; 4:   5: private void setupEvents() { 6: this .dte = (DTE) this .GetService( typeof (SDTE)); 7: this .dteEvents = this .dte.Events; 8: this .documentEvents = this .dteEvents.DocumentEvents; 9: this .documentEvents.DocumentSaved += onDocumentSaved; 10: } 위의 코드에서 확인할 수 있는 것처럼 많은 이벤트들이 제공되지만, 그 중에서도 INI 파일이 저장되는 경우에 처리를 수행할 것이기 때문에 “DocumentSaved” 이벤트를 사용하도록 한다. 이 이벤트에 전달되는 파라미터는 “Document” 로 내용이 수정된 문서 개체이다. 이 문서가 *.tini 파일인 경우에 한해서 자식으로 연결되어 있는 *.cs 파일을 찾아서 필요한 처리를 지정한다.

[VSIX] Visual Studio 확장에 대해서... #4 Wizard 추가

Add a wizard on template 이전 게시글 에서 메뉴와 명령 처리를 설정해서 검증하였다. 이번에는 INI 파일을 단순히 추가하던 기능에 추가하는 과정에서 Culture 정보를 선택할 수 있는 화면을 제공하고 이 화면에서 선택된 Culture를 추가된 파일에 적용하는 구성을 알아보도록 한다. 즉, 쉽게 이야기를 하면 기존 템플릿 처리는 Visual Studio의 내장 마법사를 통해서 처리를 했지만, 이번에는 사용자 정의 마법사 (Custom Wizard)를 구동시켜서 템플릿에 추가적인 정보를 제공할 수 있도록 한다는 것이다. Add a library project Wizard 는 Visual Studio 에서 호출이 되기 때문에 관련된 정보가 vstemplate 파일에 지정되어야 한다. 따라서 별도의 클래스 라이브러리 프로젝트를 추가하여 작업을 하도록 한다. 프로젝트 생성은 따로 설명을 하지 않고 순차적인 처리를 정리해 놓도록 한다. FDTWorksTool.Library 라는 이름의 클래스 라이브러리 프로젝트 (나중에 WPF UI 를 추가할 것이다) 를 생성한다. 자동으로 생성된 클래스 파일은 지운다. 프로젝트를 선택하고 "기존 항목 추가"를 선택하여 서명할 키 파일을 앞에서 생성했던 FDTWorksTool 패키지 프로젝트 경로를 이동하여 "*.snk" 파일을 링크로 추가한다. 프로젝트 속성 창을 열고 "서명" 섹션에서 방금 등록한 snk 파일을 지정하도록 한다. 참조에 "Microsoft.VisualStudio.TemplateWizardInterface" 어셈블리를 추가한다. 아래의 그림은 생성된 클래스 라이브러리 프로젝트를 보여주고 있다. Modify package project 패키지 프로젝트에서는 Wizard를 사용할 수 있도록 위에서 만든 Library 를 추가해 주어야 한다. 참조에 Library Projec