• Blog
  • Local Log
  • Tag Cloud
  • Key Log
  • Guestbook
  • RSS Feed
  • Write a Post
  • Admin

혹시 블로그 스킨이 깨져 보이시나요? 최신버전의 Internet Explorer(Windows용), Opera, Firefox를 사용해보세요.

C/C++ 격리된 응용 프로그램 및 side-by-side 어셈블리 문제 해결

Win32 API/MFC
2010/03/31 17:20
 
C/C++ 격리된 응용 프로그램 및 side-by-side 어셈블리 문제 해결

종속 Visual C++ 라이브러리를 찾을 수 없는 경우 C/C++ 응용 프로그램 로드에 실패할 수 있습니다. 발생 가능한 런타임 오류 목록은 Visual C++ 파일 재배포를 참조하십시오. 이 단원에서는 C/C++ 응용 프로그램 로드에 실패하는 가장 일반적인 이유에 대해 설명하고 문제를 해결하는 단계를 제공합니다.

Visual C++가 설치되어 있지 않은 컴퓨터에 응용 프로그램을 배포한 경우 Visual C++ 파일 재배포에 나열된 것과 비슷한 오류 메시지가 표시되면서 충돌이 발생하면 몇 가지 사항을 확인하여 오류의 원인을 파악해야 합니다.

  1. Visual C++ 응용 프로그램의 종속성 이해에 설명된 단계를 수행합니다. Dependency Walker는 특정 응용 프로그램이나 DLL의 종속성 대부분을 표시할 수 있습니다. 누락된 DLL이 발견되면 응용 프로그램을 실행하려는 컴퓨터에 그러한 DLL을 설치하십시오.

  2. 운영 체제 로더에서는 매니페스트를 사용하여 응용 프로그램이 의존하는 어셈블리를 로드합니다. 매니페스트는 이진 파일 내에 리소스로 포함되거나 응용 프로그램 로컬 폴더에 외부 파일로 저장될 수 있습니다. 매니페스트가 이진 파일 내에 포함되어 있는지 여부를 확인하려면 이진 파일을 Visual Studio에서 열고 이진 파일의 리소스를 검색합니다. RT_MANIFEST라는 리소스를 찾을 수 있어야 합니다. 이진 파일 내에 포함된 매니페스트를 찾을 수 없는 경우 <binary_name>.<extension>.manifest와 유사한 이름의 외부 파일이 있는지 확인합니다.

  3. 매니페스트가 없는 경우 링커에서 프로젝트에 대한 매니페스트를 생성하도록 해야 합니다. 이 프로젝트에 대한 프로젝트 속성 대화 상자에서 매니페스트 생성 링커 옵션을 확인해야 합니다.

    Note참고

    매니페스트를 생성하지 않고 Visual C++ 프로젝트를 빌드하는 기능은 지원되지 않습니다. Visual C++ 2005에서 빌드된 모든 C/C++ 프로그램은 Visual C++ 라이브러리에 대한 종속성을 설명하는 매니페스트를 포함해야 합니다.

  4. 이진 파일 내에 매니페스트가 포함된 경우 RT_MANIFEST의 ID가 이 형식의 이진 파일에 맞는지 확인합니다. 응용 프로그램의 경우 ID가 1이어야 하고, 대부분의 DLL의 경우 ID는 2여야 합니다. 매니페스트가 외부 파일에 있는 경우에는 XML 편집기나 일반 텍스트 편집기에서 이 파일을 엽니다. 매니페스트 및 배포 규칙에 대한 자세한 내용은 Manifests를 참조하십시오.

    Note참고

    Windows XP에서 응용 프로그램 로컬 폴더에 외부 매니페스트가 있는 경우 운영 체제 로더에서는 이진 파일 내에 포함된 매니페스트 대신 이 매니페스트를 사용합니다. Windows Server 2003 및 이후 버전의 Windows에서는 이와 반대로 포함된 매니페스트가 있는 경우 외부 매니페스트가 무시되고 포함된 매니페스트가 사용됩니다.

  5. 모든 DLL에 대해 매니페스트를 이진 파일에 포함하는 것이 좋습니다. LoadLibrary 호출을 통해 DLL이 로드되는 경우에는 외부 매니페스트가 무시됩니다. 자세한 내용은 Assembly manifests를 참조하십시오.

  6. 매니페스트에 열거된 모든 어셈블리가 컴퓨터에 제대로 설치되어 있는지 확인합니다. 매니페스트에서 각 어셈블리는 이름, 버전 번호 및 프로세서 아키텍처로 지정됩니다. 응용 프로그램이 side-by-side 어셈블리를 사용하는 경우 운영 체제 로더에서 Assembly Searching Sequence에 설명된 단계에 따라 검색할 수 있도록 어셈블리가 컴퓨터에 제대로 설치되어 있는지 확인합니다. 64비트 어셈블리는 32비트 프로세스에서 로드할 수 없고 32비트 운영 체제에서 실행될 수 없다는 점에 주의하십시오.

