Udostępnij za pośrednictwem


Rozwiązywanie problemów z c i C++ odizolowane aplikacje i zespoły Side-by-side

Ładowanie aplikacji C/C++ może nie, jeśli nie można odnaleźć biblioteki zależnych.W tym artykule opisano niektóre typowe przyczyny, dlaczego aplikacja C/C++ nie powiedzie się, aby załadować, i sugeruje kroki rozwiązywania problemów.

Jeśli aplikacja nie może załadować, ponieważ ma on manifestu, który określa zależność od zestawu side-by-side, a zestaw nie jest zainstalowany jako zestaw prywatny, w tym samym folderze co plik wykonywalny, ani też w pamięci podręcznej zestawów macierzystym, w folderze %WINDIR%\WinSxS\, jeden z następujących komunikatów o błędach mogą być wyświetlane, w zależności od wersji systemu Windows, na którym zostanie podjęta próba uruchomienia aplikacji.

  • Aplikacja nie została właściwie zainicjowana (0xc0000135).

  • Tej aplikacji nie powiodło się, ponieważ konfiguracja aplikacji jest niepoprawna.Ponowne zainstalowanie aplikacji może rozwiązać ten problem.

  • System nie może wykonać określonego programu.

Jeśli aplikacja ma manifestu i jest zależny od biblioteki DLL, który system Windows nie może odnaleźć w lokalizacji wyszukiwania typowe, komunikat o błędzie podobny do pokazanego mogą być wyświetlane:

  • Tej aplikacji nie powiodło się, ponieważ wymaganej biblioteki DLL nie został znaleziony.Ponowne zainstalowanie aplikacji może rozwiązać ten problem.

Jeśli aplikacja jest wdrażana na komputerze, który nie ma programu Visual Studio, a pada z komunikatami o błędach, które przypominają poprzednich, należy sprawdzić następujące rzeczy:

  1. Wykonaj kroki opisane w Opis zależności aplikacji Visual C++.Walker zależności można pokazać zależności większości aplikacji lub DLL.Jeśli można zaobserwować, że brakuje niektórych bibliotek DLL, należy je zainstalować na komputerze, na którym chcesz uruchomić aplikację.

  2. Moduł ładujący systemu operacyjnego używa manifest aplikacji ładowanie zestawów, w których aplikacja jest zależna.Manifest może być osadzony w pliku binarnego jako zasób albo zainstalowany jako oddzielny plik w folderze aplikacji.Aby sprawdzić, czy manifest jest osadzony w pliku binarnego, otwórz plik binarny w Visual Studio i wyszukać RT_MANIFEST swoją listę zasobów.Jeśli nie możesz znaleźć wbudowanym manifestem, Szukaj w folderze aplikacji dla pliku, który ma coś w stylu <binary_name> wspomniany. manifest <extension>.

  3. Jeżeli zespołów side-by-side zależy od aplikacji i manifestu nie jest obecny, musisz upewnić się, że program łączący generuje manifest dla projektu.Zaznacz opcję program łączący Generate manifest w Właściwości projektu okno dialogowe dla projektu.

  4. Jeśli manifest jest osadzony w pliku binarnego, upewnij się, że identyfikator RT_MANIFEST jest poprawny dla tego typu pliku binarnego.Aby uzyskać więcej informacji na temat identyfikator zasobu, z którym obsłudze, zobacz za pomocą zestawów Side-by-Side jako zasób (Windows).Jeśli manifest znajduje się w oddzielnym pliku, należy go otworzyć w edytorze XML lub edytora tekstów.Aby uzyskać więcej informacji na temat manifestów i reguł dotyczących wdrażania, zobacz przejawia.

    [!UWAGA]

    Jeśli wbudowanym manifestem i oddzielnego pliku manifestu są obecne, moduł ładujący systemu operacyjnego używa wbudowanym manifestem i ignoruje w oddzielnym pliku.Jednak w systemie Windows XP jest odwrotna — oddzielnego pliku manifestu jest używany i wbudowanym manifestem jest ignorowana.

  5. Firma Microsoft zaleca, osadzić manifestu w każdej biblioteki DLL, ponieważ zewnętrznych manifesty są ignorowane, gdy biblioteka DLL jest załadowany jednak LoadLibrary zadzwonić.Aby uzyskać więcej informacji, zobacz przejawia zestawu.

  6. Sprawdź, czy wszystkie zespoły, które są wyliczane w manifeście są poprawnie zainstalowane na komputerze.W manifeście określono każdego zestawu według jego nazwy, numeru wersji i architektury procesora.Jeżeli zespołów side-by-side zależy od aplikacji, należy sprawdzić, zespoły te są prawidłowo zainstalowane na komputerze tak, aby moduł ładujący systemu operacyjnego można je znaleźć, zgodnie z opisem w Kolejności wyszukiwania montażu.Należy pamiętać, że 64-bitowych zestawów nie mogą być ładowane w procesach 32-bitowe i nie można wykonać w 32-bitowych systemach operacyjnych.

