안녕하세요, MoonLight입니다.
Application을 만들다 보면 필연적으로 DLL이 필요하게 되는데요, 결과물을 배포할 때 여러 개의 DLL을 같이 배포하는 경우도 있지만,
깔끔하지 못하게 보이는 것을 싫어하는 분들도 있을 수 있습니다.
개인적으로, Application 제작 후, Release 하는 경우에 이런저런 의존성 때문에 실행에 필요한 파일들이 많아져서 보내는 사람이나 받는 사람이나 모두 조금 귀찮아지는 경우가 생기는 것이 좋게 보이지는 않았습니다.
아래의 예와 같이, 하나의 실행 파일 이외에 실행에 필요한 다양한 DLL 파일들이 생기는 것을 볼 수 있습니다.
이번 Post에서는 DLL을 실행파일에 포함하는 여러 가지 방법에 대해서 알아보도록 하겠습니다.
1. Single File Deployment
.NET 5.0부터는 실행 파일을 하나의 File로 만들어 주는 "Single File Deployment" 기능을 사용할 수 있습니다.
이 기능을 사용하면, 프로젝트 빌드 시 실행 파일 하나로 모든 의존성을 포함하도록 설정할 수 있습니다.
Single File Deployment 기능을 어떻게 사용하는지 알아보도록 하겠습니다.
1) 우선 .NET 5.0 이상을 설치하고, .NET을 이용해서 Application을 작성합니다.
.NET 5.0 이상 설치 및 Application 제작 방법은 아래 Post를 참고해 주시기 바랍니다.
2) 프로젝트 파일(csproj) 수정
`.csproj` 파일을 열고 아래 속성을 추가해야 합니다.
각 항목은 아래와 같은 의미를 가지고 있습니다.
`PublishSingleFile` : 단일 파일만들어서 배포하라는 의미입니다.
`RuntimeIdentifier` : 실행 환경을 지정합니다.(예: Windows 64비트는 `win-x64`, Linux 64비트는 `linuxx64`)
'SelfContained` : .NET Runtime을 포함하여 런타임 없이 실행 가능하도록 만들라는 의미입니다.
'PublishTrimmed' : 기본 설정에서는 .NET Runtime과 네이티브 라이브러리까지 포함되므로 파일 크기가 클 수 있습니다. 이를 최적화하기 위한 속성입니다.
3) 게시(Publish) 방식으로 파일 생성 설정
이번에는 File 생성 방식을 변경해야 합니다. 단순히 Visual Studio에서 빌드(Build)를 실행하는 것이 아니라, 게시(Publish)를 통해 실행 파일을 생성해야 합니다.
아래 그림과 같이 Visual Studio에서 프로젝트를 마우스 오른쪽 클릭 -> 게시(Publish)를 선택합니다.
'게시' 메뉴를 선택하고, '게시 프로필 추가'를 선택합니다.
게시 대상을 '폴더'로 선택합니다.
특정 대상은 '폴더'로 선택합니다.
'프로필 설정'에서 '배포 모드'는 '자체 포함', '파일 게시 옵션'은 '단일 파일 생성'을 Check합니다.
이제 설정을 다 마쳤습니다. 아래 화면에서 '게시'를 누르면 일반적인 Build 과정 후에 '게시' 작업도 같이 합니다.
'게시' 동작이 끝나면, 설정에서 정한 '대상 위치'에 실행 파일이 만들어진 것을 확인할 수 있습니다.
4) 결과 확인
생성된 파일들을 살펴보면, 원래보다는 DLL 파일의 수가 확연히 줄었다는 것을 알 수 있습니다.
하지만, 실행파일의 크기가 비약적으로 커진 것과 처음 의도했던 것처럼 모든 의존성 파일이 모두 완벽하게 하나의 Single File로 합쳐진 것도 아닙니다.
Single File Deployment 방식을 사용해도 몇몇 DLL이 남아있는 이유는 네이티브 라이브러리(`coreclr.dll`, `clrjit.dll` 등)는 기본적으로 파일을 압축하여 실행 시 추출하는 방식으로 처리됩니다.
이런 방식 때문에 파일 크기는 줄어들지만, 실행 시 DLL 파일이 여전히 필요하게 됩니다.
2. ILMerge
ILMerge는 Microsoft에서 개발한 .NET Framework 전용 도구로, 여러 개의 .NET 어셈블리(DLL 및 EXE)를 하나의 단일 실행 파일(EXE) 또는 어셈블리로 병합하는 데 사용됩니다.
이 도구는 특히 .NET Framework 프로젝트에서 라이브러리 종속성을 줄이기 위해 널리 사용됩니다.
Github
https://github.com/dotnet/ILMerge
ILMerge의 GUI Version도 있습니다. Click 몇 번으로 쉽게 통합이 가능합니다.
GUI Version
https://wvd-vegt.bitbucket.io/
Visual Studio의 NuGet에서도 설치해서 사용 가능합니다.
하지만, 저의 경우에는 자꾸 오류가 발생해서 제대로 활용하지 못했습니다.
3. Costura.Fody
마지막으로 소개해 드릴 방법은 Costura.Fody 입니다.
Costura.Fody는 Fody라는 .NET 위빙(Weaving) 도구의 확장 기능으로, 애플리케이션의 종속성 DLL 파일을 실행 파일(EXE)에 포함하여 단일 실행 파일을 생성하는 데 사용됩니다.
Costura.Fody는 .NET Framework, .NET Core, 그리고 .NET 5 이상의 프로젝트에서 모두 작동한다는 장점이 있고, ILMerge보다 간단하게 DLL을 병합할 수 있는 대안으로 널리 사용됩니다.
3.1 특징
DLL 포함 및 자동 처리
프로젝트의 참조 DLL을 실행 파일에 임베디드 리소스로 포함시킬 수 있습니다.
실행 시 임베디드 DLL을 메모리에서 로드하므로 외부 DLL 파일이 필요하지 않습니다.
간단한 설정
FodyWeavers.xml 파일을 통해서 세밀한 설정이 가능합니다.
복잡한 명령어 없이 Visual Studio에서 빌드 시 자동으로 DLL 포함됩니다.
크로스 플랫폼 지원
.NET Framework뿐만 아니라, .NET Core 및 .NET 5 이상의 프로젝트에서도 사용 가능하다는 엄청난 장점이 있습니다.
네이티브 DLL 포함
네이티브 라이브러리(C++/CLI DLL)도 자동으로 병합하여 배포 간소화를 지원해서 매우 편리합니다.
자유로운 확장성
특정 DLL만 포함하거나, 불필요한 DLL은 제외하는 커스터마이징 가능합니다.
3.2 설치
Costura.Fody은 Visual Studio의 NuGet으로 손쉽게 설치할 수 있습니다.
설치후 별도의 설정은 필요없고, 단순히 기존 Project를 Build하시기만 하면 됩니다.
Build가 끝나면 아래와 같은 결과물들이 생깁니다.
이런 저런 파일들이 보이지만, DLL은 하나도 없습니다. 게다가 실행 파일의 크기도 작습니다. 아주 만족스럽네요.
표시한 EXE 파일 하나만으로 실행이 가능합니다.
4. 비교
NuGet으로 설치 가능한 2개의 Costura.Fody 와 ILMerge 대한 비교입니다.
특징
|
Costura.Fody
|
ILMerge
|
사용 용이성
|
매우 간단 (설치 후 자동화)
|
명령어 및 설정 복잡
|
지원 플랫폼
|
.NET Framework, .NET Core, .NET 5+
|
.NET Framework 전용
|
네이티브 DLL 지원
|
지원
|
지원하지 않음
|
파일 크기
|
EXE 파일이 다소 큼
|
ILMerge도 비슷하지만 더 간소화됨
|
빌드 시간
|
다소 증가
|
상대적으로 더 빠름
|
설정 가능성
|
XML 기반으로 세부 설정 가능
|
명령어 기반 세부 설정 가능
|
이번 Post에서는 C# Application에서 DLL 파일을 모두 실행파일에 포함하여 Build하는 방법을 알아보았습니다.
다양한 방법들이 존재하지만, 최종적으로는 Costura.Fody가 가장 사용하기 쉽고 설치도 간편하네요.
도움이 되셨으면 좋겠네요. 감사합니다.
'Development Tip' 카테고리의 다른 글
.Net Framework / .Net Core / .Net 통합의 역사 (0) | 2025.01.17 |
---|---|
.NET Framework / .NET Core / .NET Standard ? (0) | 2025.01.17 |
Naver Cloud Platform의 API 인증키 발행방법 (0) | 2025.01.17 |
Naver Cloud Platform의 API 인증키 발행방법 (0) | 2025.01.06 |
Python 강좌 12 - File & Exception (0) | 2024.12.23 |