Řešení potíží s izolovanými aplikacemi C/C++ a souběžnými sestaveními

Načtení aplikace C/C++ může selhat, pokud nelze najít závislé knihovny. Tento článek popisuje některé běžné důvody, proč se aplikace C/C++ nenačte, a navrhuje kroky k vyřešení problémů.

Pokud se aplikaci nepodaří načíst, protože má manifest, který určuje závislost na souběžné sestavení a sestavení není nainstalováno jako soukromé sestavení ve stejné složce jako spustitelný soubor, ani v nativní mezipaměti sestavení ve složce %WINDIR%\WinSxS\, může se zobrazit jedna z následujících chybových zpráv: v závislosti na verzi Windows, na které se pokusíte aplikaci spustit.

  • Aplikaci se nepodařilo inicializovat správně (0xc0000135).

  • Tato aplikace se nepodařilo spustit, protože konfigurace aplikace není správná. Tento problém může vyřešit přeinstalace aplikace.

  • Systém nemůže spustit zadaný program.

Pokud vaše aplikace nemá žádný manifest a závisí na knihovně DLL, kterou Systém Windows nemůže najít v typických umístěních hledání, může se zobrazit chybová zpráva podobná této:

  • Tuto aplikaci se nepodařilo spustit, protože nebyla nalezena požadovaná knihovna DLL . Tento problém může vyřešit opětovná instalace aplikace.

Pokud je vaše aplikace nasazená v počítači, který nemá sadu Visual Studio, dojde k chybě s chybovými zprávami, které se podobají předchozím zprávám, zkontrolujte tyto věci:

  1. Postupujte podle kroků popsaných v tématu Principy závislostí aplikace Visual C++. Walker závislostí může zobrazit většinu závislostí pro aplikaci nebo knihovnu DLL. Pokud zjistíte, že některé knihovny DLL chybí, nainstalujte je do počítače, na kterém se pokoušíte spustit aplikaci.

  2. Zavaděč operačního systému používá manifest aplikace k načtení sestavení, na které aplikace závisí. Manifest lze buď vložit do binárního souboru jako prostředek, nebo nainstalovat jako samostatný soubor ve složce aplikace. Pokud chcete zkontrolovat, jestli je manifest vložený do binárního souboru, otevřete binární soubor v sadě Visual Studio a v seznamu prostředků vyhledejte RT_MANIFEST. Pokud nemůžete najít vložený manifest, vyhledejte ve složce aplikace soubor s názvem něco jako <binary_name>.<extension.manifest>.

  3. Pokud aplikace závisí na souběžných sestaveních a manifest není k dispozici, musíte zajistit, aby linker vygeneroval manifest pro váš projekt. Zaškrtněte možnost Linker Generovat manifest v dialogovém okně Vlastnosti projektu projektu projektu.

  4. Pokud je manifest vložen do binárního souboru, ujistěte se, že ID RT_MANIFEST je správné pro tento typ binárního souboru. Další informace o tom, které ID prostředku použít, naleznete v tématu Použití souběžných sestavení jako prostředku (Windows). Pokud je manifest v samostatném souboru, otevřete ho v editoru XML nebo textovém editoru. Další informace o manifestech a pravidlech pro nasazení najdete v tématu Manifesty.

    Poznámka

    Pokud je k dispozici vložený manifest i samostatný soubor manifestu, zavaděč operačního systému použije vložený manifest a ignoruje samostatný soubor. V systému Windows XP je však opak pravdivý – použije se samostatný soubor manifestu a vložený manifest se ignoruje.

  5. Doporučujeme vložit manifest do každé knihovny DLL, protože externí manifesty se při načtení knihovny DLL přes LoadLibrary volání ignorují. Další informace naleznete v tématu Manifesty sestavení.

  6. Zkontrolujte, zda jsou v počítači správně nainstalována všechna sestavení, která jsou vyčíslená v manifestu. Každé sestavení se v manifestu zadává podle názvu, čísla verze a architektury procesoru. Pokud vaše aplikace závisí na souběžných sestaveních, zkontrolujte, zda jsou tato sestavení správně nainstalována v počítači, aby je zavaděč operačního systému mohl najít, jak je popsáno v pořadí vyhledávání sestavení. Mějte na paměti, že 64bitová sestavení nelze načíst do 32bitových procesů a nelze je spustit v 32bitových operačních systémech.

