Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
Este artículo es específico de .NET Framework. No se aplica a implementaciones más recientes de .NET, incluidas .NET 6 y versiones posteriores.
La ejecución en paralelo es la capacidad de ejecutar varias versiones de una aplicación o componente en el mismo equipo. Puede tener varias versiones de Common Language Runtime y varias versiones de aplicaciones y componentes que usan una versión del entorno de ejecución, en el mismo equipo al mismo tiempo.
En la ilustración siguiente se muestran varias aplicaciones que usan dos versiones diferentes del entorno de ejecución en el mismo equipo. Las aplicaciones A, B y C usan la versión 1.0 del entorno de ejecución, mientras que la aplicación D usa la versión 1.1 del entorno de ejecución.
.NET Framework consta de Common Language Runtime y una colección de ensamblados que contienen los tipos de API. El entorno de ejecución y los ensamblados de .NET Framework se versionan por separado. Por ejemplo, la versión 4.0 del entorno de ejecución es realmente la versión 4.0.319, mientras que la versión 1.0 de los ensamblados de .NET Framework es la versión 1.0.3300.0.
En la ilustración siguiente se muestran varias aplicaciones que usan dos versiones diferentes de un componente en el mismo equipo. La aplicación A y B usan la versión 1.0 del componente, mientras que la aplicación C usa la versión 2.0 del mismo componente.
La ejecución en paralelo proporciona más control sobre las versiones de un componente a las que se enlaza una aplicación y más control sobre la versión del tiempo de ejecución que usa una aplicación.
Ventajas de la ejecución en paralelo
Antes de Windows XP y .NET Framework, se produjeron conflictos de DLL porque las aplicaciones no podían distinguir entre versiones incompatibles del mismo código. La información de tipo contenida en un archivo DLL solo estaba enlazada a un nombre de archivo. Una aplicación no tenía forma de saber si los tipos contenidos en un archivo DLL eran los mismos tipos con los que se creó la aplicación. Como resultado, una nueva versión de un componente podría sobrescribir una versión anterior y interrumpir las aplicaciones.
La ejecución en paralelo y .NET Framework proporciona las siguientes características para eliminar conflictos de DLL:
Ensamblados con nombre seguro
La ejecución en paralelo utiliza ensamblados con nombre seguro para enlazar la información de los tipos a una versión específica de un ensamblado. Esto impide que una aplicación o un componente se enlacen a una versión no válida de un ensamblado. Los ensamblados con nombre seguro también permiten que existan varias versiones de un archivo en el mismo equipo y que las aplicaciones las usen. Para más información, vea Ensamblados con nombre seguro.
Almacenamiento de código con identificación de versión
.NET Framework ofrece un almacenamiento de código con identificación de la versión en la caché global de ensamblados. La caché de ensamblados global es una caché de código a nivel de equipo presente en todos los equipos con el .NET Framework instalado. Almacena ensamblados basados en la versión, la referencia cultural y la información del publicador, y admite varias versiones de componentes y aplicaciones. Para obtener más información, consulte Caché global de ensamblaje.
Aislamiento.
Con .NET Framework, puede crear aplicaciones y componentes que se ejecuten de forma aislada. El aislamiento es un componente esencial de la ejecución en paralelo. Implica tener en cuenta los recursos que está usando y compartiendo recursos con confianza entre varias versiones de una aplicación o componente. El aislamiento también incluye el almacenamiento de archivos de manera específica para la versión. Para obtener más información sobre el aislamiento, vea Directrices para crear componentes para la ejecución en paralelo.
Compatibilidad de versiones
Las versiones 1.0 y 1.1 de .NET Framework están diseñadas para ser compatibles entre sí. Una aplicación compilada con .NET Framework versión 1.0 debe ejecutarse en la versión 1.1 y una aplicación compilada con .NET Framework versión 1.1 debe ejecutarse en la versión 1.0. Sin embargo, tenga en cuenta que las características de API agregadas en la versión 1.1 de .NET Framework no funcionarán con la versión 1.0 de .NET Framework. Las aplicaciones creadas con la versión 2.0 solo se ejecutarán en la versión 2.0. Las aplicaciones de la versión 2.0 no se ejecutarán en la versión 1.1 ni en versiones anteriores.
Las versiones de .NET Framework se tratan como una sola unidad que consta del entorno de ejecución y sus ensamblados de .NET Framework asociados (un concepto denominado unificación de ensamblados). Puede redirigir el enlace de ensamblado para incluir otras versiones de los ensamblados de .NET Framework, pero reemplazar el enlace de ensamblado predeterminado puede ser arriesgado y debe probarse rigurosamente antes de la implementación.
Buscar información de versión del motor en tiempo de ejecución
Información sobre con qué versión del entorno de ejecución se compiló una aplicación o componente y qué versiones del entorno de ejecución requiere para ejecutarse se almacenan en dos ubicaciones. Cuando se compila una aplicación o componente, se almacena información sobre la versión en tiempo de ejecución que se usa para compilarla en el ejecutable administrado. La información sobre las versiones en tiempo de ejecución que requiere la aplicación o el componente se almacena en el archivo de configuración de la aplicación.
Información de versión en tiempo de ejecución en el ejecutable administrado
El encabezado de archivo ejecutable portátil (PE) de cada aplicación administrada y componente contiene información sobre la versión en tiempo de ejecución con la que se creó. Common Language Runtime usa esta información para determinar la versión más probable del tiempo de ejecución que debe ejecutar la aplicación.
Información de versión en tiempo de ejecución en el archivo de configuración de la aplicación
Además de la información del encabezado de archivo PE, una aplicación se puede implementar con un archivo de configuración de aplicación que proporciona información de versión en tiempo de ejecución. El archivo de configuración de la aplicación es un archivo basado en XML creado por el desarrollador de aplicaciones y que se incluye con una aplicación. El <elemento entorno de ejecución requerido> de la <sección de inicio>, si está presente en este archivo, especifica qué versiones del entorno de ejecución y qué versiones de un componente concreto admite la aplicación. También puede usar este archivo en pruebas para probar la compatibilidad de una aplicación con diferentes versiones del entorno de ejecución.
El código no administrado, incluidas las aplicaciones COM y COM+, puede tener archivos de configuración de aplicaciones que el runtime usa para interactuar con código administrado. El archivo de configuración de la aplicación afecta a cualquier código administrado que se active a través de COM. El archivo puede especificar qué versiones en tiempo de ejecución admite, así como redireccionamientos de ensamblado. De forma predeterminada, las aplicaciones de interoperabilidad COM que llaman al código administrado usan la versión más reciente del entorno de ejecución instalado en el equipo.
Para obtener más información sobre los archivos de configuración de la aplicación, consulte Configuración de aplicaciones.
Determinar qué versión del entorno de ejecución se va a cargar
Common Language Runtime usa la siguiente información para determinar qué versión del entorno de ejecución se va a cargar para una aplicación:
Las versiones en tiempo de ejecución que están disponibles.
Las versiones en tiempo de ejecución que admite una aplicación.
Versiones admitidas en entorno de ejecución
El tiempo de ejecución usa el archivo de configuración de la aplicación y el encabezado de archivo ejecutable portátil (PE) para determinar qué versión del tiempo de ejecución admite una aplicación. Si no hay ningún archivo de configuración de aplicación presente, el tiempo de ejecución carga la versión en tiempo de ejecución especificada en el encabezado de archivo PE de la aplicación, si esa versión está disponible.
Si hay un archivo de configuración de aplicación presente, el tiempo de ejecución determina la versión en tiempo de ejecución adecuada que se va a cargar en función de los resultados del proceso siguiente:
El entorno de ejecución examina el elemento <> en el archivo de configuración de la aplicación. Si hay una o varias de las versiones en tiempo de ejecución admitidas especificadas en el <elemento supportedRuntime> , el tiempo de ejecución carga la versión en tiempo de ejecución especificada por el primer <elemento supportedRuntime> . Si esta versión no está disponible, el entorno de ejecución examina el siguiente elemento <supportedRuntime> e intenta cargar la versión del entorno de ejecución especificada. Si esta versión del entorno de ejecución no está disponible, se examinan los siguientes elementos <supportedRuntime>. Si ninguna de las versiones en tiempo de ejecución admitidas está disponible, el entorno de ejecución no puede cargar una versión en tiempo de ejecución y muestra un mensaje al usuario (consulte el paso 3).
El entorno de ejecución lee el encabezado de archivo PE del fichero ejecutable de la aplicación. Si la versión en tiempo de ejecución especificada por el encabezado de archivo PE está disponible, el tiempo de ejecución carga esa versión. Si la versión de tiempo de ejecución especificada no está disponible, el entorno de ejecución busca una versión determinada por Microsoft para ser compatible con la versión del tiempo de ejecución indicada en el encabezado PE. Si no se encuentra esa versión, el proceso continúa con el paso 3.
El tiempo de ejecución muestra un mensaje que indica que la versión en tiempo de ejecución admitida por la aplicación no está disponible. El tiempo de ejecución no se carga.
Nota:
Puede suprimir la presentación de este mensaje mediante el valor NoGuiFromShim en la clave del Registro HKLM\Software\Microsoft\. NETFramework o mediante la variable de entorno COMPLUS_NoGuiFromShim. Por ejemplo, puede suprimir el mensaje de las aplicaciones que normalmente no interactúan con el usuario, como instalaciones desatendidas o servicios de Windows. Cuando se suprime la presentación de este mensaje, el tiempo de ejecución escribe un mensaje en el registro de eventos. Establezca el valor del Registro NoGuiFromShim en 1 para suprimir este mensaje para todas las aplicaciones de un equipo. Como alternativa, establezca la variable de entorno COMPLUS_NoGuiFromShim en 1 para suprimir el mensaje de las aplicaciones que se ejecutan en un contexto de usuario determinado.
Nota:
Una vez que se ha cargado una versión en tiempo de ejecución, las redirecciones de enlace de ensamblado pueden especificar la carga de una versión diferente de un ensamblado individual de .NET Framework. Estas redirecciones de enlace afectan solo al ensamblado específico que se redirige.
Nombres de ensamblados parciales y ejecución en paralelo
Dado que son un origen potencial de problemas en paralelo, las referencias de ensamblado parcialmente calificadas solo se pueden usar para enlazar a ensamblados dentro de un directorio de aplicación. Evite las referencias de ensamblado parcialmente calificadas en el código.
Para mitigar las referencias de ensamblado parcialmente calificadas en el código, puede usar el elemento qualifyAssembly< en un archivo de configuración de la aplicación para calificar completamente las referencias de ensamblado parcialmente calificadas que se producen en el> código. Use el elemento <qualifyAssembly> para especificar solo los campos que no se han establecido en la referencia parcial. La identidad del ensamblado que aparece en el atributo fullName debe contener toda la información necesaria para calificar completamente el nombre del ensamblado: nombre del ensamblado, clave pública, referencia cultural y versión.
En el ejemplo siguiente se muestra la entrada del archivo de configuración de la aplicación para especificar completamente un ensamblado denominado myAssembly
.
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<qualifyAssembly partialName="myAssembly"
fullName="myAssembly,
version=1.0.0.0,
publicKeyToken=...,
culture=neutral"/>
</assemblyBinding>
Cada vez que una instrucción de carga de ensamblado hace referencia a myAssembly
, estas opciones de archivo de configuración hacen que el tiempo de ejecución traduzca automáticamente la referencia parcialmente calificada myAssembly
a una referencia completa. Por ejemplo, Assembly.Load("myAssembly") se convierte en Assembly.Load("myAssembly, version=1.0.0.0, publicKeyToken=..., culture=neutral").
Nota:
Puede usar el método LoadWithPartialName para omitir la restricción de Common Language Runtime que prohíbe que los ensamblados a los que se hace referencia parcialmente se carguen desde la caché global de ensamblados. Este método solo se debe usar en escenarios de acceso remoto que pueden producir problemas fácilmente en la ejecución en paralelo.
Temas relacionados
Título | Descripción |
---|---|
Procedimiento: Habilitación y deshabilitación del redireccionamiento de enlaces automático | Describe cómo enlazar una aplicación a una versión específica de un ensamblado. |
Configuración del redireccionamiento del enlace de ensamblados | Explica cómo redirigir referencias a enlaces de ensamblados a una versión específica de los ensamblados de .NET Framework. |
Ejecución en paralelo en proceso | Describe cómo se puede utilizar la activación del host en tiempo de ejecución en paralelo y en el mismo proceso para ejecutar varias versiones de CLR en un solo proceso. |
Ensamblajes en .NET | Proporciona información general conceptual de los ensamblados. |
Dominios de aplicación | Proporciona información general conceptual sobre los dominios de aplicación. |