드디어 manifest가 뭐하는 녀석인지 알았다.
물론 모든 기능을 다 알아낸 것은 아니겠지만.. 아마도 많은 기능 들 중 하나인 dll링크와 관련된 부분을 이해했다.
xp에서는 메시지를 별로 못봤지만.. vista계열(vista~윈7,2008등)에서
프로그램이 실행이 안될때 Side-by-side가 어쩌고 저쩌고하면서 실행이 안될때가 있다.
대충 이전까지 해결해온 경험으론 필요한 dll이 없다는 것인데..(debug파일로 배포를 했다거나 재배포가능 패키지를 설치 안했다거나..)
평소 하던데로 재배포 가능 패키지(vcredist_x64와 같이 배포하는 인스톨파일)를 설치했는데도 계속해서 에러가 발생하더라..
분명 dll문제니까 참조하고있는 라이브러리들의 dll도 전부 release로 맞추고 하면 되려니 하고 했지만 역시 문제다.
그러다가 side-by-side가 정확히 뭔지 찾아보고... - side-by-side는 WinSxS(Windows Side by Side)라는 폴더에서 파일들을 참조해서 dll을 연결시켜준다는 것이다.
전에(vs2003이전버전?)는 dll이 이름만 같으면 무작정 가져다가 써서 공용 dll의 경우 버전이 업그레이드가 된다거나 해버리면 이전 버전을 쓰던 프로그램들은 죽어버리고.. 이런 문제들이 많았는데 이것을 해결하기위해서 vs2005부터 도입된 방식이라고 한다.
(어쩐지 WinSxS라는 폴더가 어느 날부터 생겼다했다...)
그리고 이 side-by-side는 manifest에 정의된 assembly에 의해서 버전이 맞춰져서 실행이 된다고한다.
일단 exe파일을 vs로 열어보았다.
RT_MANIFEST를 보니 assembly가 셋팅되어있고 옆에 버전이 보인다.
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.4053" processorArchitecture="amd64"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
버전 8.0.50727.4053을 참조한다는 내용인 것이다.
이 버전을 참조하는건 WinSxS폴더에서 찾아서 참조시키니 WinSxS폴더를 뒤져보았다.
amd64_
microsoft.vc80.crt_1fc8b3b9a1e18e3b_
8.0.50727.4053_none_88e046c92fae6f57 폴더가 존재해야하는데 없는 것이다..
저 뒷자리 버전까지 반드시 똑같아야지만 dll을 연결 시키는것이다.
재배포 패키지도 버전이 여러가지(걍2005와 sp1이외에도..보안업데이트 관련해서 버전이 더 많이존재한다)가 있는데 그냥 아무거나 구해다 깔아서 해결이될 문제는 아닌 것이다...
저 버전으로 검색하니 MS에서 공지한 보안업데이트 관련된 article을 찾았다. 그리고 거기에 뒤져보니 재배포 패키지를 다운로드하라고 하더라.. (8.0.50727.4053 버전이라고 한다.)
관련 링크
http://support.microsoft.com/kb/973923
http://www.microsoft.com/downloads/details.aspx?displaylang=ko&FamilyID=766a6af7-ec73-40ff-b072-9112bab119c2
그걸 설치하니 제대로 실행이 되고, dll과의 전쟁은 끝은 났다.
원래 전에는 dll문제가 생기면 걍 귀찮아서 무조건 정적링크(lib파일을 이용한)를 해서 문제를 해결했다.
근데 그 정적링크도
전에 일 때문에 좀 고생하긴했지만..
이번엔 외부 팀에서 받은 dll들이 있어서 꼭 dll로 해야했기에 이러한 문제들을 해결해야했다.
외부 팀에서 받은 dll도 vs로 열면 RT_MANIFEST 파일 리소스들이 보이는데 여기에서 dll버전을 참고해서 재배포 버전을 설치하면 된다.
만약 dll들에서 참조하고있는 버전들이 다 틀리다면.. 이것저것 다 설치해야할 것이다. (아마도!)
참고 :
http://microdev.pe.kr/69