예제

Visual C++ 2005에서 빌드한 appl.exe라는 응용 프로그램이 있다고 가정합니다. 이 응용 프로그램의 매니페스트는 appl.exe 내에 ID가 1인 이진 리소스 RT_MANIFEST로 포함되어 있거나, 외부 파일인 appl.exe.manifest로 저장되어 있습니다. 매니페스트의 내용은 다음과 유사합니다.

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

이 매니페스트에서는 운영 체제 로더에 appl.exe가 버전이 8.0.50608.0이고 32비트 x86 프로세서 아키텍처용으로 빌드된 Microsoft.VC80.CRT에 의존한다고 알려 줍니다.

종속 side-by-side 어셈블리는 공유 어셈블리 또는 전용 어셈블리로 설치될 수 있습니다. 예를 들어 Visual Studio 2005에서는 CRT 어셈블리를 %WINDIR%\WinSxS\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50608.0_x-ww_b7acac55 디렉터리에 공유 side-by-side 어셈블리로 설치합니다.

공유 Visual C++ CRT 어셈블리에 대한 assembly manifest도 %WINDIR%\WinSxS\Manifests\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50608.0_x-ww_b7acac55.manifest에 설치됩니다. 이 매니페스트는 이 어셈블리를 식별하고 어셈블리의 내용(이 어셈블리의 일부인 DLL)을 나열합니다.

복사
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright © 1981-2001 Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <noInheritable/>
   <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.42" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
   <file name="msvcr80.dll" hash="3ca5156e8212449db6c622c3d10f37d9adb12c66" hashalg="SHA1"/>
   <file name="msvcp80.dll" hash="92cf8a9bb066aea821d324ca4695c69e55b27cff" hashalg="SHA1"/>
   <file name="msvcm80.dll" hash="7daa93e1195940502491c987ff372190bf199395" hashalg="SHA1"/>
</assembly>

또한 side-by-side 어셈블리는 정책 파일이라고도 하는 publisher configuration files를 사용하여 응용 프로그램 및 어셈블리에서 특정 버전의 side-by-side 어셈블리를 사용하지 않고 동일한 어셈블리의 다른 버전을 사용하도록 전역으로 리디렉션할 수 있습니다. 공유 Visual C++ CRT 어셈블리에 대한 정책은 %WINDIR%\WinSxS\Policies\x86_policy.8.0.Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_x-ww_77c24773\8.0.50727.42.policy에서 확인할 수 있고, 다음과 유사한 내용을 포함합니다.

복사
</assembly>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright © 1981-2001 Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

   <assemblyIdentity type="win32-policy" name="policy.8.0.Microsoft.VC80.CRT" version="8.0.50727.42" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
   <dependency>
      <dependentAssembly>
         <assemblyIdentity type="win32" name="Microsoft.VC80.CRT" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"/>
         <bindingRedirect oldVersion="8.0.41204.256-8.0.50608.0" newVersion="8.0.50727.42"/>
      </dependentAssembly>
   </dependency>
</assembly>

위 정책에서는 이 어셈블리의 8.0.41204.256 버전을 요청하는 모든 응용 프로그램 및 어셈블리에서 컴퓨터에 설치된 최신 버전인 8.0.50727.42 버전 어셈블리를 대신 사용하도록 지정합니다. 응용 프로그램 매니페스트에 나오는 어셈블리 버전이 정책 파일에 지정된 경우 로더는 WinSxS 폴더에서 매니페스트에 지정된 버전의 어셈블리를 검색하고, 이 버전이 설치되어 있지 않으면 로드에 실패합니다. 어셈블리 버전 8.0.50727.42가 설치되어 있지 않은 경우 어셈블리 버전 8.0.41204.256을 요청하는 응용 프로그램의 로드에 실패합니다.

