MSIX 인스톨러를 더블클릭 EXE로 만들어주는 도구 — MSIX Installer Generator

MSIX는 Windows의 최신 패키징 포맷입니다. 샌드박스 기반으로 동작해서 레지스트리나 파일 연결 같은 시스템 변경이 격리되고, 삭제하면 잔여물이 하나도 남지 않습니다. MSIXBundle로 x64, x86, ARM64를 하나의 파일에 담을 수도 있고요.

문제는 배포입니다.

MSIX를 스토어 밖에서 설치하려면 사용자가 개발자 모드를 켜고, PowerShell을 열고, 인증서를 신뢰해야 합니다. 개발자한테는 당연한 과정이지만, 일반 사용자한테는 전부 장벽입니다. Electron이나 Tauri로 앱을 만들어도 MSIX 패키징을 지원하지 않는 프레임워크가 많고요.

그래서 만들었습니다. MSIX Installer Generator는 MSIX 패키징부터 더블클릭 EXE 인스톨러 생성까지 한 번에 처리하는 도구입니다.

어떻게 시작됐나

원래 이 프로젝트는 MSIX와는 관계가 없었습니다.

WinUI 3로 만든 앱을 스토어 밖에서 배포하려고, .atp라는 자체 패키지 포맷을 쓰는 인스톨러 프레임워크를 만들고 있었습니다. 7z로 압축해서 인스톨러에 넘기고, 레지스트리 등록이나 시작 메뉴 바로가기 생성을 인스톨러가 처리하는 구조였습니다. 단순한 EXE 패키징으로는 충분히 잘 동작했고요.

그러던 중에 문득 “MSIX를 쓰면 샌드박스까지 지원하는데, 이걸로 인스톨러를 만들면 어떨까?” 하는 생각이 떠올랐습니다. 기존 .atp 방식은 편리하긴 하지만, 결국 레지스트리에 직접 쓰고 AppData에 폴더를 만드는 전통적인 설치 방식이라 깔끔한 삭제가 보장되지 않습니다. MSIX를 쓰면 Windows가 알아서 샌드박스로 격리하고, 삭제할 때 잔여물이 하나도 남지 않잖아요.

그래서 MSIX 설치 지원을 추가하기 시작했는데, 하다 보니 인증서 생성, 매니페스트 작성, 패키징까지 전부 사용자가 직접 해야 한다는 게 문제였습니다. 프레임워크가 MSIX 패키징을 지원하지 않는 경우도 많고요. 결국 패키징까지 자동화하는 도구를 만들게 됐고, 지금은 MSIX 패키징부터 EXE 인스톨러 구성까지 한 번에 처리하는 형태가 됐습니다.

어떤 문제를 풀고 싶었나

MSIX로 배포하려니 사용자 경험이 너무 안 좋았습니다.

  • “개발자 모드를 켜세요” → 사용자가 당황
  • “PowerShell을 관리자 권한으로 열어서 명령어를 입력하세요” → 더 당황
  • “인증서를 신뢰하세요” → 제일 당황

인스톨러를 더블클릭하면 끝나는 전통적인 EXE 인스톨러의 간편함과 MSIX의 샌드박스 이점을 둘 다 가져가고 싶었습니다.

MSIX Installer Generator가 하는 일

크게 두 가지입니다.

1. MSIX 패키징

인증서 생성, 매니페스트 작성, 빌드 출력 패키징을 GUI에서 처리합니다. 프레임워크가 MSIX 패키징을 지원하지 않아도, 빌드 출력 폴더만 지정하면 됩니다. x64, ARM64 등 아키텍처별 폴더를 추가하면 PE 헤더를 읽어서 자동으로 감지하고, 단일 .msix 또는 다중 아키텍처 .msixbundle을 만들어 냅니다.

2. EXE 인스톨러 구성

만들어진 MSIX를 더블클릭 한 번에 설치되는 독립 실행형 EXE 인스톨러로 변환합니다. 사이드로딩에 필요한 모든 과정(인증서 설치, 의존성 처리 등)을 인스톨러가 알아서 처리합니다. 사용자 입장에서는 그냥 인스톨러를 다운로드하고 실행하면 끝입니다. PowerShell도, 개발자 모드도, 인증서 프롬프트도 나오지 않습니다.

CLI 도구도 있습니다

GUI 말고 CLI 도구(aticmsixgen)도 NuGet에 올려뒀습니다. CI나 AI 자동화 워크플로에서 명령줄로 MSIX 패키징과 EXE 구성을 전부 처리할 수 있습니다. NativeAOT로 빌드해서 런타임 의존성이 없는 단일 실행 파일입니다.

dotnet tool install --global aticmsixgen

인증서 생성, 매니페스트 작성, MSIX 패키징, EXE 구성까지 전부 CLI에서 됩니다.

