Phase 2: MSIX 패키지 + IExplorerCommand 셸 익스텐션
C++ 셸 익스텐션 (src/EverythingToJpeg.Shell/) - WRL RuntimeClass 패턴으로 IExplorerCommand 두 핸들러 구현 - Quick(빠른 변환) / Dialog(설정 창) verb를 다른 CLSID로 분리 - Invoke()에서 EverythingToJpeg.exe로 verb + 파일 경로 전달 - VS 2026 빌드 검증, /utf-8 한글 라벨 지원 MSIX 패키징 (packaging/) - Package.appxmanifest: com:SurrogateServer + desktop4:FileExplorerContextMenus - 26개 확장자 × 2 verb 자동 노출 - BuildMsix.ps1: dotnet publish + msbuild + makeappx 일관 파이프라인 - CreateDevCert.ps1 / Install-EverythingToJpeg.ps1: 자체 서명 인증서 워크플로 - GenerateAssets.ps1: placeholder 로고 자동 생성 CI/CD - .github/workflows/release.yml: 태그 푸시 시 미서명 MSIX 자동 빌드 + 첨부 검증 - 50MB MSIX 산출 확인 (packaging/dist/EverythingToJpeg-x64.msix) Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
8fa4a613d7
commit
f2c8610ff6
19 changed files with 973 additions and 41 deletions
56
packaging/GenerateAssets.ps1
Normal file
56
packaging/GenerateAssets.ps1
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
#Requires -Version 5.1
|
||||
# packaging/Assets/ 의 placeholder 아이콘들을 생성한다.
|
||||
# 추후 진짜 로고로 교체.
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
Add-Type -AssemblyName System.Drawing
|
||||
|
||||
$assetsDir = Join-Path $PSScriptRoot 'Assets'
|
||||
if (-not (Test-Path $assetsDir)) { New-Item -ItemType Directory -Path $assetsDir | Out-Null }
|
||||
|
||||
function New-LogoPng {
|
||||
param(
|
||||
[int]$Width,
|
||||
[int]$Height,
|
||||
[string]$Path,
|
||||
[string]$Label = ''
|
||||
)
|
||||
$bmp = New-Object System.Drawing.Bitmap($Width, $Height, [System.Drawing.Imaging.PixelFormat]::Format32bppArgb)
|
||||
$g = [System.Drawing.Graphics]::FromImage($bmp)
|
||||
$g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::AntiAlias
|
||||
$g.TextRenderingHint = [System.Drawing.Text.TextRenderingHint]::ClearTypeGridFit
|
||||
|
||||
$rect = New-Object System.Drawing.Rectangle(0, 0, $Width, $Height)
|
||||
$brush = New-Object System.Drawing.Drawing2D.LinearGradientBrush(
|
||||
$rect,
|
||||
[System.Drawing.Color]::FromArgb(0xFF, 0x3B, 0x82, 0xF6),
|
||||
[System.Drawing.Color]::FromArgb(0xFF, 0x1E, 0x40, 0xAF),
|
||||
[System.Drawing.Drawing2D.LinearGradientMode]::Diagonal)
|
||||
$g.FillRectangle($brush, $rect)
|
||||
|
||||
if ($Label) {
|
||||
$fontSize = [Math]::Max(8, [Math]::Min($Width, $Height) / 5)
|
||||
$font = New-Object System.Drawing.Font('Segoe UI', $fontSize, [System.Drawing.FontStyle]::Bold)
|
||||
$textBrush = [System.Drawing.Brushes]::White
|
||||
$sf = New-Object System.Drawing.StringFormat
|
||||
$sf.Alignment = [System.Drawing.StringAlignment]::Center
|
||||
$sf.LineAlignment = [System.Drawing.StringAlignment]::Center
|
||||
$rectF = New-Object System.Drawing.RectangleF(0, 0, [float]$Width, [float]$Height)
|
||||
$g.DrawString($Label, $font, $textBrush, $rectF, $sf)
|
||||
$font.Dispose()
|
||||
$sf.Dispose()
|
||||
}
|
||||
|
||||
$g.Dispose()
|
||||
$bmp.Save($Path, [System.Drawing.Imaging.ImageFormat]::Png)
|
||||
$bmp.Dispose()
|
||||
$brush.Dispose()
|
||||
Write-Host " [+] $Path ($Width x $Height)"
|
||||
}
|
||||
|
||||
Write-Host 'Generating placeholder logos…'
|
||||
New-LogoPng -Width 50 -Height 50 -Path (Join-Path $assetsDir 'StoreLogo.png') -Label 'E2J'
|
||||
New-LogoPng -Width 44 -Height 44 -Path (Join-Path $assetsDir 'Square44x44Logo.png') -Label 'E2J'
|
||||
New-LogoPng -Width 150 -Height 150 -Path (Join-Path $assetsDir 'Square150x150Logo.png')-Label 'E2J'
|
||||
New-LogoPng -Width 310 -Height 150 -Path (Join-Path $assetsDir 'Wide310x150Logo.png') -Label 'EverythingToJpeg'
|
||||
Write-Host 'Done.'
|
||||
Loading…
Add table
Add a link
Reference in a new issue