VC8 의 dll binding 문제 시스템 프로그래밍

오랜만에 블로그에 글을 쓰고 있습니다. 일종의 생존신고랄까요?
VS2005 로 처음 작업할때도 이런 비슷한 문제로 필요없는 삽질을 꽤 했었습니다.  여기 ㅜ.ㅜ
요즘 VS2008 로 해야할 작업이 있어서 쪼물딱 거리는 와중에 이상한 현상이 있어서 삽질하고, 구글링한 결과를 정리해 볼까 합니다.
어떤 X 같은 일이 생겼나면..

개발머신   : VS2008, SP1
테스트머신: 윈도우 XP SP3

이렇게 PC 가 두대가 있습니다.
당연히 VS2005 에서 작업하던 대로 Debug 빌드시에는
Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT
아래 있는 파일들을 실행파일과 함께 테스트 머신에 복사하고, 실행을 했습니다. (private assembly 형태의 배포죠)
그런데 실행이 안되는겁니다.

뭐 요딴 메세지만 나오는 군요.
아래 그림에서처럼 DLL 이 뭔가 없는것도 아니고요. 아무 문제 없습니다. (VLdr.exe 는 VLdr.dll 을 사용합니다)

Manifest 파일과 배포해야 하는 DLL 들도 잘 복사되어있고요.

대체 뭐가 문제란 말입니까.. ㅠ.ㅠ

한참을 원인을 찾던 중.. (뭐 딱히 구글링할 키워드도 떠오르지 않더군요. -_-)
뭐 급한대로 VLdr.exe.config 파일을 만들어서 dll 들을 redirect 시켜서 대충 해결이 되긴 하더군요.
하지만 dll 이 앞으로 한두개도 아니고.. 3rd party library 라도 사용하게 되면 대략 난감해 지겠죠.
config 파일로 해결이 된다는것은 결국 바인딩 되는 dll 의 버전 문제 아니겠는가 라는 결론이 나오죠.

VS 링커 옵션에 보면 minifest 를 자동생성하도록 되어있습니다.(디폴트로)
역시 평소에 VS 각 옵션 설정을 꼼꼼히 보아두었던 것이 도움이 되는군요 ^^.
바인딩되는 dll 들은 링크타임에 manifest 형태로 만들어지는 것이고요. 생성된 manifest 는 exe 나 dll 에 내장되는것이겠죠. (아님 말구요)

결국 debug 디렉토리(중간 오브젝트 생성경로)에 생성된 ****.exe.embed.manifest 를 살펴보니 (****.exe.intermediate.manifest 는 뭐 중간에 잠깐 만들어지는 넘 같으니 패스) 아래와 같은 내용이 있네요.


그런데 C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\Debug_NonRedist\x86\Microsoft.VC90.DebugCRT 에 있는 minifest 파일을 열어보면 (private assembly 로 배포하던 파일이죠)



이런 ...ㅅㅂ... 욕나옵니다. -_-;;
결국 SP 1 이 설치되었는데도 VS 는 예전 버전(시스템 런타임 버전)으로 바인딩을 하고 있는겁니다.
이러니 당연히 실행이 안될 수 밖에요 (이해가 안되시는 분들은 WinSxS 나 Strong named assembly 라는 키워드로 검색을.. ).

결국 이런 저런 삽질과 구글링을 통해 알아낸 결과
 - VS 2008 SP1 설치 미디어에 있는 VC_x86Runtime.exe 을 디버기에서 실행하거나
 - 아래 전처리기를 stdafx.h 같은 곳에 (가능하면 가장 위에) 정의해 주는 겁니다.
#define _BIND_TO_CURRENT_MFC_VERSION 1
#define _BIND_TO_CURRENT_CRT_VERSION 1
프로젝트 속성 -> C/C++ -> 명령줄에 추가하는 것이 더 좋은것 같습니다.
/D "_BIND_TO_CURRENT_MFC_VERSION=1"
/D "_BIND_TO_CURRENT_CRT_VERSION=1"
MFC 프로젝트에서 stdafx.h 에 추가했더니 여전히 잘못된 manifest 를 만들어내는군요. -_-;;

