Exportar (0) Imprimir
Expandir todo
Este artículo proviene de un motor de traducción automática. Mueva el puntero sobre las frases del artículo para ver el texto original. Más información.
Traducción
Original

ComponentGuaranteesAttribute (Clase)

Define la garantía de la compatibilidad de un componente, tipo o miembro de tipo que puede abarcar varias versiones.

System.Object
  System.Attribute
    System.Runtime.Versioning.ComponentGuaranteesAttribute

Espacio de nombres:  System.Runtime.Versioning
Ensamblado:  mscorlib (en mscorlib.dll)

[AttributeUsageAttribute(AttributeTargets.Assembly|AttributeTargets.Module|AttributeTargets.Class|AttributeTargets.Struct|AttributeTargets.Enum|AttributeTargets.Constructor|AttributeTargets.Method|AttributeTargets.Property|AttributeTargets.Event|AttributeTargets.Interface|AttributeTargets.Delegate, AllowMultiple = false, 
	Inherited = false)]
public sealed class ComponentGuaranteesAttribute : Attribute

El tipo ComponentGuaranteesAttribute expone los siguientes miembros.

  NombreDescripción
Método públicoComponentGuaranteesAttributeInicializa una nueva instancia de la clase ComponentGuaranteesAttribute con un valor que indica el nivel garantizado de compatibilidad entre varias versiones de una biblioteca, un tipo o un miembro.
Arriba

  NombreDescripción
Propiedad públicaGuaranteesObtiene un valor que indica el nivel de compatibilidad garantizado de una biblioteca, tipo o miembro de tipo que abarca varias versiones.
Propiedad públicaTypeIdCuando se implementa en una clase derivada, obtiene un identificador único para este Attribute. (Se hereda de Attribute).
Arriba

  NombreDescripción
Método públicoEqualsInfraestructura. Devuelve un valor que indica si esta instancia equivale al objeto especificado. (Se hereda de Attribute).
Método públicoGetHashCodeDevuelve el código hash de esta instancia. (Se hereda de Attribute).
Método públicoGetType Obtiene el Typede la instancia actual. (Se hereda de Object).
Método públicoIsDefaultAttributeCuando se invalida en una clase derivada, indica si el valor de esta instancia es el valor predeterminado para la clase derivada. (Se hereda de Attribute).
Método públicoMatch Cuando se invalida en una clase derivada, devuelve un valor que indica si esta instancia es igual al objeto especificado. (Se hereda de Attribute).
Método públicoToString Retorna una cadena que representa al objeto actual. (Se hereda de Object).
Arriba

  NombreDescripción
Implementación explícita de interfacesMétodo privado_Attribute.GetIDsOfNamesAsigna un conjunto de nombres a un conjunto correspondiente de identificadores de envío. (Se hereda de Attribute).
Implementación explícita de interfacesMétodo privado_Attribute.GetTypeInfoObtiene la información de tipos de un objeto, que puede utilizarse para obtener la información de tipos de una interfaz. (Se hereda de Attribute).
Implementación explícita de interfacesMétodo privado_Attribute.GetTypeInfoCount

Recupera el número de interfaces de tipo de información que suministra un objeto (0 ó 1)

(Se hereda de Attribute).
Implementación explícita de interfacesMétodo privado_Attribute.InvokeProporciona acceso a las propiedades y los métodos expuestos por un objeto. (Se hereda de Attribute).
Arriba

Los desarrolladores de software de componentes y bibliotecas de clases utilizan ComponentGuaranteesAttribute para indicar el nivel de compatibilidad que los consumidores de sus bibliotecas pueden esperar en las diferentes versiones. Indica el nivel de garantía que una versión futura de la biblioteca o componente no interrumpirá un cliente existente. A continuación, los clientes pueden utilizar ComponentGuaranteesAttribute como una ayuda para diseñar sus propias interfaces para asegurarse la estabilidad de las versiones.

NotaNota