그러나 CRT 어셈블리를 응용 프로그램 로컬 폴더에 전용 side-by-side 어셈블리로 설치할 수도 있습니다. 운영 체제에서 CRT 또는 기타 어셈블리를 공유 어셈블리로 찾지 못하면 어셈블리를 전용 어셈블리로 검색하기 시작합니다. 다음과 같은 순서로 전용 어셈블리가 검색됩니다.

  1. 응용 프로그램 로컬 폴더에 <assemblyName>.manifest라는 이름의 매니페스트 파일이 있는지 확인합니다. 이 예제에서 로더는 appl.exe가 있는 폴더에서 Microsoft.VC80.CRT.manifest를 찾습니다. 매니페스트가 발견되면 로더는 응용 프로그램 폴더에서 CRT DLL을 로드합니다. CRT DLL을 찾을 수 없는 경우에는 로드에 실패합니다.

  2. appl.exe 로컬 폴더에서 <assemblyName> 폴더를 열고 이 폴더가 존재하면 <assemblyName>.manifest를 이 폴더에서 로드합니다. 매니페스트가 발견되면 로더는 <assemblyName> 폴더에서 CRT DLL을 로드합니다. CRT DLL을 찾을 수 없는 경우에는 로드에 실패합니다.

로더에서 종속 어셈블리를 검색하는 방식에 대한 자세한 내용은 Assembly Searching Sequence를 참조하십시오. 로더에서 종속 어셈블리를 전용 어셈블리로 찾지 못하면 로드에 실패하고 "시스템이 지정된 프로그램을 실행할 수 없습니다."라는 메시지가 표시됩니다. 이 오류를 해결하려면 종속 어셈블리 및 이들 어셈블리의 일부인 DLL을 컴퓨터에 전용 또는 공유 어셈블리로 설치해야 합니다.

참고 항목

개념

격리된 응용 프로그램 및 side-by-side 어셈블리 개념

기타 리소스

C/C++ 격리된 응용 프로그램 및 side-by-side 어셈블리 빌드
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
TAG Manifest, side-by-side
No received trackback. / No comment.

Trackback Address :: http://sinwoong.co.kr/trackback/301

You can also say.

Prev 1 2 3 4 5 6 ... 285 Next
달빛는 지금.. 파이팅파이팅
C와 Assembly를 제2외국어로...
남자RH+ O형사수자리경기도

카테고리

  • 전체 (285)
    • Project HSL (2)
    • Project Talk (8)
    • 생각 (16)
    • 일상 (18)
    • 정보/스크랩 (64)
    • 용어사전 (4)
    • IT외부행사 (15)
    • ASSEMBLY (7)
    • Win32 API/MFC (29)
    • Hacking/Virus/Vaccine (24)
    • 관심거리 (3)
    • 스킨/플러그인 (2)
    • 시간 죽이기 (2)
    • 천연 비누/화장품 (10)
    • Windows Server 2008 (57)
    • 디바이스 드라이버 (23)
    • 카드 (1)
    • 지식베이스캠프 (0)
    • 소프트캠프 업무 일지 (0)

태그목록

  • 포인터변수
  • 수수료
  • 달리기
  • Detoured.dll
  • compiler
  • 해커
  • 유니코드
  • 스파이웨어
  • Windows Crash Dump
  • 愛情缺乏症
  • 종이책
  • Win32 API
  • Process Name
  • SP2
  • Dependency Walker
  • 온라인 예절
  • 인터넷 중독
  • 프로젝트 HSL
  • 모놀리식
  • 디바이스 드라이버
  • 아스키 코드표
  • Microsoft Visual C++ 2005 Redistributable Package
  • Music
  • ATL
  • 암호화
  • 리눅스
  • 술
  • 부익부 빈익빈
  • 자켓
  • 겨울방학

최근에 올라온 글

  • ExitProcess(), Termina....
  • C/C++ 격리된 응용 프로....
  • EnumPrinters.
  • 알고 있어야 도움이 되....
  • Microsoft Windows XP....

최근에 달린 댓글

  • 좋은 자료 감사합니다.. Minjong Kim 08/09
  • 학습로드맵 잘 보고 갑.... Minjong Kim 08/09
  • 잘보고 갑니다 : ). hothead 07/16
  • 좋은 글 잘읽었습니다. ^^. Rhea君 05/06
  • 좋은 소프트웨어네여. montreal florist 01/12

최근에 받은 트랙백

  • Windows 시스템 실행파.... 김재호의 디지털보단 아... 02/14
  • 스레드만 사용하면 컴퓨.... 철없는강아지의 블로그 2008
  • 언제 다이어그램을 그려.... 너구리의 프로그래밍 세계 2007
  • 국내 웹환경에 기대를.... *~アスタリスク~ 2007
  • [플러그인] IS Flash Vi.... ISCUBIX.COM 2007

글 보관함

  • 2010/06 (1)
  • 2010/03 (2)
  • 2009/09 (1)
  • 2009/04 (2)
  • 2009/03 (5)

달력

«   2010/09   »
일 월 화 수 목 금 토
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

링크

  • IT 용어사전.
  • Total : 288481
  • Today : 17
  • Yesterday : 245
Tattertools
Eolin
rss

달빛's blog is powered byTattertools1.5.3.1 : Adamantine
Skin by Nyangkum