Share via


Compilar ensamblados simultáneos de C/C++

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 están disponibles para que una aplicación los use en tiempo de ejecución. La principal ventaja de volver a empaquetar los archivos DLL en ensamblados consiste en que las aplicaciones pueden usar varias versiones de los ensamblados al mismo tiempo y es posible realizar el mantenimiento de los ensamblados instalados en el caso de una versión de actualización.

Una aplicación de C++ puede usar 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 el código necesario se ejecuta. La aplicación se basa en el sistema operativo para localizar los archivos DLL solicitados, comprender qué otros archivos DLL dependientes deben cargarse y cargarlos junto con el archivo DLL solicitado. En versiones de 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 estos archivos DLL.

De forma predeterminada, cuando se compila un archivo DLL con Visual Studio, tiene un manifiesto de aplicación insertado como un recurso RT_MANIFEST con un identificador igual a 2. Igual que en el caso de un archivo ejecutable, este manifiesto describe las dependencias de este archivo DLL en otros ensamblados. Se da por sentado que el archivo DLL no forma parte de un ensamblado simultáneo y que las aplicaciones que dependen de este archivo DLL no usarán un manifiesto de aplicación para cargarlo, sino que se basarán en el cargador del sistema operativo para encontrar este archivo DLL en la ruta de acceso del sistema.

Nota:

Es importante que un archivo DLL que usa un manifiesto de aplicación tenga el manifiesto insertado como un 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. Durante una llamada LoadLibrary, los manifiestos de aplicación externos para archivos DLL no se comprueban. Si el manifiesto no está insertado, el cargador podría intentar cargar versiones incorrectas de los ensamblados o no encontrar ensamblados dependientes.

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

Nota:

Si un ensamblado contiene un archivo DLL, se recomienda insertar el manifiesto del ensamblado en dicho archivo DLL como un recurso con un identificador igual a 1 y asignar al ensamblado privado el mismo nombre que el 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 también puede ser “mylibrary”. En algunos casos, cuando una biblioteca tiene una extensión distinta de .dll (por ejemplo, un proyecto de controles ActiveX de MFC crea una biblioteca .ocx), se puede crear un manifiesto de ensamblado externo. En este caso, el nombre del ensamblado y su manifiesto debe ser diferente del nombre del archivo DLL (por ejemplo, MyAssembly, MyAssembly.manifest y mylibrary.ocx). Aun así, se recomienda cambiar el nombre de dichas bibliotecas para que tengan la extensión .dll e insertar el manifiesto como un recurso para reducir el coste de mantenimiento futuro de este ensamblado. Para obtener más información sobre la manera en que 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 una carpeta local de la aplicación o como un ensamblado compartido en la caché de ensamblados WinSxS. Se deben seguir varios pasos para conseguir el comportamiento correcto en tiempo de ejecución de este nuevo ensamblado. Encontrará una descripción en Instrucciones para crear ensamblados simultáneos. Una vez que se ha creado correctamente un ensamblado, se puede implementar como un ensamblado compartido o privado junto con una aplicación que dependa de él. Al instalar ensamblados simultáneos como un ensamblado compartido, puede seguir las instrucciones descritas en Instalación de ensamblados Win32 para el uso compartido simultáneo en Windows XP o usar módulos de combinación. Al instalar ensamblados simultáneos como un ensamblado privado, puede simplemente copiar el archivo DLL, recursos y manifiesto de ensamblado correspondientes como parte del proceso de instalación en la carpeta local de la aplicación en el equipo de destino. Asegúrese de que el cargador pueda encontrar este ensamblado en tiempo de ejecución (vea Secuencia de búsqueda de ensamblados). Otra manera consiste en usar Windows Installer y seguir las instrucciones descritas en Instalar ensamblados Win32 para el uso privado de una aplicación en Windows XP.

Consulte también

Compilación de aplicaciones aisladas de C/C++
Compilación de aplicaciones aisladas y ensamblados simultáneos de C/C++