Common Language Runtime (CLR) no usa este atributo de ningún modo. Su valor se basa simplemente en documentar formalmente el intento del creador de componentes. Las herramientas de tiempo de compilación también pueden usar estas declaraciones para detectar errores en tiempo de compilación que de lo contrario interrumpirían la garantía declarada.

Niveles de compatibilidad

ComponentGuaranteesAttribute admite los siguientes niveles de compatibilidad, que son representados por miembros de la enumeración ComponentGuaranteesOptions:

  • No hay compatibilidad versión a versión (ComponentGuaranteesOptions.None). El cliente puede esperar que las futuras versiones interrumpirán el cliente existente. Para obtener más información, vea la sección Sin compatibilidad, más adelante en este tema.

  • Compatibilidad de versión a versión en paralelo (ComponentGuaranteesOptions.SideBySide). El componente se ha probado para funcionar cuando se cargue más de una versión del ensamblado en el mismo dominio de aplicación. En general, las versiones futuras pueden interrumpir la compatibilidad. Sin embargo, cuando se realizan tales cambios, la versión anterior no se modifica, sino que existe con la nueva versión. La ejecución en paralelo es la manera esperada para que los clientes existentes funcionen cuando se realizan cambios importantes. Para obtener más información, vea la sección Compatibilidad en paralelo más adelante en este tema.

  • No hay compatibilidad versión a versión estable (ComponentGuaranteesOptions.Stable). Las versiones futuras no deberían interrumpir el cliente y no se debería necesitar la ejecución en paralelo. Sin embargo, si el cliente se interrumpe accidentalmente, es posible usar la ejecución en paralelo para corregir el problema. Para obtener más información, vea la sección Compatibilidad estable.

  • No hay compatibilidad versión a versión de intercambio (ComponentGuaranteesOptions.Exchange). Debe ser extraordinariamente cuidadoso para garantizar que las versiones futuras no interrumpan el cliente. El cliente debería usar solo estos tipos en la firma de interfaces que se usan para la comunicación con otros ensamblados que se implementan independientemente el uno del otro. Se espera que solo una versión de estos tipos esté en un dominio de aplicación determinado, lo que significa que si un cliente interrumpe, la ejecución en paralelo no puede corregir el problema de la compatibilidad. Para obtener más información, vea la sección Compatibilidad de tipo de intercambio.

En las siguientes secciones se discute cada nivel de garantía con mayor detalle.

Ee332865.collapse_all(es-es,VS.110).gifSin compatibilidad

Marcar un componente como ComponentGuaranteesOptions.None indica que el proveedor no ofrece ninguna garantía sobre la compatibilidad. Los clientes deberían evitar la toma de dependencias en las interfaces expuestas. Este nivel de compatibilidad es útil para los tipos que son experimentales o se exponen públicamente, pero están destinados únicamente para componentes que siempre se actualizan al mismo tiempo. None indica explícitamente que este componente no lo deben usar componentes externos.

Ee332865.collapse_all(es-es,VS.110).gifCompatibilidad con la instalación en paralelo

Marcar un componente como ComponentGuaranteesOptions.SideBySide indica que el componente se ha probado para funcionar cuando se cargue más de una versión del ensamblado en el mismo dominio de aplicación. Se permiten los cambios importantes con tal de que se realicen en el ensamblado que tiene el número de versión mayor. Se espera que los componentes que se enlazan a una versión anterior del ensamblado continúen enlazados a la versión anterior y otros componentes pueden enlazarse a la nueva versión. También es posible actualizar un componente que se declara para ser SideBySide modificando la versión anterior de forma destructiva.

Ee332865.collapse_all(es-es,VS.110).gifCompatibilidad estable

Marcar un tipo como ComponentGuaranteesOptions.Stable indica que el tipo debería seguir siendo estable entre versiones. Sin embargo, es posible también que las versiones en paralelo de un tipo estable existan en el mismo dominio de aplicación.

