Referencia
Anotaciones
Expresa reglas de proteger y conservar en tu código con los atributos de Nebula.Annotations — [Keep], [Exclude], [Rename], [Protect], [EncryptStrings].
Desde 2.2.0 puedes expresar reglas de proteger/conservar en código con atributos, en lugar de (o junto a) las reglas del archivo de configuración. Los atributos viajan con el código, sobreviven a las refactorizaciones y se leen de forma natural en el punto donde aplican.
Instalación
dotnet add package Nebula.Annotations
Los atributos son metadatos solo de tiempo de compilación: Nebula los lee al proteger y los elimina de la salida, por lo que tu ensamblado protegido no arrastra ninguna dependencia en tiempo de ejecución del paquete.
Atributos
using Nebula.Annotations;
[Keep] // conserva el nombre de este tipo (los miembros se siguen protegiendo)
public class PluginContract { }
[Exclude] // excluye por completo de la ofuscación (nombre preservado)
public class InteropSurface { }
public class Repository
{
[Rename(false)] // conserva el nombre de este miembro
public void BoundByReflection() { }
[Protect(ProtectionKind.Virtualize)] // virtualiza este método (Pro)
public static int Hotpath(int a, int b) => a * b + 1;
[EncryptStrings] // cifra los literales de cadena de este método
public string Secret() => "do-not-ship-in-cleartext";
}
| Atributo | Efecto |
|---|---|
[Keep] | Conserva el nombre del elemento. Aplicado a un tipo, conserva el nombre del tipo; las demás transformaciones siguen aplicándose. |
[Exclude] | Excluye el elemento de la ofuscación (nombre preservado). |
[Rename(false)] | Conserva el nombre (como [Keep]); [Rename(true)] es el valor por defecto. |
[Protect(ProtectionKind.Virtualize)] | Virtualiza el método. Pro — no tiene efecto en la edición Free. ProtectionKind.ControlFlow solicita ofuscación de flujo de control. |
[EncryptStrings] | Marca un método o tipo cuyas cadenas deben cifrarse (requiere que el cifrado de cadenas esté activado). |
Cómo se combinan atributos y reglas
Los atributos se fusionan con las reglas de keep-list de tu config y con la detección automática de Nebula (reflexión, serialización, DI, XAML). Un nombre preservado por cualquiera de ellos se preserva — las anotaciones nunca debilitan la protección, solo añaden la intención que la herramienta podría no inferir. [Protect(Virtualize)] limita la virtualización a los métodos anotados; solo tiene efecto en una edición que ofrezca virtualización (Pro).
Para ver qué preserva ya la detección automática — antes de añadir atributos — ejecuta nebula doctor y revisa su propuesta.
Verifícalo
Tras una compilación protegida, abre el Informe de protección: un tipo [Keep] aparece en la superficie pública residual (su nombre está intencionadamente en claro), y un método [Protect(Virtualize)] se cuenta en métodos virtualizados. Las anotaciones mismas no aparecen en el ensamblado de salida.