1. WixSharp 소개
Windows Desktop 어플리케이션 배포용 설치 파일을 작성해 보신 분들은 wix toolset을 한 번 쯤 사용해 보셨을겁니다. 오픈소스에 무료로 제공되는 강력한 툴이지만 XML tag를 일일이 작성해줘야하는 번거로움이 있습니다. 특히 설치 dialog 커스터마이징을 위해서 컨트롤 하나하나의 좌표를 일일이 지정해서 배치하고 확인을 위해서는 msi 파일 생성 후 실행해 보아야만 확인이 되는 등의 불편함도 있습니다.
WixSharp은 이런 불편한 XML 태그 작성을 C# 코드로 작성 할 수 있도록 해주는 아주 훌륭한 도구입니다. 특히 설치 대상 파일의 harvest를 위해 heat 커맨드 사용법과 필터 방법을 따로 배울 필요가 없이 C# Linq 를 사용해 간단하게 구현이 가능하고 WPF view를 designer 화면에서 직접 보면서 커스터마이징 할 수 있어서 굉장히 편리합니다.
Github: https://github.com/oleg-shilo/wixsharp
2. WixSharp VS extension 설치하기
WixSharp을 사용하기 위해서 Visual Sutdio 2022 - Extensions 메뉴 => Manage Extensions 창을 열고 wixsharp으로 검색한 다음 WixSharp Project Templates를 설치해 줍니다.
3. WixSharp 프로젝트 생성하기
우선 WixSharpTest 라는 솔루션과 MyApp 콘솔 어플리케이션 프로젝트를 하나 생성합니다.
Solution에 마우스 우측 버튼을 클릭해 새 프로젝트를 추가합니다. WixSharp으로 검색하면 여러개 프로젝트 템플릿이 나오는데 Custom WPF UI를 선택합니다.
프로젝트 명은 MyAppInstaller로 설정합니다.
템플릿이 이전 버전의 NuGet package들을 참조하고 있기 때문에 최신 버전으로 업데이트 해줍니다.
4. 대상 프로젝트 빌드 후 Installer 프로젝트 빌드하기
MyAppInstaller 프로젝트의 Program.cs 파일을 아래와 같이 수정해 줍니다.
using System;
using System.Windows.Forms;
using WixSharp;
using WixSharp.UI.WPF;
namespace MyAppInstaller
{
internal class Program
{
static void Main()
{
var productName = "MyApp";
var companyName = "HiperzStudio";
var project = new ManagedProject($"{productName}",
new Dir($@"%ProgramFiles%\{companyName}\{productName}",
new Files("*.*")));
project.GUID = new Guid("6fe30b47-2577-43ad-9095-1861ba25889b");
// project.ManagedUI = ManagedUI.DefaultWpf; // all stock UI dialogs
//custom set of UI WPF dialogs
project.ManagedUI = new ManagedUI();
project.ManagedUI.InstallDialogs.Add<MyAppInstaller.WelcomeDialog>()
//.Add<MyAppInstaller.LicenceDialog>() // 라이센스 동의 화면 숨김
//.Add<MyAppInstaller.FeaturesDialog>() // Feature 선택 화면 숨김
.Add<MyAppInstaller.InstallDirDialog>()
.Add<MyAppInstaller.ProgressDialog>()
.Add<MyAppInstaller.ExitDialog>();
project.ManagedUI.ModifyDialogs.Add<MyAppInstaller.MaintenanceTypeDialog>()
//.Add<MyAppInstaller.FeaturesDialog>() // Feature 선택 화면 숨김
.Add<MyAppInstaller.ProgressDialog>()
.Add<MyAppInstaller.ExitDialog>();
// 배포할 어플리케이션의 바이너리 파일 위치
project.SourceBaseDir = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"..\MyApp\bin\debug\net6.0");
// MSI 생성 폴더
project.OutDir = System.IO.Path.Combine(System.IO.Directory.GetCurrentDirectory(), @"bin\deployment");
project.BuildMsi();
}
}
}
이제 MyApp을 빌드하고 MyAppInstaller를 빌드하면 bin\deployment 폴더에 msi 파일이 생성 됩니다.
MyApp.msi를 실행하면 아래와같이 설치 GUI를 보실수 있습니다. 너무 간단하죠?
이제 설치를 진행 해보면 아래와같이 Program Files 폴더 하위에 정상적으로 설치된것을 확인 할 수 있습니다.
윈도우즈의 앱 추가 삭제 콘솔에서도 아래와같이 MyApp이 리스트에 나타나는걸 확인 하실 수 있습니다.
다음 글에서는 배포 대상 파일을 필터링하고 바탕화면과 시작메뉴에 바로가기 아이콘을 생성하는 방법에 대해 알아보도록 하겠습니다.
'Development > C#' 카테고리의 다른 글
[C#] Json.NET 으로 XML을 Json으로 Serialize하는 방법 (0) | 2023.03.24 |
---|---|
[C#] C# 버전 10에서 Lambda expression 개선 사항 (0) | 2023.03.03 |
[C#] Jupyter Notebook에서 C# 사용하기 (1) | 2023.02.27 |
[C#] HMACSHA256 클래스를 이용해서 사용자 비밀번호를 암호화하기 (0) | 2023.02.15 |
[C#] Project publish할 때 "Could not find a part of the path..." 오류가 발생할 경우 (0) | 2023.02.12 |