본문 바로가기

WPF

Visual Studio / C# 특정 폴더 전체를 ClickOnce로 배포하는 방법

1. ClickOnce란 무엇인가?

ClickOnce는 Windows Forms, WPF, 콘솔 응용프로그램 등을 배포, 설치, 자동 업데이트할 수 있는 Visual Studio 내장 배포 기술입니다. 설치파일(.application, .manifest)을 생성하여 사용자가 웹 서버, 파일 공유, 로컬 경로를 통해 간단하게 설치/업데이트가 가능하며, 레지스트리나 OS에 부담을 주지 않고 자동으로 최신 버전으로 유지되는 것이 장점입니다.

하지만 ClickOnce는 프로젝트의 출력물만 기본적으로 배포하기 때문에, 특정 폴더 전체(예: 리소스, 데이터 파일, 설정 파일, 이미지 폴더 등)를 통째로 배포하려면 추가 설정이 필요합니다.

 

 

ClickOnce 배포 및 보안 - Visual Studio (Windows)

Windows 기반 애플리케이션을 자체 업데이트할 수 있는 배포 기술인 ClickOnce에 대한 Visual Studio 지원에 대해 알아봅니다.

learn.microsoft.com


 

2. 배포 대상 폴더 구성

예를 들어 다음과 같은 구조의 폴더를 통째로 배포하고 싶다고 가정합니다.

MyApp
├─ bin
│  └─ Release
├─ Config
│  ├─ config.json
│  └─ init.xml
├─ Data
│  ├─ data1.db
│  └─ data2.db
└─ MyApp.csproj

여기서 Config, Data 폴더를 ClickOnce 설치 시 그대로 배포 및 복사되도록 설정합니다.


 

3. Visual Studio에서 폴더 전체 배포 설정

1️⃣ Visual Studio에서 솔루션 열기

  • MyApp.sln을 열고 ClickOnce 배포 대상 프로젝트를 선택합니다.

2️⃣ 솔루션 탐색기에서 배포할 폴더를 프로젝트에 추가

  • Config, Data 폴더를 마우스 드래그하여 프로젝트에 추가합니다.
  • 추가 시 “프로젝트에 복사” 옵션이 보이면 “프로젝트에 추가”를 선택합니다.

3️⃣ 파일 속성 변경

  • Config 및 Data 하위의 모든 파일을 선택한 뒤,
  • 속성 창에서
    • 빌드 작업: Content 로 설정
    • 출력 디렉터리에 복사: Copy if newer (새로 고칠 경우 복사) 또는 Copy always (항상 복사) 로 설정

이렇게 설정하면 ClickOnce 패키징 시 해당 폴더 및 파일이 함께 포함되어 설치 시 프로그램 실행 경로 하위에 동일한 구조로 배포됩니다.


 

4. ClickOnce 배포 설정

1️⃣ 프로젝트 속성 > 게시 (Publish) 탭으로 이동

  • 출판 위치에 파일 공유, 로컬 경로, FTP, HTTP 서버 등을 지정합니다.
  • 예) \\server\publish 또는 C:\PublishFolder

2️⃣ 게시 마법사 실행

  • 게시 마법사 버튼 클릭.
  • 설치 위치, 업데이트 여부 설정.

3️⃣ ‘응용 프로그램 파일(Application Files)’ 확인

  • 게시 탭 > ‘응용 프로그램 파일’ 버튼을 클릭합니다.
  • 앞서 추가한 Config, Data 폴더 내 파일이 Include 상태인지 확인합니다.
  • 필요 없는 파일은 Exclude하여 용량을 줄입니다.

4️⃣ 게시 버튼 클릭

  • ClickOnce용 설치 파일(setup.exe, .application, .manifest)과 함께 Config, Data 폴더가 포함된 배포 패키지가 생성됩니다.

 

5. 설치 후 구조 및 배포 확인

C:\Users\{UserName}\AppData\Local\Apps\2.0\{랜덤폴더}

설치 후 프로그램이 실행되는 경로는 기본적으로 위와같으며, 여기에 Config, Data 폴더가 통째로 포함되어 있음을 확인할 수 있습니다.
또한 자동 업데이트 설정 시, Config, Data 내 파일이 변경되면 새로운 버전 배포 시 자동으로 업데이트 됩니다.


 

6. 주의사항 및 Best Practice

대용량 파일이 포함된 경우

  • ClickOnce의 기본 최대 업로드 용량 제한은 2GB 이며, 웹서버 업로드 시 IIS의 요청 크기 제한을 확인해야 합니다.

프로그램 내 경로 참조

  • 실행 시 상대 경로(.\Config\config.json) 또는 Application.StartupPath + \Config\config.json 등으로 참조해야 올바르게 동작합니다.
  • ClickOnce 경로는 복잡하므로 Environment.CurrentDirectory 대신 AppDomain.CurrentDomain.BaseDirectory 사용을 권장합니다.

폴더 구조 유지

  • ClickOnce는 개별 파일 단위로 관리하므로, 폴더 구조를 유지하려면 프로젝트 내 동일한 구조로 추가해야 하며, 수작업으로 관리하는 경우 빼먹기 쉽습니다. 필요 시 PowerShell이나 PreBuild 스크립트로 자동화를 고려하세요.

 

7. 마치며

Visual Studio + C#으로 ClickOnce를 활용해 특정 폴더 전체를 배포하는 방법을 설정해 두면

  • WPF/WinForms/콘솔 앱의 리소스, 설정, 데이터 파일을 유연하게 관리 가능
  • 사용자는 링크 클릭 한 번으로 최신 버전 설치 및 업데이트 가능
  • 관리자는 별도 인스톨러 제작 부담 없이 간단히 배포 가능

이라는 장점을 얻을 수 있습니다.

향후 CI/CD + ClickOnce 자동배포, GitHub Actions + ClickOnce, Azure DevOps + ClickOnce 연동해서 배포를 자동화하는 방법에 대해서도 다루어볼까 합니다.
즐거운 코딩되세요.