본문 바로가기
.Net

.NET - EXE에 모든 Dll, 리소스 포함하여 빌드하기

by 올엠 2024. 2. 24.
반응형

C# 프로그램을 개발한다면, 누구나 느끼는 Nuget에서 받은 DLL과 리소스들을 합쳐서 깔끔하게 배포하고 싶은 욕구가 있을 것이다. 아래에는 저자가 기존부터 경험했던 리소스를 EXE에 포함하여 배포하는 방법 3가지를 공유해보도록 하겠다.

1. 리소스에서 파일 생성하기

예전에는 DLL과, 리소스 파일들을 포함하기 위해서는 리소스 파일을 만들어서 실행 하는 시점에 해당 파일이 있는지 확인하고,  로드하는 방식을 사용하였다. 아래는 저자가 특정 파일을 리소스에 포함했다가 프로그램 실행시점에 해당 파일이 있는지 확인하여 리소스에서 파일 쓰는 방식이다. 이 방식은 Update.exe와 같은 추가 기능을 EXE 파일에 넣었다가 필요시 리소스에서 꺼내어 사용할 수 있는 방식으로도 활용이 가능하다, 다만 특정 백신에서 Droper로 인식하는 경우가 있어 추천하는 방식은 아니다.

String strZippath = System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
String strupdatepath = strZippath;
strupdatepath += @"\\update.exe"; 
strZippath += @"\\iruniview.ini";

FileInfo fileinfo1 = new FileInfo(strZippath);
if (fileinfo1.Exists == false)
{                
    byte[] aryData = Iruniview.Properties.Resources.HanView;
    FileStream fileStream = new FileStream(fileinfo1.FullName, FileMode.CreateNew);
    fileStream.Write(aryData, 0, aryData.Length);
    fileStream.Close();
}

2. ilmerge 사용

두번째는 Microsoft에서 제공하는 방식으로 ilmerge를 이용하는 방법이다. 

이 방법은 exe에 포함하고자 하는 리소스나 DLL을 입력하고 합쳐질 파일을 /out  옵션을 이용하여 사용한다. 그리고 /targetplatform 옵션을 통해 실행되는 .Net Framework를 지정하면 된다.

"c:\Program Files (x86)\Microsoft\ILMerge\ILMerge.exe" D:\asecurity\update\update\bin\Release\update.exe D:\asecurity\update\update\bin\Release\DotNetZip.dll /out:D:\asecurity\update\update\bin\Release\Protected\update.exe /targetplatform:"v4,C:\Windows\Microsoft.NET\Framework\v4.0.30319"

아래 링크에서 현재 관리되고 있으나, .Net Framework 버전 관리등에 이슈가 있는 것으로 확인된다. 

https://github.com/dotnet/ILMerge

3. Costura.Fody 사용

위 2가지 모두 사용할 때마다 많은 손이 가능 방식으로 저자가 최종적으로 정착한 방안은 Fody에서 제공하는 Costura를 사용하는 것이다.

Nuget을 이용해 간편히 추가가 가능하다

Costura.Fody를 추가하면 빌드 시점에 자동으로 리소스, DLL들을 EXE에 포함하여 빌드를 해준다.

현재도 버전업이 활발하게 이루어지기 때문에 최신 .Net Framework에 대한 지원도 잘되고, 최근 10개가량의 프로젝트에서 사용하였는데, 전혀 오류는 없었다.

https://github.com/Fody/Costura

 

 

반응형