Los atributos personalizados son una de las piezas más extendidas de los metadatos de .NET: permiten adjuntar información adicional a clases, métodos, campos y parámetros para que el compilador, los analizadores o los generadores de código actúen en consecuencia. Ejemplos clásicos son [Obsolete], que marca un elemento como desusado y emite un aviso en tiempo de compilación, o atributos propios que parametrizan herramientas de serialización, inyección de dependencias o registro de servicios en tiempo de ejecución.
Sin embargo, el mantenedor de una biblioteca de análisis de binarios PE en .NET ha publicado una queja técnica detallada sobre el mecanismo de almacenamiento de estos atributos, al que califica como "una de las peores decisiones de diseño de Microsoft". Su crítica se centra en el formato de la firma (signature) que codifica los argumentos del constructor dentro del blob de metadatos.
Cuando los argumentos son tipos primitivos, el formato es intuitivo: cada tipo determina cuántos bytes ocupa y cómo interpretarlos. El problema aparece con los enums, que son extremadamente comunes en atributos del propio framework (como DebuggableAttribute.DebuggingModes). La especificación ECMA-335 indica que los enums se serializan según su tipo subyacente (int, short, byte, etc.), pero el blob no incluye ninguna pista sobre cuál es ese tipo. Para averiguarlo, la herramienta que lee el binario tiene que:
- Resolver el ensamblado que declara el tipo del argumento, sondeando directorios en disco, parseando cabeceras y manifests XML/JSON y verificando la identidad del ensamblado.
- Recorrer la tabla TypeDef (más de 2.700 filas en System.Private.CoreLib.dll) hasta localizar el enum.
- Si el tipo es anidado, consultar recursivamente la tabla NestedClass.
- Si el tipo es reenviado (type forwarder), saltar a otro ensamblado y repetir el proceso.
Este trabajo se ejecuta por cada argumento de tipo enum, lo que convierte la lectura de un atributo aparentemente trivial en una operación enormemente costosa en CPU e I/O. La consecuencia práctica es que analizadores estáticos, herramientas de inspección y bibliotecas como AsmResolver invierten esfuerzo desproporcionado para deserializar correctamente la firma, evidencia de una decisión eficiente en espacio de almacenamiento pero muy ineficiente en tiempo de lectura.
