이 페이지가 유용했습니까?
이 콘텐츠에 대한 여러분의 의견은 중요합니다. 의견을 알려주십시오.
추가 의견
1500자 남음
내보내기(0) 인쇄
모두 확장
이 문서는 수동으로 번역한 것입니다. 원본 텍스트를 보려면 포인터를 문서의 문장 위로 올리십시오. 추가 정보
번역
원본

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

종속 라이브러리를 찾을 수 없는 경우 C/C++ 응용 프로그램 로드에 실패할 수 있습니다. 이 문서에서 몇 가지 C/C++ 응용 프로그램 로드에 실패하는 일반적인 이유를 설명하고 문제를 해결하는 단계를 제안합니다.

병렬 어셈블리에 종속성을 지정하는 매니페스트가 있기에 응용 프로그램이 로드 되지 않는거나 응용 프로그램 어셈블리를 전용 어셈블리로 실행 파일과 같은 폴더 또는 %WINDIR%\WinSxS\ 폴더에서 네이티브 어셈블리 캐시에 설치 되어 있지 않는 경우 응용 프로그램 실행을 시도 하는 Windows의 버전에 따라 다음 오류 메시지 중 하나가 표시 될 수 있습니다.

  • 응용 프로그램이 제대로 초기화 하지 못했습니다 (0xc0000135).

  • 응용 프로그램 구성이 잘못되어 응용 프로그램을 시작하지 못했습니다. 응용 프로그램을 다시 설치하면 이 문제가 해결될 수 있습니다.

  • 시스템이 지정된 된 프로그램을 실행할 수 없습니다.

응용 프로그램에 매니페스트가 없고 Windows가 일반적인 검색 위치에서 찾을 수 없는 DLL에 의존할 경우 이와 비슷한 오류 메시지가 표시 될 수 있습니다.

  • 이 응용 프로그램은 a required DLL 를 찾을 수 없었기 때문에 때문에 시작하지 못했습니다. 응용 프로그램을 다시 설치하면 이 문제가 해결될 수 있습니다.

Visual Studio가 없는 컴퓨터에서 응용 프로그램을 배포하고 이전에 비슷한 오류 메시지와 함께 충돌한 경우 다음 사항을 확인 하십시오:

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

  2. 운영 체제 로더는 응용 프로그램 매니페스트를 사용하여 응용 프로그램이 의존하는 어셈블리를 로드합니다. 매니페스트는 이진 파일 내에 리소스로 포함되거나 응용 프로그램 로컬 폴더에 분리된 파일로 저장될 수 있습니다. 매니페스트가 이진 파일에 포함 되어 있는지 여부를 확인하기 위해 Visual Studio 에서 이진법의 파일을 열고 RT_MANIFEST 리소스 목록을 찾아보십시오. 포함된 된 매니페스트를 찾을 수 없는 경우 응용 프로그램 폴더에 <binary_name>.<확장> 매니페스트와 같은 이름의 파일을 확인하세요.

  3. 응용 프로그램이 병렬 어셈블리에 종속되고 매니페스트가 없는 경우 링커가 프로젝트에 대한 매니페스트를 생성하도록 해야 합니다. 이 프로젝트에 대한 프로젝트 속성 대화 상자에서 매니페스트 생성 링커 옵션을 확인합니다.

  4. 이진 파일 내에서 매니페스트가 포함된 경우 RT_MANIFEST의 ID가 이 형식의 이진 파일에 맞는지 확인합니다. 리소스 ID를 사용하는 것에 대한 자세한 정보는 리소스 (Windows)로서 병렬 어셈블리 사용하기를 참조하세요. 매니페스트가 분리된 파일에 있는 경우에는 XML 편집기나 텍스트 편집기에서 이 파일을 엽니다. 매니페스트 및 배포 규칙에 대한 자세한 내용은 Manifests를 참조하십시오.

    참고 참고

    포함된 매니페스트와 별도 매니페스트 파일이 모두 있는 경우 운영 체제 로더는 포함 된 매니페스트를 사용하고 별도 파일을 무시 합니다. 그러나 Windows XP에서는 그 반대가 맞습니다-별도 매니페스트 파일이 사용되고 포함된 매니페스트가 무시됩니다.

  5. 모든 DLL에 LoadLibrary 호출에도 불구하고 DLL이 로드되었을 때 외부 매니페스트가 무시되기 때문에 매니페스트를 포함시킬 것을 추천합니다. 자세한 내용은 Assembly manifests를 참조하십시오.

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