이런 분들께 잘 맞습니다

  • MSIX로 배포하고 싶은데 사이드로딩 과정이 부담스러운 분
  • Electron, Tauri, WPF 등 MSIX 패키징을 기본 지원하지 않는 프레임워크를 쓰는 분
  • x64, ARM64 등 여러 아키텍처를 하나의 인스톨러로 배포하고 싶은 분
  • CI에서 MSIX 패키징과 EXE 구성을 자동화하고 싶은 분

링크

MIT 라이선스이고, 피드백이나 이슈는 GitHub에 남겨주시면 됩니다. 한국어도 괜찮습니다.

Windows 10/11에서 카카오스토리 알림을 웹 페이지로 연결되는 토스트로 띄워주는 프로그램 – 카카오 스토리 웹 알리미

스크린샷:

소스코드
다운로드

변경내역:

1.0.0: 첫 릴리즈

1.0.1:
– 알림상의 앱 이름을 exe 파일명이 아닌 “카카오스토리 웹 알리미”로 변경
– 업데이트 안내 문구를 한국어로 변경
– 알림이 올 때, 기존에 표시된 알림 중 같은 게시글의 알림이 있는 경우 해당 알림을 지우는 기능 추가
– 알림 내용이 “내용 없음”일 경우, 그냥 해당 내용을 보여주지 않게끔 수정

1.0.2:
시스템 재시작 이후 프로그램이 제대로 실행되지 않고 오류 로그를 대량으로 기록하는 오류 수정
로그인 전용 브라우저 로직과 관련된 오류 수정

1.0.3 / 1.0.4:
시스템 재시작 이후 프로그램이 제대로 실행되지 않고 오류 로그를 대량으로 기록하는 오류 수정

Windows 10/11에서 PC의 리소스를 작업 표시줄의 고정 아이콘으로 확인 – Pin Stats

스크린샷:

소스코드
다운로드

변경 내역:
1.0.0: 최초 릴리즈 / CPU 사용량 조회 및 그래프 조회 기능 제작
2.0.0: GPU/메모리/네트워크 모니터링 기능 추가
2.0.1: GPU 사용량이 올바르지 않게 표시되는 오류 수정 및 컨텍스트 메뉴에 버전,저자 정보 추가
2.0.2: Intel GPU 버그 수정 및 타이머 멈추는 오류 수정
2.0.3:
– 타이머 버그 수정 및 예외 핸들링
– UI 수정
– 팝업 창 위치를 고정된 위치로 설정
– 기타 코드상의 수정
2.0.4: 이전에 관찰된 5개의 사용량 값을 캐싱하여 갑작스러운 사용량 급증 방지
2.0.5:
– CPU 및 GPU 사용량 정확도 개선
– 아이콘 갱신 안되는 버그 수정|
2.0.6: 프로그램 실행 이후 몇 분이 지나면 GDI+ 핸들의 누수로 인해 강제 종료 되는 오류 수정

2.0.7:
관리자 모드에서 프로그램을 실행하여 다음과 같은 자세한 정보를 확인할 수 있습니다:

  • CPU 온도 및 전력 사용량
  • GPU 전력 사용량
  • 배터리 잔량 및 충전 및 방전 속도
  • 배터리 수명 상태(퍼센트)

시작 프로그램 등록과 관련된 몇 가지 버그 수정

2.0.9:
시작 프로세스 버그 수정
배터리 충전률 정보 텍스트의 오타 수정

2.1.0:
오타 수정 (BatteryHealth -> Battery Health)
(실험적) 윈도우 10 지원

2.1.1:
업데이트 확인 기능 추가

2.1.2:
어두운 테마 기기를 위해 아이콘과 텍스트를 검은색으로 표시하는 기능 추가
(Reflection님이 구현하셨습니다. 감사합니다!)
작업 표시줄을 왼쪽 또는 오른쪽으로 정렬한 사용자의 리포트 창 위치가 잘못 표시되던 버그를 수정

2.1.3:
가상 메모리 정보를 표시하는 기능 추가
초당 스토리지 읽기/쓰기 속도를 표시하는 기능 추가
정보량 증가에 따른 리포트 창 크기 증가
리포트 창 초기 로딩 시간 및 타이머 정확도 개선

2.1.4: 처음 실행 시 시스템 테마 설정에 따라 아이콘 테마 색상 자동 설정

2.1.5:
코드베이스 리팩토링
기능: 전용 모니터링 디스플레이를 위한 H/W 모니터

2.1.6:
모니터 감지 관련 버그 수정 (H/W 모니터)

2.1.7:
사소한 UI 수정

2.1.8:
기능: 이제 팝업 창/하드웨어 모니터 창에 배경 이미지를 설정할 수 있습니다.

2.1.9:
기능: 컨텍스트 메뉴의 메뉴를 통해 하드웨어 목록을 새로 고칠 수 있습니다.
오타 수정
코드베이스 리팩토링

2.2.0:
버그 수정: 모니터 인식과 관련된 문제 해결
버그 수정: 키보드 단축키를 통해 다른 모니터로 이동할 때 H/W 모니터 창이 전체 화면 모드가 아닐 수 있는 버그 수정

