Pregunta

Desde el VS 2005, veo que no es posible simplemente generar una dll en contra de MS de tiempo de ejecución y de implementar juntos (http://www.ddj.com/windows/184406482).Estoy profundamente confundido por manifestar, SxS y co:Documentación de MSDN es realmente pobre, con referencias circulares;especialmente desde que yo soy más de Unix chico, me parece de poca información.Mi problema principal es el de vincular un archivo dll contra msvc9 o msvc8:desde los tiempo de ejecución no son redistribuibles, ¿cuáles son los pasos para vincular e implementar un archivo dll ?En particular, ¿cómo se manifiesta generado (no quiero mt.exe quiero algo que es portable a través de los compiladores), cómo están incrustados, se utiliza ?Lo hace al Lado de montaje decir ?

Básicamente, en donde se puede encontrar cualquier tipo de especificación en lugar de MS jerga ?

Gracias a todos los que respondieron, esto fue realmente útil,

¿Fue útil?

Solución

Utilizamos un simple archivo de incluir en todas nuestras aplicaciones y de DLL, vcmanifest.h, entonces el conjunto de todos los proyectos incrustado en el archivo de manifiesto.

vcmanifest.h

/*----------------------------------------------------------------------------*/

#if _MSC_VER >= 1400

/*----------------------------------------------------------------------------*/

#pragma message ( "Setting up manifest..." )

/*----------------------------------------------------------------------------*/

#ifndef _CRT_ASSEMBLY_VERSION
#include <crtassem.h>
#endif 

/*----------------------------------------------------------------------------*/

#ifdef WIN64
    #pragma message ( "processorArchitecture=amd64" )
    #define MF_PROCESSORARCHITECTURE "amd64"
#else
    #pragma message ( "processorArchitecture=x86" )
    #define MF_PROCESSORARCHITECTURE "x86"
#endif 

/*----------------------------------------------------------------------------*/

#pragma message ( "Microsoft.Windows.Common-Controls=6.0.0.0") 
#pragma comment ( linker,"/manifestdependency:\"type='win32' " \
                  "name='Microsoft.Windows.Common-Controls' " \
                  "version='6.0.0.0' " \
                  "processorArchitecture='" MF_PROCESSORARCHITECTURE "' " \
                  "publicKeyToken='6595b64144ccf1df'\"" )

/*----------------------------------------------------------------------------*/

#ifdef _DEBUG
    #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT=" _CRT_ASSEMBLY_VERSION ) 
    #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
            "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT' "         \
            "version='" _CRT_ASSEMBLY_VERSION "' "                          \
            "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
            "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#else
    #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT=" _CRT_ASSEMBLY_VERSION ) 
    #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
            "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' "              \
            "version='" _CRT_ASSEMBLY_VERSION "' "                          \
            "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
            "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
#endif

/*----------------------------------------------------------------------------*/

#ifdef _MFC_ASSEMBLY_VERSION
    #ifdef _DEBUG
        #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC=" _CRT_ASSEMBLY_VERSION ) 
        #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
                "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' "              \
                "version='" _MFC_ASSEMBLY_VERSION "' "                          \
                "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
                "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
    #else
        #pragma message ( __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC=" _CRT_ASSEMBLY_VERSION ) 
        #pragma comment(linker,"/manifestdependency:\"type='win32' "            \
                "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".MFC' "              \
                "version='" _MFC_ASSEMBLY_VERSION "' "                          \
                "processorArchitecture='" MF_PROCESSORARCHITECTURE "' "         \
                "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")
    #endif
#endif /* _MFC_ASSEMBLY_VERSION */

/*----------------------------------------------------------------------------*/

#endif /* _MSC_VER */

/*----------------------------------------------------------------------------*/

Otros consejos

La cosa más simple de hacer:Suponiendo una instalación predeterminada de VS2005, usted tendrá una ruta de acceso como:

C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT

Vaya, se seleccionan los archivos en esta carpeta redist, y el lugar .manifiesto Y la msvcr80.dll (Al menos) en sus aplicaciones .exe de la carpeta.Estos archivos, presente en la raíz de su instalación, se debe habilitar el exe y todos los dll vinculadas a ellos, para funcionar perfectamente sin recurrir a la combinación de módulos, Msi o incluso cualquier tipo de just-in-time detección de que el tiempo de ejecución no está instalado.

