[WPF] 어셈블리를 exe파일에 합치기

2017. 5. 21. 02:43Others/C# 일반

WPF프로그램을 빌드하면 관련된 어셈블리(dll)들이 exe파일과 같이 생성됩니다. 이 어셈블리 파일들을 exe파일과 같이 고객PC에 배포해야 프로그램이 정상적으로 동작합니다.

실행에 필요한 어셈블리를 배포하는 방법은 여러가지가 있지만, 여기서는 exe파일에 포함시키는 방법에 대해 소개합니다. 띠리사 exe파일만 배포해도 프로그램이 정상적으로 실행되게 됩니다.

  1. 먼저 모든 어셈블리를 프로젝트의 폴더에 포함시킵니다. 폴더명은 원하는 폴더명으로 하시면 됩니다.
  2. 위에서 포함한 모든 어셈블리의 Build Action을 Embedded Resources로 합니다.
  3. App Class로 이동해 다음과 같이 작성합니다.
    public partial class App : Application
    {
        public App()
        {
            AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(ResolveAssembly);
        }
        private static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
        {
            //어셈블리가 .exe파일과 같은 폴더에 있으면 이 메서드는 호출되지 않습니다.
            Assembly thisAssembly = Assembly.GetExecutingAssembly();
    
            //1. 어셈블리 이름을 얻습니다.
            AssemblyName assemblyName = new AssemblyName(args.Name);
            string name = args.Name.Substring(0, args.Name.IndexOf(',')) + ".dll";
    
            //2. Embedded Resources로부터 리소스를 로드합니다. 
            var resources = thisAssembly.GetManifestResourceNames().Where(s => s.EndsWith(name));
            if (resources.Any())
            {
                //거의 대부분의 확률로 항상 1개의 항목만 로드됩니다. 만약 1개이상 로드가되면 이러한 케이스를 별도로 처리해야 합니다.
                var resourceName = resources.First();
                using (Stream stream = thisAssembly.GetManifestResourceStream(resourceName))
                {
                    if (stream == null)
                        return null;
                    var block = new byte[stream.Length];
                    stream.Read(block, 0, block.Length);
                    return Assembly.Load(block);
                }
            }
            return null;
        }
    }
    
  4. 이제 exe 파일만으로 실행되는지 테스트해봅니다.

참고사항

  1. 이 방법은 WinForm 개발방법에도 적용될 수 있습니다.
  2. 참고URL: https://www.bbsmax.com/A/1O5Ep8KbJ7/