Freigeben über


Problembehandlung bei isolierten Anwendungen und parallelen Assemblys (C/C++)

Anwendung Ladenwechselstroms /C ++ kann fehlschlagen, wenn abhängige Bibliotheken nicht gefunden werden können.In diesem Artikel werden einige häufige Gründe, warum C/C++-Anwendungen /C ++ nicht geladen werden kann, und schlägt Schritte vor, um die Probleme zu beheben.

Wenn eine Anwendung nicht geladen werden kann, da sie ein Manifest, das eine Abhängigkeit von einer parallelen Assembly und die Assembly angibt, wird installiert nicht als private Assembly im gleichen Ordner wie die ausführbare Datei noch im systemeigenen Assemblycache im Ordner %WINDIR%\WinSxS\ verfügt, wird eine der folgenden Fehlermeldungen, abhängig von der Version von Windows möglicherweise angezeigt, auf der Sie versuchen, die Anwendung auszuführen.

  • Die Anwendung konnte nicht ordnungsgemäß initialisieren (0xc0000135).

  • Diese Anwendung konnte aufgrund einer falschen Anwendungskonfiguration nicht gestartet werden.Durch erneutes Installieren der Anwendung kann das Problem möglicherweise behoben werden.

  • Das System kann das angegebene Programm nicht ausführen.

Wenn die Anwendung kein Manifest verfügt und aus einer DLL abhängig, das Windows nicht in typischen Suchenspeicherorten finden kann, wird eine Fehlermeldung, die ähnelt, diese angezeigt:

  • Diese Anwendung konnte nicht gestartet werden, da eine erforderliche DLL nicht gefunden wurde.Neuinstallation der Anwendung könnte das Problem beheben.

Wenn die Anwendung auf einem Computer, der nicht Visual Studio hat und dieser abstürzt mit Fehlermeldungen bereitgestellt wird, die die vorherigen ähneln, überprüfen Sie diese Vorgänge:

  1. Führen Sie die Schritte, die in Abhängigkeiten einer Visual C++-Anwendung beschrieben werden.Der Dependency Walker zeigt den größten Teil die meisten Abhängigkeiten für eine Anwendung oder ein DLL an.Wenn Sie beobachten, dass einige DLLs fehlen, installieren Sie sie auf dem Computer, auf dem Sie versuchen, die Anwendung auszuführen.

  2. Das Ladeprogramm des Betriebssystems verwendet das Anwendungsmanifest, um Assemblys zu laden, von denen die Anwendung abhängt.Das Manifest kann entweder in der Binärdatei als Ressource eingebettet werden, oder als separate Datei im Anwendungsordner installiert werden.Um sicherzustellen dass das Manifest in die Binärdatei eingebettet ist, öffnen Sie die Binärdatei in Visual Studio und suchen Sie nach RT_MANIFEST in der Liste von Ressourcen.Wenn Sie ein eingebettetes Manifest finden können, suchen Sie im Anwendungsordner nach einer Datei, die in etwa <binary_name>genannt wird.<extension>.manifest.

  3. Wenn die Anwendung von parallelen Assemblys abhängig ist und kein Manifest vorhanden ist, müssen Sie sicherstellen, dass der Linker ein Manifest für das Projekt generiert.Überprüfen Sie die Linkeroption Manifest generierenProjekteigenschaften im Dialogfeld für das Projekt.

  4. Wenn das Manifest in die Binärdatei eingebettet ist, stellen Sie sicher, dass die ID von RT_MANIFEST für diesen Typ der Binärdatei korrekt ist.Weitere Informationen darüber, welche zu verwenden, das Ressourcen-ID finden Verwenden der parallelen Assembly als Ressource (Windows).Wenn das Manifest in einer separaten Datei befindet, öffnen Sie es in einem XML-Editor oder einem Texteditor.Weitere Informationen zu Manifesten und Regeln für Bereitstellung, finden Sie unter Manifeste.

    HinweisHinweis

    Wenn ein eingebettetes Manifest und eine separate Manifestdatei vorhanden sind, verwendet das Ladeprogramm des Betriebssystems das eingebettete Manifest und ignoriert die separate Datei.Unter Windows XP, ist das Gegenteil TRUE-d, das separate Manifestdatei verwendet wird und das eingebettete Manifest ignoriert.

  5. Es empfiehlt sich, ein Manifest in jedem DLL einbetten, da externe Manifeste ignoriert werden, wenn eine DLL über ein LoadLibrary Aufruf geladen wird.Weitere Informationen dazu finden Sie unter Assemblymanifeste.

  6. Überprüfen Sie, ob alle Assemblys, die im Manifest aufgelistet werden, ordnungsgemäß auf dem Computer installiert sind.Jede Assembly wird im Manifest der ihren Namen, die Versionsnummer und die Prozessorarchitektur angegeben.Wenn die Anwendung von parallelen Assemblys abhängig ist, stellen Sie sicher, dass diese Assemblys ordnungsgemäß auf dem Computer, damit das Ladeprogramm des Betriebssystems diese finden kann, wie in Assembly, die Sequenz sucht beschrieben installiert werden.Denken Sie daran, dass 64-Bit-Assemblys nicht in 32-Bit-Prozessen geladen und unter 32-Bit-Betriebssystemen nicht ausgeführt werden können.

