Udostępnij za pośrednictwem


Rozwiązywanie problemów związanych z aplikacjami izolowanymi C/C++ oraz aplikacjami wykonywanymi równocześnie

Ładowanie aplikacji C/C++ może zakończyć się niepowodzeniem, jeśli nie można odnaleźć biblioteki zależnych.W tym artykule opisano prawdopodobne przyczyny niepowodzenia aplikację C/C++ załadować, i sugeruje czynności, aby rozwiązać problemy.

Jeśli aplikacja nie może załadować, ponieważ ma on manifestu, który określa zależność od zestawu funkcji side-by-side i zestaw nie jest zainstalowany jako zestaw prywatny, w tym samym folderze co plik wykonywalny, ani 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 nieprawidłowa.Ponowne zainstalowanie aplikacji może rozwiązać ten problem.

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

Jeśli aplikacja ma nie manifestu i zależy od pliku DLL systemu Windows nie można znaleźć w lokalizacji typowe wyszukiwania, mogą być wyświetlane komunikat o błędzie podobny do tego:

  • Ta aplikacja nie udało się uruchomić, ponieważ wymaganej biblioteki DLL nie można odnaleźć.Ponowne zainstalowanie aplikacji może rozwiązać ten problem.

Jeśli wdrażaniu aplikacji na komputerze, na którym nie zainstalowano oprogramowania Visual Studio i uległa awarii z komunikaty o błędach podobne poprzednie, sprawdź następujące elementy:

  1. Wykonaj czynności opisane w Opis zależności aplikacji Visual C++.Walkera zależności wyświetlić zależności większości aplikacji lub biblioteki DLL.Jeśli brakuje niektórych bibliotek DLL wartości, należy je zainstalować na komputerze, na którym próbujesz uruchomić aplikację.

  2. Moduł ładujący systemu operacyjnego używa manifest aplikacji można załadować zestawów, które zależy od aplikacji.Manifest mogą być osadzone w pliku binarnego jako zasób lub zainstalowany w oddzielnym pliku w folderze aplikacji.Aby sprawdzić, czy manifestu jest osadzony w pliku binarnego, otwórz binary w Visual Studio i wyszukać RT_MANIFEST w jego listy zasobów.Jeśli nie można odnaleźć osadzonych manifestu, Szukaj w folderze aplikacji dla pliku, które zostało nazwana jak < binary_name >. < rozszerzenie > manifest.

  3. Aplikacja jest zależna od zestawy side-by-side i manifestu nie jest obecny, należy upewnić się, że program łączący generuje manifestu dla projektu.Zaznacz opcję łączenie manifestu Generuj w Właściwości projektu okno dialogowe dla projektu.

  4. Manifest jest osadzony w pliku binarnego, upewnij się, że identyfikator RT_MANIFEST jest prawidłowa dla tego typu pliku binarnego.Aby uzyskać więcej informacji o identyfikator zasobu, z którym do użycia, zobacz Using Side-by-Side zestawów jako zasób (z Windows).Jeśli w oddzielnym pliku manifestu, otwórz go w edytorze XML lub edytora tekstu.Aby uzyskać więcej informacji na temat manifestów i reguł do użycia we wdrożeniach, zobacz manifesty.

    [!UWAGA]

    Jeśli istnieją zarówno manifest osadzonych i oddzielnym pliku manifestu, moduł ładujący systemu operacyjnego używa osadzonych manifestu i ignoruje w oddzielnym pliku.Jednak w systemie Windows XP odwrotny ma wartość true, jest używany w oddzielnym pliku manifestu i osadzonych manifestu jest ignorowana.

  5. Zalecamy osadzić manifestu w każdym DLL, ponieważ zewnętrzne manifesty są ignorowane podczas ładowania biblioteki DLL trudne LoadLibrary wywołania.Aby uzyskać więcej informacji, zobacz manifesty zestawu.

  6. Sprawdź, czy wszystkie zestawów, które są wymienione w manifeście są poprawnie zainstalowane na komputerze.Każdy zestaw została określona w manifeście przy jego nazwie, numerze wersji i architektura procesora.Jeśli aplikacja jest zależna od zestawy side-by-side, sprawdź, czy te zestawy są poprawnie zainstalowane na komputerze, tak aby moduł ładujący systemu operacyjnego można znaleźć, zgodnie z opisem w sekwencji wyszukiwania w zestawie.Należy pamiętać, że zestawy 64-bitowe nie można załadować w procesach 32-bitowych i nie można wykonać na 32-bitowe systemy operacyjne.

