Dela via


Felsöka isolerade C/C++-program och sammansättningar sida vid sida

Det går inte att läsa in ett C/C++-program om det inte går att hitta beroende bibliotek. Den här artikeln beskriver några vanliga orsaker till varför ett C/C++-program inte kan läsas in och föreslår steg för att lösa problemen.

Om ett program inte kan läsas in eftersom det har ett manifest som anger ett beroende av en sida vid sida-sammansättning och sammansättningen inte är installerad som en privat sammansättning i samma mapp som den körbara filen eller i den interna sammansättningscache i mappen %WINDIR%\WinSxS\ kan något av följande felmeddelanden visas. beroende på vilken version av Windows som du försöker köra appen på.

  • Programmet kunde inte initieras korrekt (0xc0000135).

  • Det gick inte att starta det här programmet eftersom programkonfigurationen är felaktig. Om du installerar om programmet kan det här problemet åtgärdas.

  • Systemet kan inte köra det angivna programmet.

Om programmet inte har något manifest och är beroende av en DLL som Windows inte kan hitta på de vanliga sökplatserna kan ett felmeddelande som liknar det här visas:

  • Det gick inte att starta det här programmet eftersom det inte gick att hitta en obligatorisk DLL . Om du installerar programmet igen kan det här problemet åtgärdas.

Om ditt program distribueras på en dator som inte har Visual Studio och det kraschar med felmeddelanden som liknar de tidigare, kontrollerar du följande:

  1. Följ stegen som beskrivs i Förstå beroenden för ett visuellt C++-program. Beroendevandraren kan visa de flesta beroenden för ett program eller DLL. Om du ser att vissa DLL:er saknas installerar du dem på den dator där du försöker köra programmet.

  2. Operativsystemets inläsare använder programmanifestet för att läsa in sammansättningar som programmet är beroende av. Manifestet kan antingen bäddas in i binärfilen som en resurs eller installeras som en separat fil i programmappen. Om du vill kontrollera om manifestet är inbäddat i binärfilen öppnar du binärfilen i Visual Studio och letar efter RT_MANIFEST i listan över resurser. Om du inte hittar ett inbäddat manifest, leta i programmappen efter en fil som heter något i stil med <binary_name>.<extension>.manifest.

  3. Om programmet är beroende av sammansättningar sida vid sida och ett manifest inte finns, måste du se till att länkaren genererar ett manifest för projektet. Markera länkalternativet Generera manifest i dialogrutan Projektegenskaper för projektet.

  4. Om manifestet är inbäddat i binärfilen kontrollerar du att ID:t för RT_MANIFEST är korrekt för den här typen av binärfil. Mer information om vilket resurs-ID som ska användas finns i Använda sida-vid-sida-sammansättningar som en resurs (Windows). Om manifestet finns i en separat fil öppnar du det i en XML-redigerare eller textredigerare. Mer information om manifest och regler för distribution finns i Manifest.

    Anmärkning

    Om både ett inbäddat manifest och en separat manifestfil finns använder operativsystemets inläsare det inbäddade manifestet och ignorerar den separata filen. Men på Windows XP är motsatsen sant – den separata manifestfilen används och det inbäddade manifestet ignoreras.

  5. Vi rekommenderar att du bäddar in ett manifest i varje DLL eftersom externa manifest ignoreras när en DLL läses in via ett LoadLibrary anrop. Mer information finns i Sammansättningsmanifest.

  6. Kontrollera att alla sammansättningar som räknas upp i manifestet är korrekt installerade på datorn. Varje sammansättning anges i manifestet med dess namn, versionsnummer och processorarkitektur. Om programmet är beroende av sammansättningar sida vid sida kontrollerar du att dessa sammansättningar är korrekt installerade på datorn så att operativsystemets inläsare kan hitta dem, enligt beskrivningen i Sammansättningssökningssekvens. Kom ihåg att 64-bitars sammansättningar inte kan läsas in i 32-bitarsprocesser och inte kan köras på 32-bitars operativsystem.

Exempel

Anta att vi har ett program, appl.exe, som skapas med hjälp av Visual C++. Programmanifestet är antingen inbäddat i appl.exe som den binära resursen RT_MANIFEST, som har ett ID som är lika med 1 eller lagras som den separata filen appl.exe.manifest. Innehållet i det här manifestet liknar följande:

<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>

Till operativsystemets läsare anger detta manifest att appl.exe är beroende av en assembly med namnet Fabrikam.SxS.Library, version 2.0.20121.0, som är byggd för en 32-bitars x86-processorarkitektur. Den beroende parallella samlingen kan installeras antingen som en delad samling eller som en privat samling.

Sammansättningsmanifestet för en delad sammansättning installeras i mappen %WINDIR%\WinSxS\Manifests\. Den identifierar sammansättningen och listar dess innehåll, det vill: de DLL:er som ingår i sammansättningen:

<?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>

Sida vid sida-sammansättningar kan också använda konfigurationsfiler för utgivare – även kallade principfiler – för att globalt omdirigera program och sammansättningar för att använda en version av en sida vid sida-sammansättning i stället för en annan version av samma sammansättning. Du kan kontrollera principerna för en delad sammansättning i mappen %WINDIR%\WinSxS\Policies\. Här är ett exempel på en principfil:

<?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>

Den här principfilen anger att alla program eller sammansättningar som begär version 2.0.10000.0 av den här sammansättningen i stället ska använda version 2.0.20121.0, vilket är den aktuella versionen som är installerad i systemet. Om en version av sammansättningen som anges i programmanifestet anges i principfilen letar inläsaren efter en version av den här sammansättningen som anges i manifestet i mappen %WINDIR%\WinSxS\ och om den här versionen inte är installerad misslyckas belastningen. Och om sammansättningsversion 2.0.20121.0 inte är installerad misslyckas belastningen för program som ber om sammansättningsversion 2.0.10000.0.

Sammansättningen kan dock också installeras som en privat sida vid sida-sammansättning i den installerade programmappen. Om operativsystemet inte hittar sammansättningen som en delad sammansättning letar det efter den som en privat sammansättning i följande ordning:

  1. Kontrollera i programmappen efter en manifestfil som har namnet <assemblyName.manifest>. I det här exemplet försöker inläsaren hitta Fabrikam.SxS.Library.manifest i mappen som innehåller appl.exe. Om manifestet hittas laddar laddaren in sammansättningen från programmappen. Om sammansättningen inte hittas misslyckas belastningen.

  2. Försök att öppna \<assemblyName>\ folder in the folder that contains appl.exe, och om \<assemblyName>\ finns kan du försöka läsa in en manifestfil med namnet <assemblyName.manifest> från den här mappen. Om manifestet hittas läser in inläsaren sammansättningen från mappen \<assemblyName>\ . Om sammansättningen inte hittas misslyckas belastningen.

Mer information om hur laddaren söker efter beroendesammansättningar finns i Sekvens för sammansättningssökning. Om inläsaren inte hittar en beroende sammansättning som en privat sammansättning misslyckas belastningen och meddelandet "Systemet kan inte köra det angivna programmet" visas. Lös det här felet genom att kontrollera att beroende sammansättningar – och DLL:er som ingår i dem – är installerade på datorn som antingen privata eller delade sammansättningar.

Se även

Begrepp för isolerade program och sammansättningar sida vid sida
Skapa C/C++-isolerade program och sammansättningar sida vid sida