Compartir a través de


Generar ensamblados simultáneos de C/C++

Actualización: noviembre 2007

Un ensamblado simultáneo es una colección de recursos (un grupo de archivos DLL, clases de ventanas, servidores COM, bibliotecas de tipos o interfaces) que puede usar una aplicación en tiempo de ejecución. En Visual C++ 2005, las bibliotecas ATL, MFC, CRT y estándar de C++ se han vuelto a empaquetar en varios ensamblados simultáneos que se pueden redistribuir con las aplicaciones de Visual C++ como ensamblados compartidos o privados. Vea Visual C++ Libraries as Shared Side-by-Side Assemblies para obtener más información. La ventaja principal de volver a empaquetar archivos DLL en ensamblados es que las aplicaciones pueden utilizar varias versiones de los ensamblados a la vez, y es posible administrar los ensamblados instalados actualmente en caso de una actualización.

Una aplicación de Visual C++ puede utilizar uno o varios archivos DLL en diferentes partes de la aplicación. En tiempo de ejecución, los archivos DLL se cargan en el proceso principal y se ejecuta el código necesario. La aplicación se basa en el sistema operativo para localizar los archivos DLL solicitados, saber qué otros archivos DLL dependientes se han de cargar y, a continuación, cargarlos junto con el archivo DLL solicitado. En las versiones de los sistemas operativos Windows anteriores a Windows XP, Windows Server 2003 y Windows Vista, el cargador del sistema operativo busca archivos DLL dependientes en la carpeta local de la aplicación o en otra carpeta especificada en la ruta de acceso del sistema. En Windows XP, Windows Server 2003 y Windows Vista, el cargador del sistema operativo también puede buscar archivos DLL dependientes mediante un archivo de manifiesto y buscar ensamblados simultáneos que contengan dichos archivos DLL.

De forma predeterminada, cuando un archivo DLL se genera con Visual Studio 2005 tiene un manifiesto de aplicación incrustado como recurso del tipo RT_MANIFEST con un identificador igual a 2. Como sucede con un archivo ejecutable, este manifiesto describe dependencias de este archivo DLL en otros ensamblados. Esto asume que el archivo DLL no forma parte de un ensamblado simultáneo y que las aplicaciones que dependen de este archivo DLL no van a utilizar un manifiesto de aplicación para cargarlo, en su lugar se basan en el cargador del sistema operativo para buscar dicho archivo DLL en la ruta de acceso del sistema.

Nota:

Es importante que un archivo DLL que utilice un manifiesto de aplicación lo tenga incrustado como recurso con un identificador igual a 2. Si el archivo DLL se carga dinámicamente en tiempo de ejecución (por ejemplo, mediante la función LoadLibrary), el cargador del sistema operativo carga los ensamblados dependientes especificados en el manifiesto del archivo DLL. Un manifiesto de aplicación externo para archivos DLL no se comprueba durante una llamada a LoadLibrary. Si el manifiesto no está incrustado, el cargador puede que intente cargar versiones incorrectas de ensamblados o que no encuentre ensamblados dependientes.

Se pueden volver a empaquetar uno o varios archivos DLL relacionados en un ensamblado simultáneo con un manifiesto de ensamblado correspondiente, el cual describe qué archivos forman dicho ensamblado, así como la dependencia del ensamblado con respecto a otros ensamblados simultáneos.

Nota:

Si un ensamblado contiene un archivo DLL, se recomienda incrustar el manifiesto del ensamblado en este archivo DLL como recurso con un identificador igual a 1, y asignar al ensamblado privado el mismo nombre que el del archivo DLL. Por ejemplo, si el nombre del archivo DLL es mylibrary.dll, el valor del atributo de nombre usado en el elemento <assemblyIdentity> del manifiesto podría ser también mylibrary. En algunos casos, si una biblioteca tiene una extensión que no es .dll (por ejemplo, los proyectos de controles ActiveX de MFC crean una biblioteca .ocx) se puede crear un manifiesto de ensamblado externo. En este caso, el nombre del ensamblado y su manifiesto deben ser diferentes del nombre del archivo DLL (por ejemplo, MyAssembly, MyAssembly.manifest y mylibrary.ocx). Sin embargo, aún es recomendable cambiar el nombre de dichas bibliotecas para que tengan la extensión.dll e incrusten el manifiesto como un recurso para reducir el futuro costo de mantenimiento de este ensamblado. Para obtener más información sobre cómo el sistema operativo busca ensamblados privados, vea Secuencia de búsqueda de ensamblados.

Este cambio puede permitir la implementación de los archivos DLL correspondientes como un ensamblado privado en la carpeta local de una aplicación o como un ensamblado compartido en la caché de ensamblados WinSxS. Se deben seguir varios pasos para lograr un comportamiento correcto en tiempo de ejecución de este nuevo ensamblado; éstos se describen en Instrucciones para crear ensamblados simultáneos. Después de crear correctamente un ensamblado, se puede implementar como un ensamblado compartido o privado junto con una aplicación que dependa de él. Al instalar los ensamblados simultáneos como un ensamblado compartido, puede seguir las instrucciones descritas en Instalación de ensamblados Win32 para uso compartido simultáneo en Windows XP o utilizar módulos de combinación. Cuando se instalan ensamblados simultáneos como un ensamblado privado, basta con copiar los correspondientes archivos DLL, recursos y manifiesto del ensamblado como parte del proceso de instalación en la carpeta local de la aplicación en el equipo de destino, asegurándose de que el cargador pueda encontrar este ensamblado en tiempo de ejecución (vea Secuencia de búsqueda de ensamblados). Otra manera es utilizar Windows Installer y seguir las instrucciones describir en Instalar Ensamblados Win32 para el uso privado de una aplicación en Windows XP.

Vea también

Conceptos

Ejemplos de implementación

Generar aplicaciones aisladas de C/C++

Otros recursos

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