[C#] dll 포함 단일 exe 빌드하는 방법

방법 1

1. 사용하고자 하는 dll을 프로젝트에 참조

2. 해당 dll을 프로젝트 리소스에 추가

3. 리소스에 추가된 dll의 속성 -> 빌드작업 속성 값을 포함 리소스로 지정

4. 프로그램 진입점(Program.cs)에 코드를 아래와 같이 변경

 

/// <summary>
/// 해당 응용 프로그램의 주 진입점입니다.
/// </summary>
[STAThread]
static void Main() {
    // 리소스 dll 취득
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
 
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}
 
// .NET 4.0 이상
static Assembly ResolveAssembly(object sender, ResolveEventArgs args) {
    Assembly thisAssembly = Assembly.GetExecutingAssembly();
    var name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";
 
    var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
    if (resources.Count() > 0) {
        string resourceName = resources.First();
        using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) {
            if (stream != null) {
                byte[] assembly = new byte[stream.Length];
                stream.Read(assembly, 0, assembly.Length);
                Console.WriteLine("Dll file load : " + resourceName);
                return Assembly.Load(assembly);
            }
        }
    }
    return null;
}
 
// LINQ가 지원되지 않는 .NET 버전
static Assembly ResolveAssembly(object sender, ResolveEventArgs args) {
    Assembly thisAssembly = Assembly.GetExecutingAssembly();
    string resourceName = null;
    string fileName = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";
    foreach (string name in thisAssembly.GetManifestResourceNames()) {
        if (name.EndsWith(fileName)) {
            resourceName = name;
        }
    }
 
    if (resourceName != null) {
        using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName)) {
            if (stream != null) {
                byte[] assembly = new byte[stream.Length];
                stream.Read(assembly, 0, assembly.Length);
                Console.WriteLine("Dll file load : " + resourceName);
                return Assembly.Load(assembly);
            }
        }
    }
    return null;
}

 

방법 2

 ILMERGE
– 묻지도, 따지지도 않고 DLL과 EXE를 합쳐준다. DLL이 여러개여도 상관없다.
실행은 커맨드로 한다.
ilmerge /out:output.exe project.exe a.dll b.dll
닷넷 프레임워크 4.0의 프로젝트라면 /targetplatform:v4 옵션을 추가하는것으로, 간단하게 가능하다.

Post Author: 김 키티

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다