라벨이 Build인 게시물 표시

[.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등을 사용하는 방법도 있습니다. 글로 쓰면 짧죠? 하지만 구현하는 건 이것보단 긴 줄의 소스코드가 필요합니다. 그리고 무엇보다, 번거롭습니다. 프...

[MSBUILD/C#] error MC2000: 알 수 없는 빌드 오류, 강력한 이름의 어셈블리가 필요합니다 문제 해결

  포맷 후 빌드를 하는데 아래와 같은 에러가 발생했습니다. error MC2000: 알 수 없는 빌드 오류 '파일이나 어셈블리 'AssemblyName, Version=###, Culture=neutral, PublicKeyToken=null' 또는 여기에 종속되어 있는 파일이나 어셈블리 중 하나를 로드할 수 없습니다.  강력한 이름의 어셈블리가 필요합니다. (예외가 발생한 HRESULT: 0x80131044) 줄 #### 위치 ####.'  [경로]   밤을 새서일까요? 아뇨, 멍청해서일 겁니다. 저는 포맷 후 분명 프로젝트를 건드렸음에도 불구하고 프로젝트 설정에는 아무런 문제가 없을 것이라 철저히 믿은 채 'error MC2000 after format' 과 같은 키워드로 구글링을 했습니다.   당연히 일치하는 결과는 나올 리가 없고, 졸음이 쏟아지는 와중 솔루션을 찾아 검색질을 시작한 지 3시간이 다 돼 갈 쯤, 잠이 다 깨는 한 블로그 포스트 를 봤습니다. 보게 되고 말았습니다.   전에도 한 번 겪었던   일 이란 것이 더 화나게 하는군요. 아무튼 빌드시 위와 같은 문제가 발생할 경우 원인 은 아래와 같습니다.   한 어셈블리가 강력히 서명됐을 경우, 해당 어셈블리가 로드하는 모든  다른 어셈블리 역시 강력히 서명돼 있어야 한다.   전 포맷 후 테스트 인증 키를 재발급했고, 왜인진 모르겠지만 어셈블리 서명 체크박스에 체크를 해버렸던 겁니다. 인생 뭐 있나요. 소양댐에 다이빙할 준비나 해야겠습니다.   아무튼 해결 방법 은 아래와 같습니다.   프로젝트 속성 - 서명 - 어셈블리 서명(A) 체크박스 체크 해제  후 빌드   정말 간단합니다. 왜 간단할까요? 왜 개발할 때 죽어도 풀지 못할 것 같은, 몇시간, 길게는 며칠, 더 길게는 한달 이상 잡아먹는 무지막지해 보였던  문제들은 한순...

NMAKE 도중 NtWin32.mak파일을 찾을 수 없다고 뜰 때 해결 방법 (Windows 8 이상)

NMake로 빌드하는데 생소한 에러가 발생했다!   fatal error U1052: file 'NtWin32.mak' not found.  처음 보는 듣도 보도 못한 생소한 빌드 에러입니다. 대충 해석해보면 NtWin32.mak파일을 찾을 수 없어서 치명적인 에러가 발생했다! 정도인데 NtWin32.mak는 대체 무엇이며 왜 찾을 수 없다고 뜨는 것일까요? NtWin32.mak, Win32.mak   해당 파일을 열어보면, NtWin32.mak는 단순히 Win32.mak를 임포트하는 것 이상의 역할은 하지 않고 있고, Win32.mak를 열어보면 빌드에 필요한 여러 변수들을 설정해 주는 파일임을 확인할 수 있습니다. 그런데 도대체 왜 이 중요한 파일을 찾을 수 없다고 뜨는 것일까요? 분명히 존재하고 있는데도 말이죠. Windows 8 SDK부터 기본적으로 포함하지 않음   이 글 에 따르면 Windows 8부터는 Include폴더에 해당 파일들이 들어있지 않다고 합니다. 하지만 다행히도, Microsoft SDK 폴더에 7.0부터 10.0까지 버전에 대한 필요한 파일들이 그대로 들어있으므로 간단히 NMAKE가 실행될 커맨드라인에서 INCLUDE 환경변수에 경로를 추가 해주면 됩니다. INCLUDE 환경변수에 경로 추가   Microsoft SDK 경로(기본값: C:\Program Files (x86)\Microsoft SDKs)에 있는 Windows 폴더의 7.1A\Include 폴더를 INCLUDE 환경변수에 추가해줍시다. SET INCLUDE=%INCLUDE%;C:\Program Files (x86)\Microsoft SDKs\Windows\7.1A\Include   다시 NMAKE를 실행하면 빌드 성공!