DLL을 EXE로 Embed 하는 방법
Static Link Library는 EXE를 생성할 때 기본적으로 포함되는 반면, Dynamic Link Library (DLL)은 EXE에 포함되지 않고 실행시 동적으로 로딩된다.
.NET EXE 파일에 DLL을 포함(Embed)시키기 위해서 특별히 작성된 3rd Party 도구를 사용해야 하는데, 이들 3rd Party 도구로는 Costura.Fody, ILMerge 등이 있다. 이 아티클에서는 사용하기 쉽고 비교적 많이 사용되고 있는 Costura.Fody에 대해 간략히 소개한다.
.NET EXE 파일에 DLL을 포함(Embed)시키기 위해서 특별히 작성된 3rd Party 도구를 사용해야 하는데, 이들 3rd Party 도구로는 Costura.Fody, ILMerge 등이 있다. 이 아티클에서는 사용하기 쉽고 비교적 많이 사용되고 있는 Costura.Fody에 대해 간략히 소개한다.
Costura.Fody 사용
Costura.Fody는 오픈소스로서 DLL 혹은 PDB 등의 파일들을 EXE 파일 (혹은 타켓 어셈블리)의 Resource 부분에 Embed 하는 기능을 제공한다. 즉, EXE 안에 DLL 파일들이 모두 포함되는 것인데, EXE 가 실행되어 DLL 어셈블리가 호출될 때, Costura.Fody가 Inject 한 어셈블리 로딩 코드에서 먼저 해당 DLL이 있는지 찾아보고 없으면 EXE 어셈블리 Resource에서 그 DLL을 찾아 로딩해 준다.
Costura.Fody를 사용하기 위해서는:
(1) VS에서 아래 그림과 같이 먼저 Nuget 패키지를 설치하고 프로젝트를 새로 빌드하면 된다.
(2) 빌드를 하면 EXE 안에 DLL들이 Embed 되지만, 또한 사용된 DLL 들이 bin\Debug (or bin\Release) 폴더에 디폴트로 포함되게 되는데, 이러한 종속 DLL들을 bin\Debug 폴더에서 없애기 위해서는 아래 두번째 명령인 Install-CleanReferencesTarget 을 실행하면 된다.
Costura.Fody는 오픈소스로서 DLL 혹은 PDB 등의 파일들을 EXE 파일 (혹은 타켓 어셈블리)의 Resource 부분에 Embed 하는 기능을 제공한다. 즉, EXE 안에 DLL 파일들이 모두 포함되는 것인데, EXE 가 실행되어 DLL 어셈블리가 호출될 때, Costura.Fody가 Inject 한 어셈블리 로딩 코드에서 먼저 해당 DLL이 있는지 찾아보고 없으면 EXE 어셈블리 Resource에서 그 DLL을 찾아 로딩해 준다.
Costura.Fody를 사용하기 위해서는:
(1) VS에서 아래 그림과 같이 먼저 Nuget 패키지를 설치하고 프로젝트를 새로 빌드하면 된다.
(2) 빌드를 하면 EXE 안에 DLL들이 Embed 되지만, 또한 사용된 DLL 들이 bin\Debug (or bin\Release) 폴더에 디폴트로 포함되게 되는데, 이러한 종속 DLL들을 bin\Debug 폴더에서 없애기 위해서는 아래 두번째 명령인 Install-CleanReferencesTarget 을 실행하면 된다.
Costura.Fody는 디폴트로 해당 DLL의 Copy Local 속성이 true 인 DLL만을 EXE에 포함하게 된다. 따라서 만약 DLL을 포함시키고 싶지 않으면 이 값을 false로 두고 해당 DLL을 수작업(혹은 Post-build 명령사용)으로 bin\Debug 폴더에 복사하면 된다. 이러한 방식이 귀찮은 경우 아래 Costura 옵션을 사용하면 된다.
Costura.Fody는 여러 옵션들을 가지고 있는데, 이 옵션들은 Nuget 설치시 추가되는 FodyWeavers.xml 파일에 지정한다. Costura 옵션은 Costura.Fody 깃허브에 자세히 소개되어 있는데, 예를 들어 PDB 심벌파일을 포함시킬지, Copy Local 디폴트 옵션에 상관없이 특정 어셈블리를 Include할지 Exclude할지, DLL을 리소스에 저장할 때 압축을 할지 등을 지정할 수 있다.