프로그램/C#

[C#] DLL을 포함한 단일 EXE배포 방법

더월드 2023. 9. 4.

ILMerge, Fody 를 이용하는 방법도 있지만,

프로그램 소스에 DLL을 포함한 단일 EXE배포 방법도 있습니다.

아래는 프로그램 소스에 dll를 포함하여  단일 exe를 만드는 방법입니다.

 

[ dll 포함 전 ]

 

① 해당 dll을 프로젝트 리소스에 추가합니다.
② 추가된 dll의 속성 탭에서 빌드작업 속성 값을 "포함 리소스"로 지정합니다.

 

③ 해당 Dll 함수의 참조의 속성값에서 로컬복사 "false"를 선택합니다.

 

④ Program.cs에 아래 코드를 삽입합니다.

using System.Reflection;
using System.IO;

/// <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;
}

 

위와 같이 작업한 후 빌드하면 한개의 실행파일이 생성되고, 잘 동작합니다.

[ dll 포함 단일 exe 파일 만들기 결과 ]

 

'프로그램 > C#' 카테고리의 다른 글

C# xml 파싱하기  (0) 2023.09.15
C# json 파싱하기  (0) 2023.09.05
C# Naver Api 사용하여 네이버 뉴스 검색하기  (1) 2023.09.01
C# 리스트뷰(ListView) 사용하기  (0) 2023.08.29
C# ChatGPT API사용하기  (0) 2023.07.13

댓글

💲 추천 글