다음을 통해 공유


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

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

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

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

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

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

응용 프로그램 매니페스트가 있으며 Windows 표준 검색 위치에서 찾을 수 없습니다 DLL에 따라 달라 집니다 경우이 이와 유사한 오류 메시지가 표시 될 수 있습니다.

  • 이 응용 프로그램 때문에 시작할 수 없습니다 필요한 DLL 찾을 수 없습니다.응용 프로그램을 다시 설치하면 이 문제가 해결될 수 있습니다.

이전 것과 유사한 오류 메시지가 손상 된 경우 Visual Studio 없는 컴퓨터에서 응용 프로그램을 배포한 다음이 사항을 확인 하십시오.

  1. 에 설명 된 단계를 Visual C++ 응용 프로그램의 종속성 이해.종속성 워커 응용 프로그램 또는 DLL에 대 한 대부분의 종속성을 표시할 수 있습니다.일부 Dll 누락 되었는지 확인 하는 경우 응용 프로그램을 실행 하려는 컴퓨터에 설치 합니다.

  2. 운영 체제 로더 응용 프로그램 매니페스트를 사용 하 여 응용 프로그램이 종속 어셈블리를 로드 합니다.매니페스트가 이진 파일에 리소스로 포함 또는 응용 프로그램 폴더에 별도 파일로 설치 수 있습니다.매니페스트가 이진 파일에 포함 되어 있는지 여부를 확인 하려면 이진 파일에 열기 Visual Studio 에 입력할 RT_MANIFEST 리소스 목록에서 찾습니다.포함 된 매니페스트를 찾을 수 없는 경우 응용 프로그램 폴더에 <binary_name>와 같은 명명 된 파일을 찾습니다. <extension>.manifest입니다.

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

  4. 매니페스트가 이진 파일에 포함 된 경우 rt_manifest의 ID가이 형식의 이진 파일에 대 한 정확한 지 확인 하십시오.리소스 ID 사용 하는 방법에 대 한 자세한 내용은 사용-Side-by-side 어셈블리 리소스로 (Windows).매니페스트는 별도 파일인 경우 XML 편집기나 텍스트 편집기에서 엽니다.매니페스트 및 배포에 대 한 규칙에 대 한 자세한 내용은 매니페스트.

    [!참고]

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

  5. DLL 로드 되는 경우 외부 매니페스트가 무시 되기 때문에 모든 DLL에는 매니페스트를 포함 하는 것이 좋습니다 있는 LoadLibrary 를 호출 합니다.자세한 내용은 Assembly manifests를 참조하십시오.

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

예제

우리는 응용 프로그램을 사용 하 여 빌드한 appl.exe을 가정해 Visual C++.응용 프로그램 매니페스트는 appl.exe에 입력할 RT_MANIFEST는 일치 하는 1, 또는 별도 파일로 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 32 비트 x86 프로세서 아키텍처용 만들어지는 Fabrikam.SxS.Library, 2.0.20121.0, 버전 이라는 어셈블리에 따라 달라 집니다이 매니페스트를 의미 합니다.종속-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 어셈블리를 사용할 수 있습니다 또한 게시자 구성 파일-정책 파일이 라고도-나란히 어셈블리는 동일한 어셈블리의 다른 버전을 대신 사용 하는 프로그램과 어셈블리 전역으로 리디렉션할 수 있습니다.%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 매니페스트 파일에 대 한 응용 프로그램 폴더를 확인 합니다.이 예제에서 로더 Fabrikam.SxS.Library.manifest appl.exe 들어 있는 폴더를 찾으려고 합니다.매니페스트가 발견 되 면 로더 응용 프로그램 폴더에서 어셈블리를 로드 합니다.어셈블리를 찾을 수 없습니다 로드 실패 합니다.

  2. 열려고는 \ <assemblyName> \ appl.exe, 들어 있는 폴더에 폴더 경우 \ <assemblyName> \ 있으면이 폴더에서 이름을 <assemblyName>.manifest 매니페스트 파일을 로드 하려고 시도 합니다.매니페스트가 발견 되 면 로더는 어셈블리에서 로드 된 \ <assemblyName> \ 폴더.어셈블리를 찾을 수 없습니다 로드 실패 합니다.

로더에서 종속 어셈블리를 검색 하는 방법에 대 한 자세한 내용은 어셈블리 검색 순서.로더에서 종속 어셈블리를 전용 어셈블리로 찾지 못하면 로드에 실패 하 고 "시스템이 지정 된 프로그램을 실행할 수 없습니다." 메시지가 표시 됩니다.이 오류를 해결 하려면 있는지 확인 종속 어셈블리 등의 일부인 Dll 및-컴퓨터에 전용 또는 공유 어셈블리로 설치 됩니다.

참고 항목

개념

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

기타 리소스

C/C++ 격리된 응용 프로그램 및 side-by-side 어셈블리 빌드