Risoluzione dei problemi relativi alle applicazioni isolate C/C++ e agli assembly side-by-side

L'applicazione C/C++ /C ++ di carico può non riuscire se le librerie dipendenti non sono disponibili.Questo articolo descrive diversi motivi per cui comuni l'applicazione C/C++ /C c++ non viene caricato e le operazioni necessarie per la risoluzione dei problemi.

Se un'applicazione non viene caricato in quanto ha un manifesto che specifica una dipendenza da un assembly side-by-side e l'assembly non viene installata come assembly privato nella stessa cartella dell'eseguibile né nell'Assembly Cache nativo in %WINDIR% \ WinSxS \, uno dei seguenti messaggi di errore potrebbe essere visualizzata, a seconda della versione di Windows in cui si tenta di eseguire l'applicazione.

  • L'applicazione non è riuscito a inizializzare correttamente (0xc0000135).

  • Avvio non riuscito dell'applicazione perché la configurazione non è corretta.Provare a reinstallare l'applicazione per risolvere il problema.

  • Il sistema non può eseguire il programma specificato.

Se l'applicazione non ha manifesto e dipende da una DLL che risulta impossibile trovare in percorsi di ricerca tipiche, un messaggio di errore simile a questo potrebbe essere visualizzato:

  • Questa applicazione non è riuscito a cominciare perché una DLL obbligatoria non è stato trovato.Il problema potrebbe essere risolto reinstallando l'applicazione.

Se l'applicazione viene distribuita in un computer che non dispone di Visual Studio e si blocca con i messaggi di errore simili ai precedenti, controllare queste operazioni:

  1. Seguire i passaggi descritti in Utilizzo di dipendenze di un'applicazione Visual C++.Tramite dependency walker è possibile visualizzare le dipendenze per un'applicazione o una DLL.Se la dichiarazione che alcune DLL risultano mancanti, installarli nel computer in cui si sta tentando di eseguire l'applicazione.

  2. Il caricatore del sistema operativo utilizza il manifesto di applicazione affinché carichi gli assembly da cui dipende.Il manifesto può essere incorporato nel binario come risorsa, oppure installato come file separato nella cartella dell'applicazione.Per controllare se il manifesto è incorporato nel binario, aprire il file binario in Visual Studio e cercare RT_MANIFEST nel proprio elenco di risorse.Se non è possibile trovare un manifesto incorporato, aspetto nella cartella applicazione per un file denominato simile a <binary_name>.<extension>manifest.

  3. Se l'applicazione dipende da assembly side-by-side e un manifesto non è presente, è necessario assicurarsi che il linker genera un manifesto per il progetto.Selezionare l'opzione del linker Genera manifesto nella finestra di dialogo Proprietà progetto per il progetto.

  4. Se il manifesto è incorporato nel binario, assicurarsi che l'id di RT_MANIFEST sia corretto questo tipo di file binario.Per ulteriori informazioni sull'ID di risorsa da utilizzare, vedere Utilizzo di assembly side-by-side come risorsa (windows).Se il manifesto è in un file separato, aprirlo in un editor XML o in un editor di testo.Per ulteriori informazioni sui manifesti e sulle regole di distribuzione, vedere Manifesti.

    [!NOTA]

    Se è un manifesto incorporato che un file manifesto separato sono presenti, il caricatore del sistema operativo utilizza il manifesto incorporato e ignora il file distinto.Tuttavia, in Windows XP, l'opposto è True (che il file manifesto separato viene utilizzato e il manifesto incorporato viene ignorato.

  5. È consigliabile incorporare un manifesto in ogni DLL poiché i manifesti esterni vengono ignorati quando una DLL viene caricata tramite una chiamata di LoadLibrary.Per ulteriori informazioni, vedere manifesti dell'assembly.

  6. Verificare che tutti gli assembly che vengono enumerati nel manifesto siano installati correttamente nel computer.Ogni assembly viene specificato nel manifesto dal nome, il numero di versione e l'architettura del processore.Se l'applicazione dipende da assembly side-by-side, verificare che tali assembly siano installati correttamente nel computer in modo da poter trovare il caricatore del sistema operativo, come descritto in Assembly Searching Sequence.Si ricordi che gli assembly a 64 bit non possono essere caricati in processi a 32 bit e non possono essere eseguiti in sistemi operativi a 32 bit.