Przykład

Założyć zostały aplikacji, appl.exe, który jest utworzony przy użyciu Visual C++.Manifest aplikacji albo osadzonego w appl.exe jako zasobu RT_MANIFEST, który ma identyfikator równy 1 lub są przechowywane jako appl.exe.manifest w oddzielnym pliku binarnego.Zawartość tego manifestu jest 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>

Do modułu ładującego system operacyjny manifestu tego mówi, że appl.exe zależy od zestawu o nazwie Fabrikam.SxS.Library, 2.0.20121.0, wersji, który jest przeznaczony dla procesorów x 86 32-bitowy architektura procesora.Jako udostępnionego zestawu lub zestaw prywatny można zainstalować zestawu zależnego side-by-side.

Manifest zestawu dla udostępnionego zestawu jest zainstalowany w folderze %WINDIR%\WinSxS\Manifests\.Określa zestaw i wyświetla jego zawartość — oznacza to, że pliki dll wchodzące w skład 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>

Zestawy Side-by-side można także użyć plików konfiguracyjnych Wydawca— nazywany również pliki zasad — globalny przekierowywania aplikacji i zestawy, aby korzystać z jednej wersji zestawu side-by-side zamiast innej wersji tego samego zestawu funkcji.Można sprawdzić zasady dla udostępnionego zestawu w folderze %WINDIR%\WinSxS\Policies\.Oto przykład plik zasady:

<?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 zestawu, który pyta, czy dla tego zestawu wersji 2.0.10000.0 należy zamiast tego używać wersji 2.0.20121.0, co jest bieżącej wersji, który jest zainstalowany w systemie.Jeśli wersja zestawu, który jest wymieniony w manifeście aplikacji jest określona w pliku zasad, moduł ładujący sprawdza wersję tego zestawu, który jest określony w manifeście w folderze %WINDIR%\WinSxS\, a ta wersja nie jest zainstalowany, ładowanie nie powiodło się.A jeśli nie jest zainstalowana wersja zestawu 2.0.20121.0, ładowanie nie powiodło się dla aplikacji, które poprosić o wersji zestawu 2.0.10000.0.

Jednak zestawu można również zainstalować jako prywatnych zestawu side-by-side w folderze zainstalowanych aplikacji.Jeśli system operacyjny nie można odnaleźć zestawu jako udostępnionego zestawu, szuka go jako zestaw prywatny, w następującej kolejności:

  1. Sprawdź folder aplikacji dla pliku manifestu, który zawiera manifest nazwa < assemblyName >.W tym przykładzie moduł ładujący próbuje odnaleźć Fabrikam.SxS.Library.manifest w folderze, który zawiera appl.exe.Jeśli zostaną znalezione manifestu, moduł ładujący ładuje zestawu w folderze aplikacji.Zestaw nie zostanie znaleziony, ładowanie nie powiodło się.

  2. Spróbuj otworzyć \ < assemblyName > \ folderu w folderze, który zawiera appl.exe, i jeśli \ < assemblyName > \ istnieje, spróbuj załadować pliku manifestu, który zawiera manifest nazwa < assemblyName > z tego folderu.W przypadku znalezienia manifestu moduł ładujący ładuje zestaw z \ < assemblyName > \ folderu.Zestaw nie zostanie znaleziony, ładowanie nie powiodło się.

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

Zobacz też

Koncepcje

Pojęcia związane z aplikacjami izolowanymi oraz aplikacjami wykonywanymi równocześnie

Inne zasoby

Kompilowanie aplikacji izolowanych C/C++ oraz aplikacji wykonywanych równocześnie