Los tipos estables mantienen una barra de compatibilidad binaria alta. Debido a esto, los proveedores deberían evitar realizar cambios relevantes en tipos estables. Los siguientes tipos de cambios son aceptables:

  • Agregar campos de instancia privados a un tipo, o quitarlos del mismo, con tal de que esta acción no interrumpa el formato de serialización.

  • Cambiar un tipo no serializable a un tipo serializable. (No obstante, un tipo serializable no se puede cambiar a un tipo no serializable).

  • Generar nuevas excepciones, más derivadas de un método.

  • Mejorar el rendimiento de un método.

  • Cambiar el intervalo de valores devueltos, siempre que la mayoría de los clientes no se vean adversamente afectados por el cambio.

  • Corregir los errores más graves, si la justificación comercial es alta y el número de clientes adversamente afectado es bajo.

Dado que no se espera que las nuevas versiones de componentes estables interrumpan los clientes existentes, generalmente solo una versión de un componente estable se necesita en un dominio de aplicación. Sin embargo, éste no es un requisito, porque los tipos estables no se usan como tipos de intercambio conocidos con los que todos los componentes están de acuerdo. Por consiguiente, si una nueva versión de un componente estable interrumpe algún componente inadvertidamente, y si otros componentes necesitan la nueva versión, puede ser posible corregir el problema cargando el componente anterior y el nuevo.

Stable proporciona una garantía de la compatibilidad de la versión más fuerte que None. Es un valor predeterminado común para los componentes multi-versión.

Stable se puede combinar con SideBySide, que establece que el componente no interrumpirá la compatibilidad pero se prueba para que funcione cuando más de una versión se carga en un dominio de aplicación determinado.

Después de marcar un tipo o método como Stable, se puede actualizar a Exchange. Sin embargo, no se puede degradar a None.

Ee332865.collapse_all(es-es,VS.110).gifCompatibilidad de tipo de intercambio

Marcar un tipo como ComponentGuaranteesOptions.Exchange proporciona una garantía de la compatibilidad de la versión más fuerte que Stabley se debería aplicar al más estable de todos los tipos. Estos tipos están pensados para que se usen en el intercambio entre los componentes compilados de forma independiente a través de todos los límites de componente tanto en tiempo (cualquier versión de CLR o cualquier versión de un componente o aplicación) como en espacio (entre procesos, entre CLR en un proceso, dominio entre aplicaciones en un CLR). Si se realiza un cambio problemático a un tipo de intercambio, es imposible corregir el problema cargando varias versiones del tipo.

Los tipos de intercambio solo se deberían cambiar cuando un problema es muy grave (como un problema de seguridad grave) o la probabilidad de rotura es muy baja (es decir, si el comportamiento ya estuviese interrumpido de una manera aleatoria y el código no pudo asumir una dependencia plausiblemente). Puede realizar los siguientes tipos de cambios en un tipo de intercambio:

  • Agregar herencia de nuevas definiciones de interfaz.

  • Agregar nuevos métodos privados que implementen los métodos de definiciones de interfaz recientemente heredadas.

  • Agregar nuevos campos estáticos.

  • Agregar nuevos métodos estáticos.

  • Agregar nuevos métodos de instancia no virtuales.

Los siguientes se consideran cambios problemáticos y no están permitidos para tipos primitivos:

  • Cambiar formatos de serialización. Se requiere la serialización tolerante a versiones.

  • Agregar o quitar los campos de instancia privados. Esto corre el riesgo de cambiar el formato de serialización del tipo, así como interrumpir el código de cliente que usa la reflexión.

  • Cambiar serializabilidad de un tipo. Un tipo no serializable no se puede hacer serializable y viceversa.

  • Generar excepciones diferentes de un método.

  • Cambiar el intervalo de los valores devueltos de un método, a menos que la definición de miembro provoque esta posibilidad y claramente indique cómo los clientes deberían administrar los valores desconocidos.

  • Corregir la mayoría de los errores. Los consumidores del tipo confiarán en el comportamiento existente.

Después de marcar un componente, tipo o miembro con la garantía Exchange, no se puede cambiar a Stable o None.

Normalmente, los tipos de intercambio son los tipos básicos (como Int32 y String en .NET Framework) e interfaces (como IList<T>, IEnumerable<T> y IComparable<T>) que se utilizan normalmente en interfaces públicas.

