Compartir vía


Método ICorDebugProcess6::EnableVirtualModuleSplitting

Habilita o deshabilita la división de módulos virtuales.

Sintaxis

HRESULT EnableVirtualModuleSplitting(
   BOOL enableSplitting
);

Parámetros

enableSplittingtrue para habilitar la división de módulos virtuales; false para deshabilitarla.

Comentarios

La división de módulos virtuales hace que ICorDebug reconozca los módulos que se combinaron durante el proceso de compilación, y los presenta como un grupo de módulos, en vez de como un solo módulo de gran tamaño. Esto cambia el comportamiento de diversos métodos de ICorDebug descritos a continuación.

Nota

Este método solo está disponible con .NET Native.

Puede llamar a este método y cambiar el valor de enableSplitting en cualquier momento. Esta acción no provoca cambios funcionales con estado en un objeto ICorDebug aparte de alterar el comportamiento de los métodos recogidos en la sección División de módulos virtuales y API de depuración no administrada en el momento en que se les llama. El uso de módulos virtuales hace que el rendimiento disminuya cuando se llama a estos métodos. Además, puede que se necesite un almacenamiento en caché en memoria considerable de los metadatos virtualizados para implementar correctamente las API IMetaDataImport. Estos almacenamientos en caché se pueden conservar incluso después de haber deshabilitado la división de módulos virtuales.

Terminología

Los siguientes términos sirven para describir la división de módulos virtuales:

módulos de contenedor o contenedores Módulos agregados.

submódulos o módulos virtuales Los módulos que se encuentran en un contenedor.

módulos normales Módulos que no se combinaron en tiempo de compilación. No son ni módulos de contenedor ni submódulos.

Tanto los módulos de contenedor como los submódulos se representan mediante objetos de interfaz ICorDebugModule. Sin embargo, el comportamiento de la interfaz es ligeramente diferente en cada caso, como se describe en la sección <x-ref to section>.

Módulos y ensamblados

En los escenarios donde se combinan ensamblados no se admiten ensamblados con varios módulos, por lo que hay una relación de uno a uno entre un módulo y un ensamblado. Cada objeto ICorDebugModule, independientemente de si representa a un módulo de contenedor o a un submódulo, se corresponde con un objeto ICorDebugAssembly. El método ICorDebugModule::GetAssembly realiza la conversión del módulo al ensamblado. Para realizarla en el otro sentido, el método ICorDebugAssembly::EnumerateModules enumera solo un módulo. Dado que ensamblado y módulo conforman un par estrechamente unido en este caso, los términos módulo y ensamblado se han convertido en prácticamente intercambiables.

Diferencias de comportamiento

Los módulos del contenedor tienen los siguientes comportamientos y características:

  • Sus metadatos para todos los submódulos que lo conforman se combinan entre sí.

  • Sus nombres de tipo se pueden alterar.

  • El método ICorDebugModule::GetName devuelve la ruta de acceso a un módulo en disco.

  • El método ICorDebugModule::GetSize devuelve el tamaño de esa imagen.

  • El método ICorDebugAssembly3.EnumerateContainedAssemblies enumera los submódulos.

  • El método ICorDebugAssembly3.GetContainerAssembly devuelve S_FALSE.

Los submódulos tienen los siguientes comportamientos y características:

  • Tienen un conjunto reducido de metadatos que corresponde únicamente al ensamblado original que se ha combinado.

  • Los nombres de los metadatos no se alteran.

  • Es improbable que los tokens de los metadatos coincidan con los tokens del ensamblado original antes de que combinarse en el proceso de compilación.

  • El método ICorDebugModule::GetName devuelve el nombre del ensamblado, no la ruta de acceso de un archivo.

  • El método ICorDebugModule::GetSize devuelve el tamaño original de la imagen sin combinar.

  • El método ICorDebugModule3.EnumerateContainedAssemblies devuelve S_FALSE.

  • El método ICorDebugAssembly3.GetContainerAssembly devuelve el módulo contenedor.

Interfaces obtenidas de los módulos

Se pueden crear y recuperar diversas interfaces de los módulos. Algunas son:

ICorDebug siempre almacena en caché estos objetos, que tienen la misma identidad de puntero, independientemente de si se han creado o consultado desde el módulo contenedor o desde un subproceso. El submódulo proporciona una vista filtrada de estos objetos en caché, no una memoria caché independiente con sus propias copias.

División de módulos virtuales y API de depuración no administradas

En la siguiente tabla se muestra cómo la división de módulos virtuales afecta al comportamiento de otros métodos en una API de depuración no administrada.

Método enableSplitting = true enableSplitting = false
ICorDebugFunction::GetModule Devuelve el submódulo en el que esta función se definió originalmente. Devuelve el módulo contenedor con el que esta función se combinó.
ICorDebugClass::GetModule Devuelve el submódulo en el que esta clase se definió originalmente. Devuelve el módulo contenedor con el que esta clase se combinó.
ICorDebugModuleDebugEvent::GetModule Devuelve el módulo contenedor que se cargó. Los submódulos no tienen eventos load, independientemente de esta configuración. Devuelve el módulo contenedor que se cargó.
ICorDebugAppDomain::EnumerateAssemblies Devuelve una lista de los subensamblados y ensamblados regulares; no se incluyen ensamblados de contenedor. Nota: Si faltan símbolos en algún ensamblado de contenedor, no se enumerará ninguno de sus subensamblados. Si faltan símbolos en algún ensamblado regular, puede que se enumere o no. Devuelve una lista de ensamblados de contenedor y ensamblados regulares; no se incluyen subensamblados. Nota: Si faltan símbolos en algún ensamblado regular, puede que se enumere o no.
ICorDebugCode::GetCode (solo cuando se hace referencia a código IL) Devuelve el código IL que sería válido en una imagen de ensamblado antes de la fusión mediante combinación. En concreto, cualquier token de metadatos en línea será correctamente un token TypeRef o MemberRef cuando los tipos a los que se hace referencia no están definidos en el módulo virtual que contiene el IL. Puede buscar estos tokens TypeRef o MemberRef en el objeto IMetaDataImport del objeto ICorDebugModule virtual correspondiente. Devuelve el IL de la imagen de ensamblado posterior a la combinación.

Requisitos

Plataformas: Vea Requisitos de sistema.

Encabezado: CorDebug.idl, CorDebug.h

Biblioteca: CorGuids.lib

Versiones de .NET Framework: disponible a partir de la versión 4.6, solo en .NET Native

Consulte también