Skip to content
DarkKaiser의 블로그
DarkKaiser의 블로그
  • 개발 관련 자료(노션)
  • Raspberry Pi(노션)
  • WD My Cloud(노션)
  • GitHub
DarkKaiser의 블로그

msvcrt.dll, msvcr71.dll, msvcr80.dll 그리고 WinSxS

DarkKaiser, 2008년 9월 6일2023년 9월 6일

출처 : http://somma.egloos.com/3020481

WinSxS 는 언제 생긴건지…GAC (Global Assembly Cache) 가 Native 에도 있었다니…
지나치다 보기는 했는데 오늘에야 뭐 하는 넘인지 알았네요.
(예전에 미친감자님 블로그에서 보긴 했지만 당장 필요하지 않으면 잘 안보게 되서..쿨럭..)

만일 전에 .NET 공부를 해두지 않았으면 manifest 니 GAC 니 하는 개념을 몰라서 한참 헤맬뻔 했군요.
저 .NET Microsoft Approved Cource 과정 인증서 4개 있습니다. 그냥 교육센터 가서 수강했더니.. 주더군요. -_-

WinSxS 란 넘은 하여간에 Native Assembly Cache 라는 녀석이고, 기능은 .NET 의 GAC 와 유사합니다.
(근데 언제부터 네이티브 코드에서도 어셈블리라는 용어를 사용했죠? 닷넷에서만 사용하는 줄 알았는데..)
결국 GAC 처럼 manifest 를 통해서 WinSxS 에서 지정한 assembly, 즉 dll 을 지정하는거구요.

그런데 문제가 좀 있습니다.
VS 2005 로 만든 어플리케이션이 msvcr80.dll (릴리즈 버전 인경우) 을 사용하도록 설정되어있다면 배포시에 예전 처럼 msvcr80.dll 을 exe 와 같은 폴더 혹은 path 가 잡인 경로에 복사하는걸로 끝나지 않는다는 겁니다.
필요한 dll 을 exe 와 같은 디렉토리 또는 path 에 배포해도 아래와 같은 오류가 발생합니다.

[vs8 링커옵션에서 manifest 생성하도록 설정한 경우]

[vs8 링커옵션에서 manifest 를 생성하지 않도록 설정한 경우]

해결 방법은 3가지가 있다고 합니다.
1. Vistual C++ Redistributable Merge Module 을 이용해서 Shared Side-By-Side assemblies 를 Native Assembly Cache, 즉 WinSxS 폴더에 설치하는 것입니다. 이게 가장 권장하는 방식이라고 하지만.. WinSxS 폴더에 Assembly 들을 등록하려면 Admin 권한이 필요하단 것입니다.
Redistributing Using Merge Modules
How to: Deploy using a Setup and Deployment Project

2. Visual C++ Redistributable Package (VCRedist_x86.exe, VCRedist_x64.exe, VCRedist_ia64.exe) 를 이용해서 1번 처럼 WinSxS 에 Assembly 를 등록하는 것입니다.
이 패키지들은 ms 사이트에서 다운로드 할 수 있습니다.

3. Private Assembly 를 사용하는 것입니다. .NET 에서도 GAC 에 등록하지 않고, private assembly 를 사용했던 기억이 살포시 나는데 그거랑 똑같은 거군요(닷넷 해본지 좀 오래되서 기억이 가물가물하네요) 뭐 문제는 공유되는 assembly 가 아니므로 혼자만 사용할 수 있다는 것이고, assembly 들에 대한 menifest 를 함께 배포해야 한다는 것이겠죠.

vs8 을 디폴트로 설치한 경우

C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT

아래에 DLL 들이랑 manifest 가 있는데 이녀석들을 함께 배포해 주면 됩니다.
crt 라이브러리만 사용한 경우 msvcr80.dll 과 Microsoft.VC80.CRT.manifest 만 배포하면 되겠네요.

세가지 방법 모두 그다지 맘에 들지 않네요.. 좀더 깔끔한 방법 없나요 ? ^^

참 그리고 재밌는 것은 manifest 를 생성해서 임베딩하지 않은 경우 (vs 2005 이전 버전) 또는 exe 에 대한  manifest 가 함께 존재하지 않는 경우 LoadLibrary() 를 통해서 msvcr80.dll 을 로딩하려 하면 오류가 발생합니다.
하하..ㅜㅜ 뭡니까 이거.. dll 에 특별한 뭔가가 없는걸로 봐서 로더에서 처리하는것 같기도 하고..
나중에 시간나면 한번 디버깅 해봐야 겠네요.
참고로 R6034 오류코드로 MSDN 에서 검색하면 자세한 정보가 나오긴 합니다.

