데스크탑 앱을 Windows 10 UWP 앱으로 변환하는 Desktop App Converter
제가 처음 개발을 시작할 때 쯤에는 윈도우 애플리케이션 개발이라고 얘기하면 Visual Studio 6.0을 설치하고 MFC 를 이용한 개발이 대부분이었습니다. 그 후 10년이 넘는 동안 닷넷 시대가 시작되고 윈폼(WinForm), WPF(Windows Presentation Foundation) 가 등장했습니다. 흔히 윈도우 개발자라고 불리던 개발자들은 수많은 애플리케이션을 만들었고 여전히 만들고 있습니다. 하지만 모바일 시대로 접어들면서 관심이 많이 떨어진 것은 사실입니다. 지금은 Windows 10이 빠른속도로 업그레이드 및 설치되면서 UWP(Universal Windows Platform) 시대가 열렸고 애플리케이션이라는 이름보다는 앱이라는 이름이 자연스러워졌습니다.
오래동안 투자해서 만들어 놓은 윈도우 애플리케이션(Win32, 윈폼, WPF)을 점차 UWP 앱으로 변환하고 싶은 요구가 있습니다. 시대가 바뀐 탓도 있지만 많은 장점이 있기 때문이죠. 마이크로소프트는 이런 요구를 받아서 Centennial 이라는 프로젝트를 진행했고 이번 Build 2016에 Preview를 발표했습니다. Desktop App Converter라는 툴을 통해서 윈도우 애플리케이션을 UWP 앱으로 변환하는 방법을 살펴보겠습니다.
이글을 쓰는 현재(2016-04-18) 아직은 정식버전이 아닌 Preview 버전입니다.
사전 준비할 사항들
- 사전준비
- OS: Windows 10 Anniversary Update Enterprise edition preview (빌드번호 10.0.14316.0 이상)
- 2016년 여름에 정식으로 업데이트 될 Windows 10 Anniversary 업데이트에 관련 런타임이 함께 배포됩니다. 따라서 이 글을 쓰고 있는 지금(2016-04-18)은 윈도우 참가자 프로그램(Windows Insider Program)을 이용해서 윈도우 10을 업데이트 해야 합니다.
- 64비트 윈도우 10
- 하드웨어 가상화 지원: 윈도우 10 홈 버전은 지원하지 않고 여러분의 PC나 노트북이 하드웨어 가상화를 지원해야 합니다.
- Second Level Address Translation (SLAT) 지원
- Windows 10 Anniversary SDK Preview (빌드번호 14295) : 참가자 프로그램의 일환입니다.
- 다운로드
- Desktop App Converter와 BaseImage-14316.wim 다운로드
- 변환할 애플리케이션 설치파일 다운로드. 저는 FTP 클라이언트 툴인 FileZilla 로 해봤습니다.
- 사전전검
모든 애플리케이션이 UWP앱으로 변환되는 것은 아닙니다. Preparing your app for conversion to UWP 문서를 보고 가능한지 사전에 확인하고 필요하면 수정을 해야 합니다. 예를들어 반드시 Administrator로 실행되어야 하는 앱, 커널모드 드라이버나 윈도우 서비스는 변환할 수 없습니다.
Desktop Convertor 셋업
PowerShell을 Admin 으로 실행하여 아래 명령을 수행합니다.
Set-ExecutionPolicy bypass
.\DesktopAppConverter.ps1 -Setup -BaseImage .\BaseImage-14316.wim
그리고 시스템 리부팅. 이렇게하면 BaseImage-14316.wim를 풀어서 가상의 PC를 C:\ProgramData\Microsoft\Windows\Images 경로에 만들어냅니다. 용량을 많이 차지하니 넉넉한 하드디스크가 필요합니다.
Desktop Convertor 실행
PowerShell을 Admin으로 실행해서 아래 명령을 수행합니다.
.\DesktopAppConverter.ps1 -ExpandedBaseImage C:\ProgramData\Microsoft\Windows\Images\BaseImage-14316 -Installer FileZilla_3.16.1_win64-setup.exe -InstallerArguments "/S" -Destination FileZillaOutput -PackageName "FileZilla" -Publisher "CN=FileZilla" -Version 0.0.0.1 -MakeAppx -Verbose
PowerShell 이 실행되면서 변환을 위한 환경을 만들고 FileZilla_3.16.1_win64-setup.exe 파일을 /S 옵션(UI 없이 기본값으로 다음다음 넘어가면서 실행)으로 실행해서 destination 에 변환된 파일을 만듭니다. ExtensionBaseImage 의 용도는 셋업 프로그램이 하는일 (파일복사, 레지스트리 수정, system32 폴더와 같은 시스템 폴더에 쓰는 등)을 Docker Container에 하면서 모든 내용을 캡쳐해서 따로 저장하기 위함 입니다. 즉 가상 컴퓨터를 만들어서 거기에 설치를 하는 샘이죠. DesktopAppConverter.ps1 의 상세 옵션은 Desktop App Converter usage 에서 확인 할 수 있습니다.
결과 폴더를 보면 -MakeAppx 옵션을 줬기 때문에 FileZilla.appx 가 생성되었고 셋업 프로그램이 생성한 파일들은 VFS 폴더에 레지스트리가 변경된 내용은 Registry.dat 에 캡쳐되어 저장 생성되었습니다. Assets 파일에는 아이콘 이미지가 기본 값으로 포함되어 있습니다.
서명
appx 파일이 UWP 앱입니다. 이걸 로컬에 설치해서 테스트해서 윈도우 스토어를 통해서 배포하게 됩니다. 테스트를 위해서는 서명을 해야 하는데 이 과정도 수동으로 하려면 알아야 할 것이 많겠지만 우선 문서 그대로 따라해보겠습니다. 여기서 사용한 MakeCert.exe , pvk2pfx.exe , signtool.exe 는 모두 Windows 10 SDK에 포함되어 있습니다. 저의 경우 위치는
C:\Program Files (x86)\Windows Kits\10\bin\x64 에 있습니다. 아래 명령어를 역시 Admin PowerShell 로 실행합니다.
.\makecert .exe -r -h 0 -n "CN=FileZilla" -eku 1.3.6.1.5.5.7.3.3 -pe -sv C:\Users\iloh\Desktop\DesktopAppConverter\FileZilla.pvk C:\Users\iloh\Desktop\DesktopAppConverter\FileZilla.cer
(Private Key 비밀번호를 입력하게 됩니다)
.\pvk2pfx.exe -pvk C:\Users\iloh\Desktop\DesktopAppConverter\FileZilla.pvk -spc C:\Users\iloh\Desktop\DesktopAppConverter\FileZilla.cer -pfx C:\Users\iloh\Desktop\DesktopAppConverter\FileZilla.pfx
여기까지 pfx 파일까지 생성되었고 이 파일을 이용해서 appx 에 서명 합니다. 이 과정은 appx 파일을 생성하는 것과 같이 여러번 수행이 되어야 하기 때문에 bat 파일을 만들어서 한번에 수행되도록 합니다. 여러번 수행 한다는 것은 아이콘을 변경하거나 AppxMenifest.xml 파일을 수정하여 앱의 설정을 바꾸는 작업을 말합니다. 아래는 appxbuild.bat 내용입니다. 첫번째 줄에서 FileZilla.appx 를 삭제하고 두번째 줄에서 FileZillaOutput 폴더의 내용으로 appx 파일을 만들고 세번째 줄에서 서명합니다.
del FileZilla.appx
"C:\Program Files (x86)\Windows Kits\10\bin\x64\makeappx.exe" pack -d FileZillaOutput -p FileZilla.appx
"C:\Program Files (x86)\Windows Kits\10\bin\x64\signtool.exe" sign -f FileZilla.pfx -fd SHA256 -v FileZilla.appx
signtool.exe 에서 오류가 계속 발생했었습니다. 정확한 이유는 모르겠지만 검색을 해보니 uninstaller 가 관련되어 있는 것 같아서 VFS 폴더에 들어있던 uninstaller.exe 삭제후에 정상적으로 서명이 되었습니다. signtool 이 appx 패키지를 검사하다가 포멧이 맞지 않는 exe 파일을 만나서 발생한 오류 같습니다. 이 내용은 본사팀에 알려보겠습니다.
C:\Users\iloh\Desktop\DesktopAppConverter>"C:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" sign -f FileZilla.pfx -fd SHA256 -v FileZilla.appx
The following certificate was selected:
Issued to: FileZilla
Issued by: FileZilla
Expires: Sun Jan 01 08:59:59 2040
SHA1 hash: 1FD7BA9B2225A61F1A6285F8B6209851FE5DF358
Done Adding Additional Store
SignTool Error: SignedCode::Sign returned error: 0x800700C1
%1 is not a valid Win32 application.
SignTool Error: An error occurred while attempting to sign: FileZilla.appx
Number of files successfully Signed: 0
Number of warnings: 0
Number of errors: 1
인증서 설치
appx 에 서명된 인증서를 설치 합니다. 먼저 appx 파일에서 오른쪽 클릭 후 Properties(속성)을 열어서 아래 그림처럼 찾아들어가서 Trusted People 에 설치합니다.
인증서 설치가 잘 되었는지 확인하려면 "Manage computer Certificates"를 실행해서 확인 합니다.
이렇게 만들어진 Appx 파일을 이제 설치해서 테스트 할 수 있습니다. 설치는 PowerShell에서 Add-AppxPackage 명령을 사용합니다.
Add-AppxPackage .\FileZilla.appx
드디어 설치가 되었네요. 잘 작동하는 것 같은데 패스워드가 틀렸는지 연결이 …
여기까지 쉽지 않은 과정이었습니다. win32 앱 이었던 FileZilla를 UWP 앱으로 변환에 성공했습니다. 여기서 끝이 아닙니다. 이제 아이콘도 변경하고 소스코드가 있다면 UWP 기능을 추가하면서 조금더 사용자 친화적인 UWP 앱으로 만드는 것이 중요할 것 같습니다.
관련 문서
Convert your desktop application to a Universal Windows Platform (UWP) app
Build 2016 세션
Project Centennial: Bringing Existing Desktop Applications to the Universal Windows Platform Bringing Desktop Apps to the UWP Using Desktop App Converter
Comments
- Anonymous
May 08, 2016
질문이 있습니다. .\DesktopAppConverter.ps1 -Setup -BaseImage .\BaseImage-14316.wim이 명령을 입력하니 윈도우 버전이 낮아서 실행이 않된다고 하던데, 실행을 위해서 Windows 10 Anniversary 업데이트가 적용된 윈도우에서 실행을 해야 하는 것인가요?- Anonymous
May 08, 2016
Desktop App Converter는 올 여름에 나올 Windows 10 Anniversary 업데이트에서 작동을 하고 지금은 Windows Insider 프로그램에서 10.0.14316.0 빌드 이상 버전에서 가능합니다.
- Anonymous
- Anonymous
July 08, 2016
안녕하세요. 오늘 Centennial 테스트를 처음 해보면서 에러가 발생하여 질문 드립니다.14366 버전의 OS를 설치하고 base wim으로 사용해서 FileZilla 로 테스트 하고 있습니다. 발생한 에러는 아래와 같습니다. VERBOSE: The full error record is saved in the logs at C:\DesktopAppConverter\852c1b9f-39b0-4d46-b575-839c5f1a9026\logsDesktopAppConverter : error 'E_STARTING_ISOLATED_ENV_FAILED': Failed to start the isolated environment. See innerexception for more details.At C:\DesktopAppConverter\converter_util\CWACLogger.ps1:137 char:13+ throw New-Object -TypeName $exceptionType -ArgumentList $ ...+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], RuntimeException + FullyQualifiedErrorId : RuntimeException 조언 부탁 드립니다. - Anonymous
August 24, 2016
좋은 정보 감사 드립니다. 테스트를 해보는데 많은 도움이 됐습니다.참고할 만한 내용을 좀 적어보자면,Base image가 이미 설치되어있는 경우 패키징 할 때 -ExpandedBaseImage를 별도로 지정할 필요가 없습니다.또한 제가 모든 문서를 다 읽어보지 않아 어딘가에 명시가 되어있는지는 모르겠지만, desktop app의 installer가 설치 시 버튼 클릭 등의 사용자 동작이 필요하고 동시에 silent install 기능을 제공하지 않는 경우 isolated environment에서 가상으로 설치 테스트를 할 때 user interaction을 할 수 없어서 패키징 완료를 할 수가 없었습니다. 따라서 변환을 하려는 desktop app installer에서 silent install 옵션을 제공하는지 여부도 변환 전에 확인이 필요할 것 같습니다.