이 전처리기를 이용하면 정상적으로 ***.exe.embed.manifest  에 버전이 SP 1 용 MFC, CRT 의 버전으로 만들어집니다.
이게 VS 2005 와 VS2008 에서 이렇게 요상하게 다르게 동작하는 원인은 고객들의 요구에 의한거라고 하는군요. -_-




Option (1) is useful for the following scenario:
- Alan installs the RTM product and uses it to develop his product.
- Alan builds his product and ships the VC runtime dlls he has along with it (RTM ones).
- Microsoft releases VS SP1, and the user installs it to get a fix for a non-libraries related issue (perf improvement in some area for example).
- Alan finds a bug in his own product and decides to fix it, rebuild his binaries and ship a patch for his customers.

In this scenario, Alan does not really care about the newer VC runtime dlls. Alan should be able to rebuild his binaries, and hand them to customers without having to redistribute the VC runtime. To decouple the new application binaries from the new VC runtime dlls, the user chooses to bind to the RTM version of the VC runtime dlls.

Option (2) is useful for the following scenario:
- Jim installs the RTM product and uses it to develop his product.
- Jim finds a problem with the VC libraries. The problem affects his product behavior.
- Jim asks Microsoft for a fix (a QFE) so that his product works properly.
- Microsoft fixes the problems and hands Jim a QFE with the fix. The QFE contains new headers/libraries/runtime dlls.
- Jim builds his product and ships the VC runtime dlls he got through the Microsoft QFE.

In this scenario, Jim’s product correct behavior is dependent on the newer runtime dlls. Jim prefers that his application does not start at all rather than starting and inhibiting incorrect behavior. Jim can enforce that by binding to the QFE version of the runtime dlls.

In VS2005, the default (out of the box after installing SP1) is Scenario #2.
In VS2008, the default is Scenario #1.

The reason we have switched the default behavior is that (based on customer feedback) scenario #1 is way more common than scenario #2.


Visual C++ team blog  의 글을 읽어보면 왜 이렇게 동작하게 되었는지 이해는 가네요.
ㅅㅂ MS 만세 ㅗ-_-ㅗ

덧글

  • 미친감자 2009/03/05 12:43 # 답글

    마지막 문구가 멋집니다. SB MS 만세~!
  • HS 2009/03/05 23:51 # 삭제 답글

    오옷... 뭔가 스킨이 산뜻하게 바뀌었네요~~ :)
    MS,,,,;; OS 도 그렇고 개발툴도 그렇고..
    새버전 출시될때마다 개발자들을 번거롭게 하는 듯합니다;;ㅡㅜ

    ps.. 아;; 저는 최해X 님이 아닙니다.. ( <-- 제가 아는 선배분;; ) 저는 장현승..이라고 합니다. (__)
  • somma 2009/03/06 23:28 # 삭제

    아 아니셨군요. ^^;; 제가 헤깔렸네요.
    반갑습니다.
  • chpie 2009/03/06 10:47 # 삭제 답글

    그러게요, ㅋㅋ 마지막 문구가 최고네요 ㅎㅎ
  • somma 2009/03/06 23:29 # 삭제 답글

    chpie, 미친감자 // ㅅㅂ <= 요건 window31 님한테 배운거.. 장난삼아 따라하다가 중독된듯 .. -_-;';
  • window31 2009/03/11 23:28 # 삭제 답글

    죄송합니다 ㅎㅎㅎ 저도 누구한테 배웠는데 중독성이 정말 심한거같아요 :)
  • somma 2009/03/12 11:10 # 삭제

    흐흐흐.. "ㅅㅂ 바이러스"
댓글 입력 영역