Choosing a Deployment Method

http://www.serious-code.net/moin.cgi/RedistributingVisualCppRunTimeLibrary

manifest 파일을 배포할 때 빌드환경에 따라서 문제가 발생할 수 있습니다.
예를 들어 exe 파일을 service pack 1 이 적용된 Visual Studio 2005 로 만들고, service pack1 이 적용되지 않았을 당시의 manifest 를 배포했다면 오류가 발생합니다.
즉 바이너리의 빌드환경과 동일한 버전의 manifest 를 배포해야 한다는 얘기죠.

예전에 xxx 스튜디오랑 협업을 하던 와중에 이런 문제가 발생했었습니다.
빌드를 담당한 개발자는 VS2005 SP1 을 적용한 상태였고, 제쪽에서 만든 dll 도 마찬가지로 VS2005 SP 1 적용된 환경이었죠.
저는 당연히 VS 2005 SP1 용 manifest 를 전달했고, 스튜디오 개발자와 문제없이 테스트를 마쳤습니다.
모든 테스트가 끝났는데 이상하게 배포서버를 거쳐 테스트를 하면 오류가 생겼습니다.
결국 알고보니 배포를 담당한 개발자는 SP1 을 적용하지 않은 상태에서 no SP1 상태의 manifest 를 배포서버에 올려두었던 거죠.
manifest 문제일것 같으니 확인해 보라고 했으나 스튜디오에서 그렇게 하지 않은듯 하더군요.

하.. 쪽수에 밀려 우리쪽 모듈의 버그라고 오해 받아서 발칵 뒤집어 버릴 뻔 한 기억이 나는군요. -_-;;

C/C++/VC++ WinSXS

글 내비게이션

Previous post
Next post

답글 남기기 응답 취소

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

최신 글

  • AssertJ 소개testCompile ‘org.assertj:assertj-core:3.6.2’ 2017년 9월 14일
  • 자주 사용되는 Lombok 어노테이션 2017년 9월 14일
  • 유니코드 #3 2017년 9월 14일
  • 유니코드 #2 2017년 9월 14일
  • 유니코드 #1 2017년 9월 14일

최신 댓글

    카테고리

    • 개인 자료 (1)
      • 일기 (1)
    • 주절주절 (7)
    • 프로그래밍 갤러리 (16)
    • 프로그래밍 언어 (186)
      • Java (29)
      • C/C++/VC++ (114)
      • C# (11)
      • Visual Basic (6)
      • 안드로이드 (9)
      • Objective-C (5)
      • JavaScript (4)
      • JSP/Servlet (2)
      • Python (4)
      • 어셈블러 (1)
    • 개발++ (44)
      • Book (11)
        • Joel On Software (10)
      • 프로젝트 관리 (6)
      • Maven (1)
      • 디버깅 (1)
      • DirectX (1)
      • Silverlight (1)
      • RESTful (1)
      • Hacking (1)
      • WDM (4)
      • VoIP (5)
      • 기타 (1)
    • 개발 도구 (15)
      • eclipse (14)
      • Sublime Text (1)
    • 네트워크 (7)
    • 설치 및 배포 (7)
      • InstallShield (2)
      • NSIS (4)
    • 버전 관리 (9)
      • Git (2)
      • CVS (2)
      • Subversion (5)
    • 데이터베이스 (7)
      • Oracle (3)
      • Sybase (2)
      • MS-SQL (2)
    • 단위테스트 (3)
      • JUnit (1)
      • NUnit (2)
    • 버그추적시스템 (2)
      • mantis (2)
    • 운영체제 (7)
      • Windows (5)
      • 리눅스 (2)
    • WAS (3)
      • WebLogic (3)
    • 디자인패턴 (1)
    • 디지털 이미지 프로세싱 (16)

    태그

    ArrayList BMP CAB CAB 파일 CD-ROM COM DCOM Downcasting Encoding for each GetLastError() IHTMLDocument2 InstallShield Internet Explorer JDT LinkedList Lokbok netsh OCX Python SAX setup SVN toolbar TR1 unicows Upcasting VisualStudio WAVE XP 테마 내장 객체 다국어 레이아웃 로그 리소스 리팩토링 바이트 스트림 배열 버전관리 서브클래싱 스트림 시스템 에러메시지 유니코드 임시파일 입력 스트림

    메타

    • 로그인
    • 엔트리 피드
    • 댓글 피드
    • WordPress.org
    ©2025 DarkKaiser의 블로그 | WordPress Theme by SuperbThemes