tag online mp3tag mp3meta mp3id windows dll manifest sxs

online - Construyendo y desplegando dll en windows: SxS, manifiestos y todo ese jazz



tag rename (8)

Desde VS 2005, veo que no es posible simplemente construir un dll contra el tiempo de ejecución de MS e implementarlos juntos ( http://www.ddj.com/windows/184406482 ). Estoy profundamente confundido por manifiesto, SxS y co: la documentación de MSDN es realmente pobre, con referencias circulares; especialmente porque soy más un tipo de Unix, encuentro que todos son poco informativos. Mi problema principal es vincular un dll con msvc9 o msvc8: dado que esos tiempos de ejecución no son redistribuibles, ¿cuáles son los pasos para vincular e implementar dicho dll? En particular, ¿cómo se genera el manifiesto (no quiero mt.exe, quiero algo que sea portátil entre los compiladores), cómo se integran, se usan? ¿Qué significa ensamblaje lado a lado?

Básicamente, ¿dónde puedo encontrar algún tipo de especificación en lugar de MS jerga?

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


No puede usar el VC ++ 8 SP1 / 9 CRT como un módulo de combinación en Vista y Windows Server 2008 si tiene servicios que desea iniciar o programas que desea ejecutar antes de la acción "Instalar Finalizar" en el MSI.

Esto se debe a que los dlls están instalados en WinSXS en la acción "InstallFinalize".

Pero la acción MSI "ServiceStart" viene antes de esto.

Así que use un programa de arranque " http://www.davidguyer.us/bmg/publish.htm "

O busque usar el instalador encadenado en el instalador 4.5. Pero esto significa que necesitas un bootstrapper para instalar 4.5, por lo que parece un poco inútil.



Gracias por la respuesta. Para el despliegue per se, puedo ver 3 opciones, luego:

  • Usando la directiva de fusión .msi.
  • Usar el paquete VS redistribuible y ejecutarlo antes de mi propio instalador
  • Copiando los archivos redistribuibles a lo largo de mi propia aplicación. Pero en este caso, ¿cómo me refiero a él en una jerarquía del sistema de archivos (por ejemplo, bar / foo1 / foo1.dll y bar / foo2 / foo2.dll consulte msvcr90.dll en la barra /)? Quiero decir, además de lo obvio y lo feo "copie el dll en cada directorio donde tenga dll que depende de él".

Son redistribuibles y tienes paquetes redistribuibles dentro del directorio msvs.

Crea con el tiempo de ejecución que elijas, agrega el paquete correspondiente a tu instalador y no te molestes, funcionará. La diferencia es que ahora están instalados en un lugar diferente (pero también es allí donde su aplicación buscará bibliotecas).

De lo contrario, MSDN o, básicamente, cualquier libro no muy viejo en la programación de Windows C ++.


Usamos un archivo de inclusión simple en todas nuestras aplicaciones y DLL, vcmanifest.h, luego configuramos todos los proyectos para incrustar 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 */ /*----------------------------------------------------------------------------*/


Lo más simple que puede hacer: suponiendo una instalación predeterminada de VS2005, tendrá una ruta como:

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

Ve, toma los archivos en esta carpeta de redistas y coloca el .manifest Y el msvcr80.dll (Por lo menos) en tu carpeta de aplicaciones .exe. Estos archivos, presentes en la raíz de su instalación, deberían permitir que su exe y todos los dlls vinculados con ellos funcionen perfectamente sin recurrir a módulos de fusión, MSI o ningún tipo de detección justo a tiempo de que el tiempo de ejecución no esté instalado.


Si tiene la intención de implementar los archivos DLL / .manifest de Microsoft y está utilizando Java JNI, deberá colocarlos en el directorio bin de su JDK / JRE.

Si está ejecutando la aplicación en JBoss, deberá colocarla en el directorio JBoss / bin.

Puede poner su JNI DLL donde corresponda para su aplicación.


Bueno, me he encontrado con algunos de estos problemas, por lo que tal vez algunos de mis comentarios serán útiles.

  1. El manifiesto es un archivo xml. Si bien VS puede y hará uno para usted cuando compila, la otra solución es producir un archivo de recursos (.rc) y compilarlo en un archivo de recursos compilados (.res) utilizando el compilador de recursos (rc.exe) incluido con VS . Deberá ejecutar la línea de comandos de VS desde el menú de herramientas, lo que hará que rc esté en la ruta, así como también establecer varias variables de entorno correctamente. Luego compila tu recurso. El archivo .res resultante puede ser utilizado por otros compiladores.
  2. Asegúrese de que el tamaño del archivo xml de manifiesto sea divisible entre 4. Agregue espacios en blanco en el medio para lograr esto si es necesario. Intente evitar tener caracteres antes de abrir la etiqueta xml o después de cerrar la etiqueta xml. A veces he tenido problemas con esto. Si realiza el paso 2 incorrectamente, espere obtener errores de configuración lado a lado. Puede verificar si ese es su error al abrir el exe en un editor de recursos (por ejemplo, devenv.exe) y examinar el recurso de manifiesto. También puede ver un ejemplo de un manifiesto correcto simplemente abriendo un archivo creado, aunque tenga en cuenta que los archivos DLL y EXC tienen pequeñas diferencias en la identificación del recurso que se debe proporcionar.

Probablemente quieras probar en Vista para asegurarte de que esto funcione correctamente.