La respuesta corta es que no, no hay forma de hacer lo que estás pidiendo.
La respuesta más larga es esta: existe un método de carga de ensamblaje especial, Assembly.ReflectionOnlyLoad()
, que utiliza un contexto de carga "solo de reflexión". Esto le permite cargar ensamblajes que no se pueden ejecutar, pero que pueden leer sus metadatos.
En su caso (y, al parecer, en todos los casos de uso que pude encontrar) no es tan útil. No puede obtener atributos escritos de este tipo de ensamblaje, solo CustomAttributeData
. Esa clase no proporciona ninguna buena forma de filtrar un atributo específico (lo mejor que pude encontrar fue convertirlo en una cadena y usar StartsWith("[System.Diagnostics.Debuggable");
Peor aún, una carga de solo reflexión no carga ninguna dependencia asambleas, pero que le obliga a hacerlo manualmente Eso hace que sea objetivamente peor que lo que está haciendo ahora;.. por lo menos ahora se obtiene la carga de dependencia de forma automática
(Además, mi respuesta anterior hace referencia al MEF ; Me equivoqué, parece que MEF incluye una tonelada completa de código de reflejo personalizado para que esto funcione.)
En última instancia, no se puede unl y un conjunto una vez que ha sido cargado. Es necesario descargar la totalidad dominio de aplicación, como se describe en this MSDN article.
ACTUALIZACIÓN:
como se ha señalado en los comentarios, yo era capaz de obtener la información de atributos que necesitaba a través de la carga de la reflexión de sólo (y una carga normal), pero la falta de metadatos de atributos mecanografiados hace que sea un dolor serio.
Si se carga en un contexto de montaje normal, se puede obtener la información que necesita bastante facilidad:
var d = a.GetCustomAttributes(typeof(DebuggableAttribute), false) as DebuggableAttribute;
var tracking = d.IsJITTrackingEnabled;
var optimized = !d.IsJITOptimizerDisabled;
Si se carga en un contexto de reflexión-solamente, se llega a hacer algo de trabajo; debe averiguar la forma que tomó el constructor del atributo, conocer cuáles son los valores predeterminados y combinar esa información para obtener los valores finales de cada propiedad.A obtener la información que necesita de esta manera:
var d2 = a.GetCustomAttributesData()
.SingleOrDefault(x => x.ToString()
.StartsWith("[System.Diagnostics.DebuggableAttribute"));
A partir de ahí, es necesario comprobar la ConstructorArguments
para ver qué constructor se llama: this one con un argumento o this one con dos argumentos. A continuación, puede utilizar los valores de los parámetros adecuados para averiguar cuáles son los valores de las dos propiedades que le interesan habría tomado:
if (d2.ConstructorArguments.Count == 1)
{
var mode = d2.ConstructorArguments[0].Value as DebuggableAttribute.DebuggingModes;
// Parse the modes enumeration and figure out the values.
}
else
{
var tracking = (bool)d2.ConstructorArguments[0].Value;
var optimized = !((bool)d2.ConstructorArguments[1].Value);
}
Por último, es necesario comprobar si hay NamedArguments
que podrían invalidar los establecidos en el constructor, utilizando, por ejemplo:
var arg = NamedArguments.SingleOrDefault(x => x.MemberInfo.Name.Equals("IsJITOptimizerDisabled"));
var optimized = (arg == null || !((bool)arg.TypedValue.Value));
en una nota final, si está ejecutando esto bajo .NET 2.0 o superior, y todavía no lo ha visto en, puntos de MSDN esto en la documentación: DebuggingModes
En .NET Framework versión 2.0, la información de seguimiento JIT siempre se genera, y este indicador tiene el mismo efecto que el predeterminado, con la excepción de que la propiedad IsJITTrackingEnabled es falsa, lo que no tiene ningún significado en la versión 2.0.
¡Buen punto sobre la descarga! –
Gracias. Lo había intentado pero estaba teniendo dificultades para obtener IsJITTrackingEnabled e IsJITOptimizerDisabled a través del objeto CustomAttributeData. ¿Estoy haciendo eso incorrectamente? – RockyMountainHigh
Bueno, pude hacer lo que quería pero también descubrí que 'ReflectionOnlyLoad' es básicamente inútil. No carga dependencias automáticamente - * usted tiene que cargarlas usted mismo *. (También descubrí que MEF ha implementado un contexto de reflejo personalizado, y parece que no usa esto). –