본문 바로가기

프로그래밍/리서치결과

manifest


"응용프로그램 구성이 올바르지 않기 때문에 이 응용프로그램을 시작하지 못했습니다" 에 대한 배포의 문제

응용프로그램을 만들면 라이브러리와 종속성이 생기게 된다.(DLL일경우)
이놈과 맞물려있는 dll을 확인하려면 Dependency Walker를 사용(vs2005에 있더라..)

가장 최근에 이것때문에 문제를 겪었던 파일을 예로들면

내 컴퓨터환경에서 돌아가니 당연히 종속되는 DLL들이 다음과 같이 나올것이다.
하지만 내 PC가 아닌 다른 PC일경우 특히 개발환경이 아닌 PC같은경우 분명히
저 4가지의 DLL중 3가지가 없을것이라 생각된다.
1,2번째는 포트란관련 DLL, 3번째는 crt관련 DLL(CRT는 차후알아볼것)
그것도 모르고 vcredist.exe 재배포버전을 겁나게 깔아재껴도 안된다고 계속 고민만 했었다.
이것에 대한것을 예로 들어 설명을 진행하겠다.

다시 배포로 돌아와서

visual studio 8.0(2005) 부터 응용프로그램 배포 방식이 바뀜. Side-By-Side Assembly 개념을 도입하여 응용 프로그램마다 별도의 환경으로 동작하도록 해주는것?
DLL 충돌 문제 때문에 마이크로소프트가 만든 Side-by-side Assembly. 같은 컴퓨터 안에서 여러 버전의 DLL을 동시에 실행할 수 있도록 해주는 기능. 즉 각각의 애플리케이션에게 독립적인 DLL 환경을 보장해준다는 말이다. 이 파일들은 \Windows\WinSxS 디렉토리에 존재한다.  저 위의 MSVCR80D.DLL이 있는 폴더도 WinSxS폴더이다.
어마하게 많은 버전의 DLL종류들이 존재할것이다.

VS2005이상부터 바이너리를 컴파일 할 때 매니페스트가 포함된다고 한다. 프로젝트옵션에 따라 실행파일에 포함이 되는지 혹은 .manifest파일이 같이 나오는지 그런거같은데.... 어쨋든 저 위의 문제의 프로그램을 VS2005에서 열어보면 RT_MANIFEST 리소스가 있고 그걸 드레그해서 메모장에 넣으면 XML형태의 정보를 볼 수 있다.

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

일단 포트란관련 DLL파일은 그냥 포함시켜도 된다 쳐도, MSVCR80D.DLL에 관련된 버전에 대한 정보가 나오는것같다. 바로 이거 name="Microsoft.VC80.DebugCRT" version="8.0.50608.0" ..
Dependency Walker에서 가르키는 WinSxS의 버전이 살짝다르긴해도 이런거는 어느정도 가능한건지...잘은 모르겠다. 이 문제는 VS2005가 설치된 폴더의 redist에서 해당 폴더명과 매칭이되는 VC80.DebugCRT폴더내의 매니스트파일과 필요한 DLL을 종속적으로 프로그램과 같은 폴더에 있는 상태에서 실행하면 실행이 되더라...
일반적으로 알려진 배포방법은 3가지라던데..

방금알게된 폴더내에 해당 매니페스트와 dll을 첨부
두번째는 재배포버전을 깐다. (근데 위같은경우 디버그용이어서 재배포버전을 깔아도 안되지않을까?)
세번째는 인스톨패키지를 활용한다던데..

근데 VS2010에서 다시 없어졌다던데... 하긴 내가봐도 없어질만하니까 없어진듯ㅋㅋㅋ