Solucionar problemas de aplicaciones aisladas y ensamblados simultáneos de C/C++

La aplicación de C/C++. /C a partir de puede sufrir un error si no se pueden encontrar las bibliotecas.En este artículo se describe algunas de las razones comunes por las que una aplicación de C/C++. /C ++ no se carga, y sugiere pasos para resolver los problemas.

Si una aplicación no puede cargar porque tiene un manifiesto que especifica una dependencia en un ensamblado simultáneo, y el ensamblado no se instala como un ensamblado privado en la misma carpeta que el ejecutable o en la caché de ensamblados nativa en %windir%\winsxs\ folder, %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows displayed, %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows %WINDIR%\WinSxS\ folder, one of the following error messages might be displayed, depending on the version of Windows en las que intenta ejecutar la aplicación.

  • La aplicación podría no para inicializar correctamente (0xc0000135).

  • Error de inicio de la aplicación porque la configuración de la misma no es correcta.Si vuelve a instalar la aplicación puede que se corrijan los problemas.

  • El sistema no puede ejecutar el programa especificado.

Si la aplicación no tiene ningún manifiesto y depende de DLL que Windows no pueda encontrar en las ubicaciones típicas de búsqueda, un mensaje de error que se muestra aquí pueden mostrar:

  • Esta aplicación no ha podido iniciar porque DLL necesario no encontrada.La reinstalación de la aplicación puede solucionar el problema.