Aquí está la entrada en el blog explicando el racional detrás de la SxS crt decisión para VC++.Incluye explicando lo mal que está estáticamente enlace de la crt, y por qué no deberías hacer eso.

Aquí está el documentación sobre cómo enlazar estáticamente el crt.

Bien, me he encontrado con algunos de estos problemas, así que tal vez algunos de mis comentarios serán de gran ayuda.

  1. El manifiesto es un archivo xml.Mientras que la VS puede y va a hacer una para usted cuando se compila, la otra solución es generar un archivo de recursos (.rc) y se compila en un archivo de recursos compilado (.res), utilizando el compilador de recursos (rc.exe se incluye en VS.Usted desea ejecutar el VS de la línea de comandos desde el menú de herramientas, lo que hará rc a estar en la ruta, así como la creación de diversas variables ambientales correctamente.Luego de compilar el recurso.La resultante .res archivo puede ser utilizado por otros compiladores.
  2. Asegúrese de que el archivo de manifiesto xml tamaño del archivo es divisible por 4.Agregar espacios en blanco en el medio para lograr este si es necesario.Tratar de evitar que cualquiera de los caracteres antes de la inauguración de la etiqueta xml o después del cierre de la etiqueta xml.A veces he tenido problemas con esto.Si el paso 2 de forma incorrecta, esperan obtener de lado los errores de configuración.Usted puede comprobar si ese es tu error por el openning el exe en un editor de recursos (por ejemplo,devenv.exe) y examinar el manifiesto de los recursos.También se puede ver un ejemplo de una correcta manifiesto por la apertura de un construido archivo, aunque tenga en cuenta que los archivos dll y exe tener pequeñas diferencias en lo que la identificación de los recursos debe ser dado.

Usted probablemente querrá prueba en la Vista para asegurarse de que está funcionando correctamente.

Ellos son redistribuibles y tiene paquetes redistribuibles dentro de msvs directorio.

Construir con el tiempo de ejecución de su elección, añadir el paquete correspondiente a su instalador y no te molestes - se va a trabajar.La diferencia es que son instalado en un lugar diferente ahora (pero eso es también que su aplicación va a buscar bibliotecas).

De lo contrario, de MSDN o básicamente cualquier no-demasiado-libros antiguos en windows de programación c++.

Gracias por la respuesta.Para la implementación de por sí, puedo ver 3 opciones y, a continuación:

  • El uso de .msi combinación de la directiva.
  • El uso de los redistribuibles VS paquete y ejecutarlo antes de que mi propio instalador
  • Copia el redistribuible los archivos a lo largo de mi propia aplicación.Pero en este caso, ¿cómo puedo hacer referencia a ella en una jerarquía de sistema de archivos (por decir bar/foo1/foo1.dll y bar/foo2/foo2.dll consulte msvcr90.dll en la barra/) ?Quiero decir aparte de lo obvio y lo feo "copiar la dll en cada directorio donde tienes dll que depende de ella).

Usted no puede usar el VC++8 SP1/9 CRT como un módulo de combinación en windows Vista y windows Server 2008 si usted tiene los servicios que usted desee iniciar o programas para los que desea ejecutar antes de la "InstallFinalize" la acción en el MSI.

Esto es debido a que el dll se instalan en WinSXS en el "InstallFinalize" de acción.

Pero la MSI "ServiceStart" acción precede a este.

Para utilizar una aplicación de arranque "http://www.davidguyer.us/bmg/publish.htm"

O buscar en usar el instalador de chainging en el installer 4.5.Pero esto significa que usted necesita un arranque para instalar 4.5 por lo que parece un poco inútil..

Si usted tiene la intención de implementar Microsoft los archivos Dll.archivos de manifiesto y los están utilizando Java JNI entonces usted tendrá que poner en el directorio bin de su JDK/JRE.

Si está ejecutando la aplicación en JBoss, entonces usted tendrá que poner en el JBoss/bin.

Usted puede poner su JNI DLL donde apropiado para su aplicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top