2.2.1:
설치 관리자 지원
하드웨어 수동 새로 고침 성능 개선
.NET 8 업데이트 및 WinUI 버전 업그레이드
기능: 시작 시 자동 시작 바이너리 위치를 확인하고 손상된 경우 잘못된 경로를 수정

C# Selenium Driver 자동 설정 라이브러리

Selenium의 특성상 브라우저의 드라이버가 브라우저의 버전과 정확히 일치하여야 되는 단점이 있어 설치된 브라우저의 버전을 읽고 해당하는 드라이버를 자동으로 다운로드 및 캐싱해주는 프로젝트를 생성하였습니다.

링크

현재는 Edge와 Chrome만 지원합니다만, 차후 지원 브라우저를 늘릴 예정입니다.

원클릭으로 영상 프레임을 두배로 늘려주는 프로그램 Frame Interpolation

참고 소스 : https://github.com/nihui/dain-ncnn-vulkan

클릭 한번으로 영상의 프레임을 늘려주는 프로그램입니다. DAIN을 사용하였으며, 성능은 아래의 영상을 확인해주세요.

※ GPU를 사용하나, 프레임 보간이 매우 오래걸립니다. 이 점 참고해주세요.
※ 현재로써는 실행 파일 경로와 변환 파일 경로에 특수문자나 한글이 있으면 안됩니다 (1.2.0 업데이트로 해결됨)

프로그램 UI
DAIN 성능 비교 영상

다운로드
소스코드

변경 내역 :
* 1.0.0 : 최초 공개
* 1.1.0 : 프레임 보간 작업에 대한 프로그래스바 추가
* 1.2.0 : 프로그래스바 오류 수정 및 특정 상황에서 프로그램이 종료되는 오류 수정

안드로이드 기기에서 오디오 지연값을 자동으로 계산하는 방법

아래 메소드를 이용하면 기기상의 오디오 설정을 인식하여 계산된 레이턴시 값을 반환합니다.

원래는 Android SDK상에서 제공되는 메소드입니다.
하지만 Private 메소드라서 일반적인 접근이 불가능하여 Reflection을 이용, 접근 후 값을 가져오는 방식입니다.

public int getAndroidLatency() {
   int latency = 0;
   AudioManager am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
   try {
      Method m = am.getClass().getMethod("getOutputLatency", int.class);
      latency = (Integer) m.invoke(am, AudioManager.STREAM_MUSIC);
   }
   catch (Exception e) {
   }
   return latency
}

Windows 10의 파일 탐색기 바닥 우클릭 메뉴에 폴더 경로를 전달하여 Windows Terminal을 실행하는 옵션을 추가하는 방법

상단의 준비물을 받아주시고, 레지스트리 에디터를 실행합니다.
레지스트리 에디터를 열어 아래 경로로 이동해줍니다.

Computer\HKEY_CLASSES_ROOT\Directory\Background\shell\

레지스트리 폴더에 새로운 키를 생성해줍니다. 키 이름은 WT로 설정합니다.

새로운 키 생성하기

새로 만든 키에 command라는 이름의 키를 추가합니다.

command 키 생성

Windows+R 단축키를 눌러 뜨는 창에 %LOCALAPPDATA%를 입력, 뜨는 폴더에 terminal 폴더를 생성합니다. 이후 생성된 폴더에 위의 아이콘 파일인 wt_32.ico 파일을 넣어줍니다.

이후, terminal 폴더에서 탐색기 주소창 오른쪽의 빈 공간을 클릭하여 경로를 복사해줍니다.
예시) C:\Users\kck41\AppData\Local\terminal

그 다음 레지스트리 편집기에서 생성한 WT키에 Icon이라는 문자열 값을 생성합니다.
값은 위에서 복사한 폴더의 경로를 설정 마지막에 \ 문자를 추가하여 wt_32.ico 파일을 지정해줍니다.
예시) C:\Users\kck41\AppData\Local\terminal\wt_32.ico

WT 키의 (Default) 값은 우클릭 메뉴에서 보여질 옵션 제목을 적어주세요.
예시) Open Windows Terminal

WT 하위 키의 command 키의 (Default)값을 설정하기 위해 Windows + R키룰 눌러 %LOCALAPPDATA%를 입력합니다.
입력하여 나오는 창에서 Microsoft폴더를 들어가 WindowsApps폴더에 들어갑니다.

방금전과 마찬가지로 탐색기의 주소창 우측 빈공간을 선택하고 경로를 복사합니다.

WT하위 키의 command 키의 (Default)값을 더블클릭하여 방금전의 경로를 붙여넣고 마지막에 \wt.exe -d “%V”를 지정합니다.
예시) C:\Users\kck41\AppData\Local\Microsoft\WindowsApps\wt.exe -d “%V”

이제 파일 탐색기를 열어 아무 폴더에서나 레지스트리를 통해 추가한 옵션을 선택할 수 있습니다.

이 방법은 Windows Terminal 앱의 기본 쉘을 Ubuntu로 설정하였을 때, 쉘에 디렉토리를 전달하여 터미널을 통해 열 때 유용합니다.