Los tipos de intercambio pueden exponer públicamente sólo otros tipos que también se marcan con compatibilidad Exchange. Además, los tipos de intercambio no pueden depender del comportamiento de las API de Windows que son susceptibles de cambio.

Garantías de componente: resumen

La siguiente tabla indica cómo afectan las características y el uso de un componente a su garantía de compatibilidad.

Características de componentes

Intercambio

Estable

Ejecución en paralelo

None

Se puede usar en interfaces entre los componentes que controlan las versiones independientemente.

Y

N

N

N

Puede ser usado (privadamente) por un ensamblado que controla las versiones independientemente.

Y

Y

Y

N

Puede tener varias versiones en un único dominio de aplicación.

N

Y

Y

Y

Puede hacer cambios importantes

N

N

Y

Y

Se prueba para que varias versiones del ensamblado se puedan cargar juntas.

N

N

Y

N

Puede hacer cambios importantes en contexto.

N

N

N

Y

Puede realizar cambios de servicio no importantes en contexto de forma segura.

Y

Y

Y

Y

Aplicar el atributo

Puede aplicar ComponentGuaranteesAttribute a un ensamblado, un tipo o un miembro de tipo. Su aplicación es jerárquica. Es decir, de forma predeterminada, la garantía definida por la propiedad Guarantees del atributo en el nivel del ensamblado define la garantía de todos los tipos en el ensamblado y todos los miembros en esos tipos. De igual forma, si la garantía se aplica al tipo, de forma predeterminada también se aplica a cada miembro del tipo.

Esta garantía heredada puede invalidarse aplicando ComponentGuaranteesAttribute a tipos individuales y miembros de tipos. Sin embargo, las garantías que invalidan el valor predeterminado solo pueden debilitar la garantía; no pueden fortalecerla. Por ejemplo, si un ensamblado se marca con la garantía None, sus tipos y miembros no tienen ninguna garantía de compatibilidad y se omite cualquier otra garantía que se aplique a tipos o miembros en el ensamblado.

Probar la garantía

La propiedad Guarantees devuelve un miembro de la enumeración ComponentGuaranteesOptions, que está marcado con el atributo FlagsAttribute. Esto significa que debería comprobar la marca que le interesa, ocultando las marcas potencialmente desconocidas. En el siguiente ejemplo se prueba si un tipo está marcado como Stable.


// Test whether guarantee is Stable.
if ((guarantee & ComponentGuaranteesOptions.Stable) == ComponentGuaranteesOptions.Stable)
   Console.WriteLine("{0} is marked as {1}.", typ.Name, guarantee);


El siguiente ejemplo prueba si un tipo está marcado como Stable o Exchange.


// Test whether guarantee is Stable or Exchange.
if ((guarantee & (ComponentGuaranteesOptions.Stable | ComponentGuaranteesOptions.Exchange)) > 0)
   Console.WriteLine("{0} is marked as Stable or Exchange.", typ.Name, guarantee);


En el siguiente ejemplo se prueba si un tipo está marcado como None (es decir, no es Stable ni Exchange).


// Test whether there is no guarantee (neither Stable nor Exchange).
if ((guarantee & (ComponentGuaranteesOptions.Stable | ComponentGuaranteesOptions.Exchange)) == 0)
   Console.WriteLine("{0} has no compatibility guarantee.", typ.Name, guarantee);


.NET Framework

Compatible con: 4.5, 4

.NET Framework Client Profile

Compatible con: 4

Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (no se admite el rol Server Core), Windows Server 2008 R2 (se admite el rol Server Core con SP1 o versiones posteriores; no se admite Itanium)

.NET Framework no admite todas las versiones de todas las plataformas. Para obtener una lista de las versiones compatibles, vea Requisitos de sistema de .NET Framework.

Todos los miembros públicos static (Shared en Visual Basic) de este tipo son seguros para subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Adiciones de comunidad

AGREGAR
Mostrar:
© 2014 Microsoft