방법 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 옵션을 추가하는것으로, 간단하게 가능하다.