10월, 2019의 게시물 표시

[.NET/Build] 쉽고 간편하게 DLL을 EXE에 포함시켜보자

이미지
Embedding DLLs 어느 정도 규모가 있는 프로젝트를 개발하다 보면, 반드시 직면하게 되는 문제가 있습니다. 바로 수많은 하위 프로젝트들과 그에 따른 미친듯한 DLL의 폭증입니다. 이는 어쩔 수 없는 것이, 대형 프로젝트를 개발하다가 보면 이것저것 필요한 라이브러리를 가져와 사용할 수밖에 없고, 그것이 타인이 만든 라이브러리이든 자신의 라이브러리이든 관계없이 차곡차곡 쌓이다가 보면 어느새 한 개의 EXE에 수십 개의 DLL이 줄줄이 딸려오는 상황이 생기게 됩니다. 또한, 굳이 이러한 외부 라이브러리가 아니더라도, 호환성을 위해 .NET Framework의 기본적인 DLL을 배포할 때 포함할 경우도 마찬가지입니다. 예를들어, System , System.Buffers , System.Core , System.IO , … 등등 수많은 기본 DLL들을 말이죠. 특히 의존 관계가 적은 기본 DLL들은 실행 파일 폴더에 포함시켜주기만 하면 실행하는 쪽에서 번거롭게 .NET Framework를 설치하지 않아도 실행할 수 있게 되기 때문에 자주 쓰이는 방법입니다. 그러나 말씀드렸다시피, 이는 배포할 파일이 쓸데없이 많아지는 결과를 초래합니다. EXE 하나에 수십, 심하면 수백 개의 DLL이 줄줄이 딸려가는 상황을 생각해보세요. 끔찍합니다. 바로 이 때 사용할 수 있는 기법이 바로 Embedding DLL입니다. 간단히 말해, EXE에 DLL을 포함시켜 진입점에서, 혹은 필요한 시점에서 로드해 사용하는 방법입니다. 어떻게 EXE에 DLL을 포함시키나 사실 방법은 그리 어렵지 않습니다. 다만, 귀찮을 뿐입니다. 빌드된 DLL을 프로젝트에 포함시키고, 빌드 작업을 포함 리소스 로 변경합니다. 그런 뒤 적절한 위치에서 Assembly 클래스를 통해 어셈블리를 로드해주면 됩니다. 혹은 ILMerge등을 사용하는 방법도 있습니다. 글로 쓰면 짧죠? 하지만 구현하는 건 이것보단 긴 줄의 소스코드가 필요합니다. 그리고 무엇보다, 번거롭습니다. 프

[C#/LINQ] MoreLINQ, LINQ를 확실히 활용하고싶다면 반드시 필요한 패키지!

LINQ? 다들 아시겠지만, .NET 프레임워크에는 LINQ라는 아주 뛰어난 기능이 잘 구현돼 있습니다. 이 링크 를 보시면 이에 대한 내용이 잘 정리돼 있으니 LINQ가 뭔지 모르시는 분이 계신다면, 한 번 보시는 것을 추천합니다. 아무튼, 요점은 이게 아닙니다. LINQ에 대한 개념이 없으신 분일지라도, C# 코딩을 하다가 한 번쯤은 List<T> 를 사용해봤을 것이고, 무조건 IEnumerable<T> 에 대한 접근을 해야만 했던 경우가 있었을 것입니다. 예를 들어 아래와 같이요. var listPeople = new List<People> { new People( "이정민" , "960528" ), new People( "염정실" , "600709" ), }; 위의 예제는 List<T> 의 사용 예입니다. 클래스명에서 알 수 있듯, 여러 타입에 대한 리스트를 만들고 관리하는 데 사용됩니다. 저는 지금 리스트 안에 두 개의 객체만 예시로 넣어놨으나, 거대한 데이터베이스에 수십만 개의 People 데이터가 쌓여있고, 그것을 가져와서 처리한다고 생각해보세요. 말로만 해서는 이해가 힘들 수도 있겠습니다. 그럼 한 번 그 수십만 개의 People 객체를 담고 있는 List<People> 객체에서 성씨가 이 씨인 사람만 뽑도록 해볼까요? var listPeopleStartsWithLee = listPeople.Where(_ => _.Name.StartsWith( "이" )); // 또는 var listPeopleStartsWithLee = from person in listPeople where person.Name.StartsWith( "이" ) select person; 자. 이게 바로 LINQ입니다. 마치 DB에 쿼리를 날리는