Visual C++을 사용하여 빌드한 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="Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
</assembly>

이 매니페스트에서는 운영 체제 로더에 appl.exe가 버전이 2.0.20121.0이고 32비트 x86 프로세서 아키텍처용으로 빌드된 Fabrikam.SxS.Library에 종속됨을 알려 줍니다. 종속 side-by-side 어셈블리는 공유 어셈블리 또는 전용 어셈블리로서 설치될 수 있습니다.

공유된 어셈블리에 대한 어셈블리 매니페스트의 경우 매니페스트는 %WINDIR%\WinSxS\Manifests\ 폴더에 설치됩니다. 그 것은 어셈블리를 식별하고 해당 내용을 나열합니다-어셈블리의 일부인 Dll.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
   <noInheritable/>
   <assemblyIdentity type="win32" name="Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
   <file name="Fabrikam.Main.dll" hash="3ca5156e8212449db6c622c3d10f37d9adb1ab12" hashalg="SHA1"/>
   <file name="Fabrikam.Helper.dll" hash="92cf8a9bb066aea821d324ca4695c69e55b2d1c2" hashalg="SHA1"/>
</assembly>

또한 side-by-side 어셈블리는 정책 파일이라고도 알려진 publisher configuration files를 사용하여 응용 프로그램 및 어셈블리에서 특정 버전의 side-by-side 어셈블리를 사용하지 않고 동일한 어셈블리의 다른 버전 대신 사용하도록 할 수 있습니다. %WINDIR%\WinSxS\Policies\ 폴더에서 공유 어셈블리에 대한 정책을 확인할 수 있습니다. 여기에는 다음과 같은 정책 파일의 예가 있습니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

   <assemblyIdentity type="win32-policy" name="policy.2.0.Fabrikam.SxS.Library" version="2.0.20121.0" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
   <dependency>
      <dependentAssembly>
         <assemblyIdentity type="win32" name="Fabrikam.SxS.Library" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3e"/>
         <bindingRedirect oldVersion="2.0.10000.0-2.0.20120.99" newVersion="2.0.20121.0"/>
      </dependentAssembly>
   </dependency>
</assembly>

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

그러나 어셈블리를 설치된 응용 프로그램 로컬 폴더에 전용 side-by-side 어셈블리로 설치할 수도 있습니다. 운영 체제에서 어셈블리를 공유 어셈블리로 찾지 못하면 다음 명령에서 어셈블리를 전용 어셈블리로 검색하기 시작합니다.

  1. 응용 프로그램 로컬 폴더에 <assemblyName> manifest라는 이름의 매니페스트 파일이 있는지 확인합니다. 이 예제에서 로더는 appl.exe를 포함하는 폴더에서 Fabrikam.SxS.Library.manifest를 찾습니다. 매니페스트가 발견되면 로더는 응용 프로그램 폴더에서 어셈블리를 로드합니다. 어셈블리를 찾을 수 없는 경우에는 로드에 실패합니다.

  2. appl.exe 가 포함 된 폴더에서 \<assemblyName>\ 폴더를 열고 \<assemblyName>\가 존재하는 경우 <assemblyName>.manifest라는 이름을 가진 매니페스트 파일을 로드 하세요. 매니페스트가 발견되면 로더는 \<assemblyName>\ 폴더에서 어셈블리를 로드합니다. 어셈블리를 찾을 수 없는 경우에는 로드에 실패합니다.

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

커뮤니티 추가 항목

Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2015 Microsoft