Si la aplicación se implementa en un equipo que no tiene Visual Studio, y se bloquea con mensajes de error impide que los anteriores, compruebe estas cosas:

  1. Siga los pasos que se describen en Introducción a las dependencias de una aplicación de Visual C++.Dependency walker puede mostrar la mayoría de las dependencias de una aplicación o DLL.Si observa que faltan algunos archivos DLL, instálelos en el equipo en el que está intentando ejecutar la aplicación.

  2. El cargador del sistema operativo utiliza el manifiesto de aplicación para cargar los ensamblados de los que depende la aplicación.El puede manifiesto está incrustado en el binario como recurso, o se instala como un archivo independiente en la carpeta de la aplicación.Para comprobar si el manifiesto está incrustado en el binario, abra el archivo binario en Visual Studio y busca RT_MANIFEST en su lista de recursos.Si no puede encontrar un manifiesto incrustado, examine la carpeta de aplicaciones para un archivo denominado algo como <binary_name>.<extension>.manifest.

  3. Si la aplicación depende de ensamblados en paralelo y un manifiesto no está presente, debe asegurarse de que el vinculador genere uno para el proyecto.Active la opción del vinculador Generar manifiesto en el cuadro de diálogo Propiedades del proyecto.

  4. Si el manifiesto está incrustado en el binario, asegúrese de que el identificador de RT_MANIFEST es correcto para este tipo binario.Para obtener más información sobre la que el Id. de recurso a utilizar, vea Mediante los ensamblados en paralelo como un recurso (Windows).Si el manifiesto está en un archivo independiente, se abre en un editor XML o editor de texto.Para obtener más información sobre los manifiestos y reglas para la implementación, vea Manifiestos.

    [!NOTA]

    Si un manifiesto incrustado y un archivo de manifiesto independiente está presente, el cargador del sistema operativo utiliza el manifiesto incrustado y omite el archivo independiente.Sin embargo, en Windows XP, se utiliza el contrario es archivo de manifiesto independiente verdadero (y se omite el manifiesto incrustado.

  5. Se recomienda inserta un manifiesto en cada DLL porque se omite el manifiesto externo cuando se carga un archivo DLL mediante una llamada a LoadLibrary.Para obtener más información, vea Manifiestos del ensamblado.

  6. Compruebe que todos los ensamblados enumerados en el manifiesto estén instalados correctamente en el equipo.El nombre, número de versión, y arquitectura de procesador cada ensamblado se especifica en el manifiesto.Si la aplicación depende de ensamblados en paralelo, compruebe que estos ensamblados estén instalados correctamente en el equipo de modo que el cargador del sistema operativo pueda encontrarlos, como se describe en Ensamblado que busca secuencia.Recuerde que los ensamblados de 64 bits no se pueden cargar en procesos de 32 bits ni ejecutarse en sistemas operativos de 32 bits.

Ejemplo

Supongamos que tenemos una aplicación, appl.exe, compilado utilizando Visual C++.La aplicación manifiestos cualquiera se inserta en appl.exe como recurso binario RT_MANIFEST, que tiene un identificador igual a 1, o se almacena como archivo independiente appl.exe.manifest.El contenido de este manifiesto se parece a lo siguiente:

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

El cargador del sistema operativo, este manifiesto expresa que appl.exe depende de un ensamblado denominado Fabrikam.SxS.Library, la versión 2.0.20121.0, que se compila para una arquitectura de procesador x86 de 32 bits.El ensamblado paralelo dependiente se puede instalar como un ensamblado compartido o como un ensamblado privado.

El manifiesto del ensamblado para un ensamblado compartido está instalado en %WINDIR%\WinSxS\Manifests \.Identifica el ensamblado y muestra su contenido- que es, los archivos DLL que forman parte del ensamblado:

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

Los ensamblados en paralelo también pueden utilizar archivos de configuración de editor(también conocido como directiva archivo (el archivo global a las aplicaciones y a ensamblados de redirección para utilizar una versión de un ensamblado simultáneo en lugar de otra del mismo ensamblado.Puede comprobar las directivas para un ensamblado compartido en %WINDIR%\WinSxS\Policies \.A continuación se muestra un archivo de directivas del ejemplo:

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

Este archivo de directivas especifica que cualquier aplicación o ensamblado que requiere la versión 2.0.10000.0 de este ensamblado debe utilizar en su lugar la versión 2.0.20121.0, que es la versión actual instalada en el sistema.Si una versión del ensamblado que se menciona en el manifiesto de aplicación se especifica en el archivo de directivas, el cargador busca una versión de este ensamblado que se especifica en el manifiesto de %WINDIR%\WinSxS \ carpeta, y si esta versión no está instalada, la carga sufre un error.Y si la versión 2.0.20121.0 del ensamblado no está instalada, la carga sufre un error en las aplicaciones que requieren la versión 2.0.10000.0 del ensamblado.

Sin embargo, el ensamblado también se puede instalar como un ensamblado en paralelo privado en la carpeta de aplicación instalada.Si el sistema operativo no encuentra el ensamblado, busca como ensamblado privado, en el orden siguiente:

  1. Compruebe la carpeta de la aplicación para un archivo de manifiesto que tiene el nombre <assemblyName>.manifest.En este ejemplo, el cargador intenta buscar Fabrikam.SxS.Library.manifest en la carpeta que contiene appl.exe.Si encuentra el manifiesto, el cargador carga el ensamblado de la aplicación.Si no encuentra el ensamblado, la carga sufre un error.

  2. Intente abrir \<assemblyName>\ carpeta en la carpeta que contiene appl.exe, y existe si \<assemblyName>\, intenta cargar un archivo de manifiesto que tiene el nombre <assemblyName>.manifest de esta carpeta.Si se encuentra el manifiesto, el cargador carga el ensamblado de \ de<assemblyName>\.Si no encuentra el ensamblado, la carga sufre un error.

Para obtener más información sobre cómo el cargador busca ensamblados dependientes, vea Ensamblado que busca secuencia.Si el cargador no encuentra un ensamblado dependiente como ensamblado privado, la carga sufre un error y se muestra el mensaje “sistema de no puede ejecutar el programa especificado”.Para resolver este error, asegúrese de que el dependiente ensamblado- y los archivos DLL de los que es parte - se instalan en el equipo como ensamblados privados o compartidos.

Vea también

Conceptos

Conceptos de aplicaciones aisladas y ensamblados simultáneos

Otros recursos

Compilar aplicaciones aisladas y ensamblados simultáneos de C/C++