ILMerge, Fody 를 이용하는 방법도 있지만,
프로그램 소스에 DLL을 포함한 단일 EXE배포 방법도 있습니다.
아래는 프로그램 소스에 dll를 포함하여 단일 exe를 만드는 방법입니다.
① 해당 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;
}
위와 같이 작업한 후 빌드하면 한개의 실행파일이 생성되고, 잘 동작합니다.
'공학속으로 > 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 |
댓글