Przykład

Załóżmy, mamy aplikację, appl.exe, która jest tworzona przy użyciu Visual C++.Manifest aplikacji albo osadzone w appl.exe jako zasobu binarnego RT_MANIFEST, który o identyfikatorze równą 1 lub jest przechowywana jako appl.exe.manifest oddzielny plik.Zawartość tego manifest podobny to:

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

Aby moduł ładujący systemu operacyjnego to oczywiste mówi, że ten appl.exe zależy od złożenia o nazwie Fabrikam.SxS.Library, 2.0.20121.0, wersji, który jest zbudowany pod kątem architektury procesora 86 x 32-bitowych.Zestawie współużytkowanym lub jako zestaw prywatny, można zainstalować zestawu zależnego side-by-side.

Manifestu zestawu do montażu udostępnione jest zainstalowany w folderze %WINDIR%\WinSxS\Manifests\.Określa Zgromadzenie i wyświetla jego zawartość — to znaczy biblioteki DLL, które są częścią zestawu:

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

Można również użyć zestawów Side-by-side plików konfiguracyjnych programu publisher— nazywane również plikami zasad — globalnie przekierować aplikacje i zestawy, do korzystania z jednej wersji zestawu side-by-side zamiast innej wersji tego samego zestawu.Zasady może wyszukać zestawie współużytkowanym w folderze %WINDIR%\WinSxS\Policies\.Oto przykładowy plik zasad:

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

Ten plik zasad określa, że każda aplikacja lub montaż, z prośbą o 2.0.10000.0 wersję tego zestawu należy zamiast używać wersji 2.0.20121.0, czyli bieżącej wersji, która jest zainstalowana w systemie.Jeśli wersja zestawu, który jest wymieniony w manifeście aplikacji jest określony w pliku zasad, moduł ładujący szuka wersji tego zestawu, określonego w manifeście w folderze %WINDIR%\WinSxS\ i jeśli ta wersja nie jest zainstalowany, obciążenia nie powiedzie się.A jeśli nie zainstalowano wersji zestawu 2.0.20121.0, obciążenia kończy się niepowodzeniem dla aplikacji, z prośbą o podanie wersji zestawu 2.0.10000.0.

Jednakże zgromadzenie, można również zainstalować jako zestaw prywatny side-by-side w w folderze zainstalowanej aplikacji.Jeśli system operacyjny nie może odnaleźć zestawu jako zestawie współużytkowanym, szuka go jako zestaw prywatny, w następującej kolejności:

  1. Sprawdź folder aplikacji dla pliku manifestu, który ma manifest nazwę <assemblyName>.W tym przykładzie moduł ładujący próbuje znaleźć Fabrikam.SxS.Library.manifest w folderze, który zawiera appl.exe.Jeśli zostaną znalezione manifest, moduł ładujący ładuje zgromadzenie z folderu aplikacji.Jeżeli Zgromadzenie nie zostanie znaleziony, obciążenia nie powiedzie się.

  2. Spróbuj otworzyć \ <assemblyName> \ folder w folderze, który zawiera appl.exe, a jeśli \ <assemblyName> \ istnieje, spróbuj załadować pliku manifestu, który ma manifest nazwa <assemblyName> z tego folderu.Jeśli manifest zostanie znaleziony, moduł ładujący ładuje wirtualny plik dziennika z \ <assemblyName> \ folderu.Jeżeli Zgromadzenie nie zostanie znaleziony, obciążenia nie powiedzie się.

Aby uzyskać więcej informacji na temat jak moduł ładujący wyszukuje zależne zestawy zobacz Kolejności wyszukiwania montażu.Jeśli moduł ładujący nie można odnaleźć zestawu zależnego jako zestaw prywatny, obciążenia kończy się niepowodzeniem i wyświetlany jest komunikat "system nie może wykonać określonego programu".Aby rozwiązać ten problem, upewnij się, że zależne zestawy — i biblioteki DLL, które są nieodłączną częścią — są zainstalowane na komputerze jako prywatne lub współużytkowane zestawy.

Zobacz też

Koncepcje

Pojęcia dotyczące aplikacji izolowanych i zestawów Side-by-side

Inne zasoby

Budowanie c i C++ odizolowane aplikacje i zespoły Side-by-side