[.NET/Build] 쉽고 간편하게 DLL을 EXE에 포함시켜보자

Embedding DLLs

어느 정도 규모가 있는 프로젝트를 개발하다 보면, 반드시 직면하게 되는 문제가 있습니다. 바로 수많은 하위 프로젝트들과 그에 따른 미친듯한 DLL의 폭증입니다.
이는 어쩔 수 없는 것이, 대형 프로젝트를 개발하다가 보면 이것저것 필요한 라이브러리를 가져와 사용할 수밖에 없고, 그것이 타인이 만든 라이브러리이든 자신의 라이브러리이든 관계없이 차곡차곡 쌓이다가 보면 어느새 한 개의 EXE에 수십 개의 DLL이 줄줄이 딸려오는 상황이 생기게 됩니다.
또한, 굳이 이러한 외부 라이브러리가 아니더라도, 호환성을 위해 .NET Framework의 기본적인 DLL을 배포할 때 포함할 경우도 마찬가지입니다. 예를들어, System, System.Buffers, System.Core, System.IO, … 등등 수많은 기본 DLL들을 말이죠. 특히 의존 관계가 적은 기본 DLL들은 실행 파일 폴더에 포함시켜주기만 하면 실행하는 쪽에서 번거롭게 .NET Framework를 설치하지 않아도 실행할 수 있게 되기 때문에 자주 쓰이는 방법입니다.
그러나 말씀드렸다시피, 이는 배포할 파일이 쓸데없이 많아지는 결과를 초래합니다. EXE 하나에 수십, 심하면 수백 개의 DLL이 줄줄이 딸려가는 상황을 생각해보세요. 끔찍합니다.
바로 이 때 사용할 수 있는 기법이 바로 Embedding DLL입니다. 간단히 말해, EXE에 DLL을 포함시켜 진입점에서, 혹은 필요한 시점에서 로드해 사용하는 방법입니다.

어떻게 EXE에 DLL을 포함시키나

사실 방법은 그리 어렵지 않습니다. 다만, 귀찮을 뿐입니다. 빌드된 DLL을 프로젝트에 포함시키고, 빌드 작업을 포함 리소스로 변경합니다. 그런 뒤 적절한 위치에서 Assembly 클래스를 통해 어셈블리를 로드해주면 됩니다. 혹은 ILMerge등을 사용하는 방법도 있습니다.
글로 쓰면 짧죠? 하지만 구현하는 건 이것보단 긴 줄의 소스코드가 필요합니다. 그리고 무엇보다, 번거롭습니다. 프로젝트 한 개 하고 개발자 때려 칠 것도 아니고, 매번 대형 프로젝트를 진행할 때마다 저런 식으로 한다는 건 귀찮은 걸 싫어하는 저로써는 용납할 수 없는 이야기입니다.

그럼 더 간단하게 EXE에 DLL을 포함시키는 방법은?

그래서 찾아봤습니다. 지금 잠시 시간을 투자하면 나중에 그 10배, 20배로 시간이 단축된다는 것은 이미 충분히 느꼈기 때문입니다. 구글에 C# Embedding DLLs 키워드로 검색해보니
세상에 이런 글이 있지 뭔가요? 깔깔깔 바로 이거다 싶어서 바로 테스트해봤습니다.

Costura.Fody 사용법

사실, 사용법이고 뭐고 할 게 없습니다. 그냥 NuGet에서 Costura.Fody 및 Fody를 설치합니다. 그리고 프로젝트를 빌드합니다. 그럼 빌드한 프로젝트에 필요한 모든 DLL이 EXE에 포함된 채 빌드됩니다. 끝!
물론, 특정 DLL은 포함하지 말아라와 같은 지시도 가능합니다. 더 자세한 사용법은 Costura.Fody GitHub#Configuration Options에 잘 정리돼 있으니 사용 전 꼭 참조하세요.

댓글

이 블로그의 인기 게시물

C# 남아도는 메모리에도 불구하고 OutOfMemoryException이 발생한다면?

USB를 뒤는 괜찮은데 앞에 꽂으면 인식이 힘들다?

MySQL 데이터 타입과 Java 데이터 타입 비교/매칭