Beispiel

Angenommen, wird eine Anwendung appl.exe, haben, das erstellt wird, indem Visual C++ verwendet.Das Anwendungsmanifest wird entweder in appl.exe als Binärressource RT_MANIFEST eingebettet, die eine ID gleich 1 verfügt, oder wird als die separate Datei appl.exe.manifest gespeichert.Der Inhalt des Manifests sieht folgendermaßen aus:

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

Das Ladeprogramm des Betriebssystems dieses Manifest, dass appl.exe von einer Assembly abhängt, die Fabrikam.SxS.Library, Version 2.0.20121.0 genannt wird, die für eine 32-Bit-Version --x86-Prozessorarchitektur erstellt wird.Die abhängige parallele Assembly kann entweder als freigegebene Assembly oder als private Assembly installiert werden.

Das Assemblymanifest für eine freigegebene Assembly wird im Ordner %WINDIR%\WinSxS\Manifests\ installiert.Es identifiziert die Assembly und wird sein, Das heißt, die DLL auf, das Teil der Assemblys sind:

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

Parallele Assemblys können Herausgeberkonfigurationsdateien auch - auch bekannt als Richtlinie Datei-global zu den Umleitungs-Anwendungen und Assemblys, eine Version einer parallelen Assembly anstelle einer anderen Version derselben Assembly verwenden.Sie können die Richtlinien für eine freigegebene Assembly im Ordner %WINDIR%\WinSxS\Policies\ überprüfen.Hier ist eine Beispielsrichtliniendatei:

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

Diese Richtliniendatei gibt an, dass jede Anwendung oder Assembly, die Version 2.0.10000.0 dieser Assembly anfordert, Version 2.0.20121.0 stattdessen verwenden sollten, die die aktuelle Version ist, die auf dem System installiert ist.Wenn eine Version der Assembly, die im Anwendungsmanifest enthalten ist, in der Richtliniendatei angegeben ist, sucht das Ladeprogramm nach einer Version der Assembly, die im Manifest im Ordner %WINDIR%\WinSxS\ angegeben ist, und wenn diese Version nicht installiert ist, schlägt das Laden fehl.Und wenn Assemblyversion 2.0.20121.0 nicht installiert ist, schlägt das Laden von Anwendungen aus, die die Version 2.0.10000.0 anfordern.

Die Assembly kann jedoch als private parallele Assembly im Anwendungsordner installiert auch installiert werden.Wenn das Betriebssystem die Assembly nicht als freigegebene Assembly finden kann, sucht er sie als private Assembly, in der folgenden Reihenfolge:

  1. Überprüfen Sie den Anwendungsordner für eine Manifestdatei, die den Namen <assemblyName>.manifest besitzt.In diesem Beispiel sucht das Ladeprogramm, Fabrikam.SxS.Library.manifest im Ordner zu suchen, der appl.exe enthält.Wenn es das Manifest findet, lädt das Ladeprogramm die Assembly aus dem Anwendungsordner.Wenn die Assembly nicht gefunden wird, schlägt das Laden fehl.

  2. Versuchen Sie, den Ordner \<assemblyName>\ zu öffnen, der im Ordner appl.exe enthält, und wenn\<assemblyName>\ vorhanden ist, versuchen Sie, um eine Manifestdatei zu laden, die den Namen <assemblyName>.manifest aus diesem Ordner verfügt.Wenn das Manifest gefunden wird, lädt das Ladeprogramm die Assembly von der<assemblyName>\ \.Wenn die Assembly nicht gefunden wird, schlägt das Laden fehl.

Weitere Informationen über, Ablaufs der Suche nach abhängigen Assemblys, Assembly, die Sequenz sucht finden.Wenn das Ladeprogramm eine abhängige Assembly nicht als private Assembly finden kann, Laden fehl und die Meldung ", durch das System das angegebene Programm nicht ausführen kann" wird angezeigt.Um diesen Fehler zu beheben, stellen Sie sicher Assembly- und abhängige DLL die Teil von sind auf dem Computer entweder als private oder freigegebene Assemblys installiert sie-wird.

Siehe auch

Konzepte

Konzept der isolierten Anwendungen und der parallelen Assemblys

Weitere Ressourcen

Erstellen von isolierten Anwendungen und parallelen Assemblys (C/C++)