Příklad

Předpokládejme, že máme aplikaci appl.exe, která je sestavena pomocí Visual C++. Manifest aplikace je vložen v souboru appl.exe jako binární prostředek RT_MANIFEST, který má ID rovna 1, nebo je uložen jako samostatný soubor appl.exe.manifest. Obsah tohoto manifestu vypadá takto:

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

Pro zavaděč operačního systému tento manifest říká, že appl.exe závisí na sestavení s názvem Fabrikam.SxS.Library verze 2.0.20121.0, která je vytvořená pro 32bitovou architekturu procesoru x86. Závislé souběžné sestavení lze nainstalovat buď jako sdílené sestavení, nebo jako soukromé sestavení.

Manifest sestavení pro sdílené sestavení je nainstalován ve složce %WINDIR%\WinSxS\Manifests\. Identifikuje sestavení a vypíše jeho obsah – to znamená knihovny DLL, které jsou součástí sestavení:

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

Souběžná sestavení můžou také používat konfigurační soubory vydavatele – označované také jako soubory zásad – k globálnímu přesměrování aplikací a sestavení tak, aby místo jiné verze stejného sestavení používaly jednu verzi souběžného sestavení. Zásady sdíleného sestavení můžete zkontrolovat ve složce %WINDIR%\WinSxS\Policies\. Tady je příklad souboru zásad:

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

Tento soubor zásad určuje, že všechny aplikace nebo sestavení, které požaduje verzi 2.0.10000.0 tohoto sestavení, by místo toho měly používat verzi 2.0.20121.0, což je aktuální verze nainstalovaná v systému. Pokud je v souboru zásad zadána verze sestavení uvedené v manifestu aplikace, zavaděč vyhledá verzi tohoto sestavení, která je zadaná v manifestu ve složce %WINDIR%\WinSxS\ a pokud tato verze není nainstalovaná, načtení selže. A pokud sestavení verze 2.0.20121.0 není nainstalováno, načtení se nezdaří pro aplikace, které požaduje sestavení verze 2.0.10000.0.

Sestavení však lze také nainstalovat jako soukromé souběžné sestavení ve složce nainstalované aplikace. Pokud operační systém nenajde sestavení jako sdílené sestavení, vyhledá ho jako soukromé sestavení v následujícím pořadí:

  1. Zkontrolujte složku aplikace pro soubor manifestu, který má název <assemblyName.manifest>. V tomto příkladu se zavaděč pokusí najít Fabrikam.SxS.Library.manifest ve složce, která obsahuje appl.exe. Pokud najde manifest, zavaděč načte sestavení ze složky aplikace. Pokud sestavení nebylo nalezeno, načtení selže.

  2. Pokuste se otevřít složku \<assemblyName>\ ve složce, která obsahuje soubor appl.exe a pokud \<assemblyName>\ existuje, zkuste načíst soubor manifestu s názvem <assemblyName.manifest> z této složky. Pokud se manifest najde, zavaděč načte sestavení ze složky \<assemblyName>\. Pokud sestavení nebylo nalezeno, načtení selže.

Další informace o tom, jak zavaděč hledá závislá sestavení, naleznete v části Pořadí vyhledávání sestavení. Pokud zavaděč nenajde závislé sestavení jako soukromé sestavení, načtení selže a zobrazí se zpráva Systém nemůže spustit zadaný program. Pokud chcete tuto chybu vyřešit, ujistěte se, že jsou závislá sestavení (a knihovny DLL, které jsou jejich součástí), nainstalovány v počítači jako soukromá nebo sdílená sestavení.

Viz také

Koncept izolovaných aplikací a souběžných sestavení
Sestavení izolovaných aplikací C/C++ a souběžných sestavení