Esempio

Si presupponga di disporre di un'applicazione, appl.exe, compilato utilizzando Visual C++.Il manifesto di applicazione o è incorporato in appl.exe come risorsa binaria RT_MANIFEST, con un ID uguale a 1, o archiviato come file separato appl.exe.manifest.Il contenuto del manifesto è analogo al seguente:

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

Il caricatore del sistema operativo, questo manifesto indica che appl.exe dipende da un assembly denominato Fabrikam.SxS.Library, la versione 2.0.20121.0, compilata per l'architettura del processore x86 a 32 bit.L'assembly side-by-side dipendente può essere installato come assembly condiviso o come assembly privato.

Il manifesto di un assembly condiviso è installato in %WINDIR% \ WinSxS \ manifests \.Identifica l'assembly e riporta il suo contenuto che è, le DLL che fanno parte dell'assembly:

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

Gli assembly side-by-side possono inoltre utilizzare file di configurazione dell'editore(anche noto come criteri per un reindirizzamento a livello globale le applicazioni e gli assembly utilizzare una versione di un assembly side-by-side anziché un'altra versione dello stesso assembly.È possibile controllare i criteri per un assembly condiviso in %WINDIR% \ WinSxS \ policies \.Di seguito è riportato un file di criteri di esempio:

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

Questo file di criteri specifica che qualsiasi applicazione o assembly che richiede la versione 2.0.10000.0 di questo assembly deve utilizzare invece la versione 2.0.20121.0, ovvero la versione attualmente installata nel sistema.Se una versione di assembly che viene specificato nel manifesto di applicazione è specificata nel file di criteri, il caricatore cercherà una versione di questo assembly specificato nel manifesto in %WINDIR% \ WinSxS \ e se tale versione non è installata, il caricamento avrà esito negativo.E la versione 2.0.20121.0 dell'assembly non è installato, il caricamento avrà esito negativo per le applicazioni che richiedono una versione 2.0.10000.0 dell'assembly.

Tuttavia, l'assembly può anche essere installato come assembly side-by-side privato nella cartella installata di applicazione.Se l'esito negativo del sistema operativo per individuare l'assembly come assembly condiviso, la ricerca come assembly privato, nell'ordine seguente:

  1. Selezionare la cartella applicazione per un file manifesto con il nome <assemblyName>manifest.In questo esempio, il caricatore tenta di trovare Fabrikam.SxS.Library.manifest nella cartella contenente appl.exe.Se il manifesto viene trovato, il caricatore caricherà l'assembly dalla cartella dell'applicazione.Se l'assembly non viene trovato, il caricamento avrà esito negativo.

  2. Si tenta di aprire la cartella \<assemblyName>\ nella cartella contenente appl.exe e se \<assemblyName>\ esiste, tentare di caricare un file manifesto con il nome <assemblyName>.manifest da questa cartella.Se il manifesto viene trovato, il caricatore caricherà l'assembly dalla cartella \<assemblyName>\.Se l'assembly non viene trovato, il caricamento avrà esito negativo.

Per ulteriori informazioni sulle modalità di ricerca degli assembly dipendenti, vedere Assembly Searching Sequence.Se il caricatore non è in grado di trovare un assembly dipendenti come assembly privato, il caricamento avrà esito negativo e il messaggio "impossibile eseguire il programma specificato" visualizzare.Per correggere l'errore, assicurarsi che il dipendente assembly e le DLL di cui fa parte associate sono installati nel computer come assembly privati o condivisi.

Vedere anche

Concetti

Concetti di applicazioni isolate e assembly side-by-side

Altre risorse

Compilazione di applicazioni isolate C/C++ e di assembly side-by-side