그 동안 VSTS2010.NET 팀 블로그에 관심을 갖어주신 모든 분들께 감사합니다. 저희 팀 블로그는 이 블로그를 통해 더 이상의 아티클을 발행하지 않으며, 새로운 팀 블로그로 이전을 하기로 하였습니다.
2009년, C++, 게임, 웹, .NET, 소프트웨어 개발을 각기 다른 분야에서 활동하시는 분들이 Visual Studio 2010이라는 개발 툴을 통해 만나게 되었고, 팀 블로그가 창설이 되었습니다.
2012년 9월 25일, 새로운 개발 툴이 한국에 출시되는 시점에서 저희 팀 블로그는 그 동안 소기의 목적을 달성하였다고 판단하며, 그리하여 현재의 팀 블로그는 더 이상 아티클을 발행하지 않으며 폐쇄합니다. 현재 vsts2010.net 도메인은 소멸 날짜까지 유지될 예정이며, 검색으로 유입되어 정보를 찾는 분들을 위해 팀 블로그의 아티클은 유지됩니다.
저희 팀 블로그는 새로운 목적과 목표를 위해 DEVWITH.COM 라는 이름으로 새로운 둥지를 틀었습니다.
Windows 8 스타일앱개발이한창유행이다. 물론모바일생태계전반전인유행은아니더라도 Microsoft 기술을하는사람들에게는큰관심대상이다. Windows 8 운영체제가탑재되는테블릿도출시가되고, New iPad 보다하드웨어스팩이더좋은테블릿출시도준비중인곳이많다고들었다. 새로운마켓이열리는만큼테블릿사용자에게는새로운재미를선사해줄것은분명한사실일것이다.
Windows 8 스타일앱! 개발을위해몇가지알아야할구조적인개념이나유의사항정도만언급하기위해글을써나간다. C++/CX, C#,VB는XAML(eXtensible Application Markup Language)를이용하여 WPF 데스크탑응용프로그램처럼프로그래밍을할수있다. 그리고 HTML/JavaScript 조합으로웹개발환경과유사하게개발을할수있다.아마대부분의 Windows 8 스타일앱개발자라면알고있는내용일것이다. 그리나이포스팅에서는 C++/CX와 C#개발언어를기준으로아티클내용을채울것이다.
WinRT(Windows Runtime)플랫폼의구조적아키텍처이미지이다. 기존 Windows Desktop 응용프로그램환경과다른점은 WinRT APIs 가중간에끼어있다. 이 WinRT 가 Windows 8 스타일앱의핵심이며, Windows 로시작하는Namespace는모두 WinRT 이다.
C#,VB 개발환경은그나마편리한 Library Subset 을제공한다. .NET Framework의최소화버전이라고보면된다.이를 .NET for Windows Store apps 이라고부르며, 위의이미지에는이내용이빠져있다.
C++/CX는딱잘라 .NET for Windows Stores apps가제공되지않는다. .NET 개발자라면 System(mscorlib.dll) 으로시작하는 Namespace 가얼마만큼편한지알텐데, 이 Library Subset이제공되지않으니다른방법을사용해야한다. 쉬운예로 HttpClient와같은클래스도 C++/CX는 MsXml COM 컴포넌트를이용하는편이낫다. 그렇다고모든C++ 라이브러리를사용할수있는것도 아니다. 이 부분에서 특히 라이브러리의 제한이 있으므로 C:\Program Files (x86)\Windows Kits\8.0\Include\shared 폴더에서사용가능한 Header 파일을확인해보도록하자.
만약 Header 파일의 pragma 선언이 Dektop Family 라면 Windows 8 스타일앱에서는사용할수없는라이브러리이며, 상당한 Header들이 Desktop Family에속하여, 당장 .NET for Windows Stores apps 만큼쓸만한클래스들이없다는것이조금슬프다. 다만, 좋은소식이라면 C++ boost Library 등이 C++/CX 용으로컨버전을시도하는분들이많으므로, 조금만기다려보면쓸만한라이브러리들이대거출연할것으로보인다.
더불어 C#, C++ 개발자들도알고있어야하는것중에하나가 WinRT가 COM 컴포넌트기반의라이브러리라는것쯤은들어보았을것이다. 그래서 Windows 8 스타일앱개발자들은 COM에대한개념과더나아가이를구현할수있다면더좋다. 특히 C#, VB 에서 WinRT 컴포넌트를만드는것은몇가지지켜야할제약이있으므로다음의링크를꼭참고하는것이좋다.
대신 C++/CX는 WinRT 컴포넌트를만드는것이오히려더간단하다. 앞서말했다시피 WinRT는 COM 컴포넌트기반이지만, 기존 C++ 에서 COM 컴포넌트를만드는만큼어렵지가않다. C++ COM 구현의첫번째는 IUnknown 인터페이스를구현하는것이지만, WinRT 에서는 Iunknown을 상속하는 IInspectable 인터페이스가더 중요하다.IInspectable 인터페이스는 C++/CX로개발된응용프로그램이런타임중해당클래스의정보를제공하기위한인터페이스이다. 물론기존 C++ 에서도런타임상클래스정보가필요하여이를직접구현하는방법도있다. 하지만C++/CX의 IInspectable 인터페이스는 C++/CX 컴파일과정에서자동으로구현을해준다. 이는곧 IUnknown 인터페이스까지자동으로구현해준다고보면된다. 그렇기 때문에 Iunknown 인터페이스의 AddRef, Release 메서드에대한객체수명주기를 WeakReference 클래스를통해위임할수있다. WeakReference를통해금방해제될수있는컴포넌트를가비지컬렉터대상이되도록지정한다. 그러므로사용빈도가매우많고, 매번자원해제에대한비용이반복되는것은 WeakReference로효과적으로객체수명주기를다룰수있게한다. 이러한 C++/CX에특별히제공되는라이브러리는 Microsoft.WRL Namespace에포함되어있다.
이부분은매우민감한부분이고조심스럽다. 실제 Windows App Store에서테스트할수없을뿐더러개발환경에서발생하는문제이므로, 실제 Windows App Store 를통해발생할수도있을가능성이있을것같다. COM 기반라이브러리나 DLL 구성요소등은공유메모리에로드가된다는것을알것이다. 특히이부분은 COM 컴포넌트에서민감하게다루는 IUnknown 인터페이스의의미와일맥상통한다. 즉, COM 객체의참조카운트(Reference Cout) 가0이되지않으면, 자원은해제되지않는다. 여기에서COM의가장고질적인문제가발생한다. 바로 DLL 지옥이다. Windows 8 스타일앱의메모리위치는앱메모리영역이아닌공유되는메모리영역에위치하고있고, DLL Verserning 이자유롭지못하다. .NET 처럼 GAC(Global Assembly Cache)에서 DLL 버전별로관리되지않는다.
따라서, WinRT 런타임라이브러리를개발하여배포된 Windows 8 앱이활성화상태일때새로운앱에서버전업된WinRT 런타임라이브러리배포시에다른프로세스가점유하고있다는오류가발생한다. 이는앱이초절전유휴상태에진입되어도마찬가지이다.
이찌되었든개발환경에서는충분히발생된문제이니, 차후 Windows App Store에서도발생할지는지켜보아야할것이다.
Windows 8 Windows Runtime 의재배포정책및업데이트
첫런타임라이브러리인만큼라이브러리코드가완벽하지는않을것이다. .NET Framework도 1.0부터 4.5까지버전업이되어왔는데과연 Windows 8 Windows Runtime은어떻게버전업이될까? 사용자의동의없이업데이트나패치는불가능하다.
Windows 8 Features Pack 1,2,3… 시리즈로업데이트가될까? Windows 8 Service Pack 1,2,3… 시리즈로업데이트가될까?
만약이렇게되면, Windows 8 스타일앱간에호환성문제가발생할것이분명하다. Apple의iPhone의모바일폰의운영체제업데이트가실시간으로, 온라인으로이루어진다. Windows 8 은 iPhone의업데이트와차원이달라진다. WinRT만지원하는 ARM 버전과기존의 Windows 8 Desktop을지원하는 x86 버전등몇가지의에디션이있다.
댓글을 달아 주세요