티스토리 뷰

728x90

C# 프로그램을 개발하다 보면 외부 패키지를 사용하면 *.DLL 파일들이 하나둘 늘어나고 배포 과정에서 해당 DLL이 있느니, 없느니 하며 오류 원인이 되기도 한다. 그런데, 이렇게 참조하는 DLL 파일들을 프로젝트 리소스로 포함시키고 프로그램 시작 시점에서 해당 DLL들을 로딩하도록 하면 간편하게 DLL을 프로젝트에 내장시키면서 실행파일 하나만으로도 배포가 가능해진다.

 

일단, *.DLL 파일들을 프로젝트의 Resources 폴더에 복사한다. 솔루션 탐색기에서 Resources.resx를 더블클릭하고 편집창에서 리소스추가> 기존파일추가로 복사한 DLL 파일을 선택한다. 추가한 파일의 리소스 이름, 위의 그림에서는 INIFileParser를 기억해 둔다.

 

DLL의 참조 속성에서 그림과 같이 "로컬 복사"를 False로 설정하여 빌드시 해당 DLL을 복사하지 않도록 한다.

 

static Program()
{
  AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
  if (args.Name == null)
  {
    throw new NullReferenceException("Item name is null.");
  }
  else
  {
    if (args.Name.StartsWith("INIFileParser"))
    {
      if (args.Name.Substring(0, args.Name.IndexOf(',')) == "INIFileParser")
        return System.Reflection.Assembly.Load(Properties.Resources.INIFileParser);
    }
    return null;
  }
}

끝으로 프로젝트의 Program.cs를 열고 위와 같은 코드를 추가해 주면 된다. 내장시키려는 DLL의 리소스이름을 코드에 적용한다. 프로그램 실행 시 CurrentDomain_AssemblyResolve()로 인수가 "INIFileParser, Version=2.5.2.0, Culture=neutral, PublicKeyToken=79af7b307b65cf3c"와 같은 형식으로 전달된다.

 

 

728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함