El tracker de .NET 11
Un marcador para todo el ciclo de .NET 11.
Este pilar reúne todo lo que he escrito sobre .NET 11: previews, cambios en el runtime, actualizaciones del GC, trabajo del JIT y la nueva superficie de la BCL. Guarda esta página en marcadores y la mantendré al día cada vez que llegue una preview.
Qué leer primero
Si estás empezando con .NET 11, empieza por los posts etiquetados con “.net 11 preview” cerca de la parte superior de la lista. Cada uno cubre los puntos destacados de una preview. Los más antiguos siguen siendo útiles porque el conjunto de características de .NET 11 es acumulativo.
Qué hay en esta página
La tabla de abajo se genera automáticamente con los posts etiquetados con alguno de: .net 11, dotnet 11, .net 11 preview, dotnet, .net. Un trabajo semanal la reordena para que la cobertura más reciente suba arriba.
Si prefieres la referencia rápida estilo cheat sheet en lugar de la cobertura cronológica, revisa los pilares complementarios “EF Core 11 cheat sheet” y “Características de C# 14” enlazados desde el índice de /pillars/.
Índice (164 posts)
2026 / 05
- .NET 11 agrega captura de salida de procesos sin interbloqueos
.NET 11 Preview 4 incorpora nuevas APIs de System.Diagnostics.Process que drenan stdout y stderr en paralelo, además de helpers de una sola línea para ejecutar y capturar, y KillOnParentExit.
- Solución: la compilación de Gradle no logró producir un archivo .apk en MAUI Android
Nueve de cada diez veces el error real de Gradle está enterrado más arriba en el log de MSBuild. La ruta a JDK 17, el workload maui-android faltante y las rutas largas en Windows son las causas raíz habituales.
- Fix: A possible object cycle was detected
System.Text.Json se niega a serializar grafos con referencias cíclicas. Configura ReferenceHandler.IgnoreCycles, proyecta a un DTO o marca el puntero hacia atrás con [JsonIgnore]. Preserve es un último recurso.
- Solución: SqlException: Timeout expired durante migraciones de EF Core
Las migraciones usan el DbContext de diseño, no tu CommandTimeout de ejecución. Configura el tiempo de espera con UseSqlServer(o => o.CommandTimeout(...)), con Command Timeout en la cadena de conexión, o con Database.SetCommandTimeout antes de Migrate().
- Solución: System.Text.Json.JsonException: The JSON value could not be converted
System.Text.Json lanza esta excepción cuando el token JSON entrante no coincide con el tipo CLR de destino. Haz que el JSON coincida con el tipo, o registra un JsonConverter o una JsonSerializerOption que los reconcilie.
- Solución: System.Security.Cryptography.CryptographicException: Keyset does not exist
La clave privada del certificado reside en un archivo de claves de Windows que la identidad del proceso no puede leer. Ajusta la ACL, carga el PFX con MachineKeySet o usa EphemeralKeySet.
- Solución: The command 'dotnet' could not be found en CI
Tu runner de CI no puede resolver dotnet porque el SDK no está instalado para ese paso, o sí lo está pero no en PATH. Usa actions/setup-dotnet, fija un global.json y exporta DOTNET_ROOT y ~/.dotnet/tools.
- Solución: System.IO.FileNotFoundException: Could not load file or assembly en una aplicación publicada
Funciona con dotnet run y falla tras dotnet publish. La DLL suele faltar en la carpeta de publicación, no en el runtime. Revise deps.json, Private en ProjectReference y el trimming.
- Solución: InvalidOperationException: Synchronous operations are disallowed
Reemplace la llamada Stream.Read o Write por ReadAsync/WriteAsync. Como último recurso, active AllowSynchronousIO en Kestrel, IIS o por solicitud con IHttpBodyControlFeature.
- Fix: RZ10012: Found markup element with unexpected name en Blazor
El compilador de Razor de Blazor emite RZ10012 cuando una etiqueta en PascalCase no tiene un tipo de componente correspondiente en el ámbito. Agrega @using para el namespace del componente en _Imports.razor, o @namespace en el componente, y recompila.
- Fix: dotnet ef migrations add falla con 'Unable to create an object of type DbContext'
Las herramientas en tiempo de diseño de EF Core no pudieron instanciar tu DbContext. Expón un host con WebApplication.CreateBuilder, apunta al startup project correcto o implementa IDesignTimeDbContextFactory.
- Fix: MSB3027 Could not copy X to Y. Exceeded retry count of 10. Failed
MSB3027 significa que MSBuild reintentó copiar un archivo 10 veces y un proceso seguía reteniendo el destino. Mata el proceso bloqueante, excluye bin/obj del antivirus o sube CopyRetryCount.
- Fix: The type or namespace name 'X' could not be found (después de añadir una referencia de proyecto)
CS0246 justo después de un ProjectReference recién añadido casi siempre es un desajuste de TargetFramework, una carpeta obj/ obsoleta o una directiva using ausente. Cinco soluciones en orden de probabilidad.
- Solución: Cannot consume scoped service 'X' from singleton 'Y'
La validación de ámbitos de ASP.NET Core lanza esto cuando un singleton capturaría una dependencia scoped durante todo el proceso. Haz que el consumidor sea scoped, o toma IServiceScopeFactory y crea un ámbito bajo demanda.
- Fix: PlatformNotSupportedException: Operation is not supported on this platform en Native AOT
Native AOT elimina el JIT y el intérprete, así que reflection emit, compilación de árboles de expresión y MakeGenericType no vistos lanzan en runtime. Localiza la llamada con IL3050 y reemplázala por un generador de código fuente o un camino prehorneado.
- Solución: Unable to resolve service for type 'X' while attempting to activate 'Y'
ASP.NET Core lanza esta excepción cuando un constructor pide un tipo que nunca se registró, se registró en el contenedor equivocado, o se agregó después de construir el host. Tres soluciones concretas cubren casi todos los casos.
- Fix: TaskCanceledException: A task was canceled en HttpClient
HttpClient lanza TaskCanceledException por tres razones distintas: timeout, cancelación del llamador o un aborto a nivel de conexión. Distínguelos con InnerException y CancellationToken.IsCancellationRequested, y luego corrige el correcto.
- La actualización a .NET 10 WebAssembly de Copilot Studio: 20% en frío, 5% en caliente
Microsoft pasó el motor WASM de Copilot Studio de .NET 8 a .NET 10. El paquete dual JIT/AOT, el fingerprinting y WasmStripILAfterAOT explican los números.
- Fix: The JSON value could not be converted to System.DateTime
System.Text.Json solo acepta cadenas ISO 8601 para DateTime. Envía 2026-05-08T14:00:00Z o registra un JsonConverter que parsee tu formato. Cadenas vacías y timestamps Unix también lanzan.
- Los workflows de Microsoft Agent Framework ahora sobreviven a reinicios de proceso gracias al stack Durable Task
Envuelve un Workflow de Agent Framework en Microsoft.Agents.AI.DurableTask y cada paso de ejecutor queda con checkpoint. Caída, redeploy, reinicio: la ejecución continúa donde se detuvo.
- Solución: The instance of entity type cannot be tracked because another instance with the same key value is already being tracked
EF Core 11 lanza esta excepción cuando dos objetos comparten clave primaria dentro de un DbContext. Desvincula el viejo o actualízalo en el lugar. AsNoTracking en la lectura previene la colisión.
- Solución: A second operation was started on this context instance before a previous operation completed
EF Core lanza esta excepción cuando dos await corren en paralelo sobre el mismo DbContext. Espera cada llamada de forma secuencial, u obtén un DbContext nuevo por unidad de trabajo concurrente vía IDbContextFactory.
- Migra un ListView de alto rendimiento de Xamarin.Forms a CollectionView de MAUI
Migración paso a paso de ListView de Xamarin.Forms 5.0 a CollectionView de .NET MAUI 11 para aplicaciones que ya exprimieron el rendimiento de ListView. Cubre reciclaje de celdas, virtualización, agrupación, pull-to-refresh, acciones contextuales, selección, ItemsLayout, EmptyView y los detalles que afectan a aplicaciones reales.
- Microsoft Agent Framework controla las llamadas a herramientas riesgosas con FunctionApprovalRequestContent
Envuelve un AIFunction en ApprovalRequiredAIFunction y el agente se detiene a mitad de la ejecución para pedir permiso. Así funciona el flujo de solicitud y respuesta en C#.
- Solución: System.InvalidOperationException: No connection string named 'DefaultConnection' could be found
Si GetConnectionString devuelve null en .NET 11, a tu appsettings.json le falta la clave, no se copia a la salida del build, o se está seleccionando el archivo de entorno equivocado. Tres comprobaciones resuelven el 95% de los casos.
- Cómo convertir T[] a ReadOnlyMemory<T> en C# (operador implícito y constructor explícito)
Tres formas de envolver un T[] en un ReadOnlyMemory<T> en .NET 11: la conversión implícita, el constructor explícito y AsMemory(). Cuándo cada una es la opción correcta.
- Agent Governance Toolkit pone una política YAML delante de cada llamada de herramienta MCP desde .NET
El nuevo paquete Microsoft.AgentGovernance de Microsoft envuelve las llamadas a herramientas MCP con un kernel de políticas, un escáner de seguridad y un sanitizador de respuestas. Esto es lo que hace cada pieza y cómo se conecta en C#.
- Cómo configurar registro estructurado con Serilog y Seq en .NET 11
Una guía completa para conectar Serilog 4.x y Seq 2025.2 en una aplicación ASP.NET Core de .NET 11: AddSerilog vs UseSerilog, registro de arranque en dos etapas, configuración JSON, enrichers, registro de solicitudes, correlación de trazas con OpenTelemetry, claves de API y los problemas de producción relacionados con buffering, retención y nivel de señal.
- Cómo usar OpenTelemetry con .NET 11 y un backend gratuito
Conecta trazas, métricas y logs de OpenTelemetry en una aplicación ASP.NET Core .NET 11 con el exportador OTLP, y luego envíalos a un backend gratuito y autoalojado: el Aspire Dashboard standalone para desarrollo local, Jaeger y SigNoz para producción autoalojada, y el OpenTelemetry Collector cuando necesites ambos.
- Cómo escribir pruebas de integración contra un SQL Server real con Testcontainers
Una guía completa para ejecutar pruebas de integración de ASP.NET Core contra un SQL Server 2022 real usando Testcontainers 4.11 y EF Core 11: cableado de WebApplicationFactory, IAsyncLifetime, sustitución del registro del DbContext, aplicación de migraciones, paralelismo, limpieza con Ryuk y trampas de CI.
2026 / 04
- Claude Code 2.1.122 te permite elegir un nivel de servicio de Bedrock desde una variable de entorno
Claude Code v2.1.122 añade la variable de entorno ANTHROPIC_BEDROCK_SERVICE_TIER, enviada como el encabezado X-Amzn-Bedrock-Service-Tier. Configúrala en flex para un 50 por ciento de descuento en las llamadas del agente o priority para respuestas más rápidas, sin tocar código del SDK.
- Cómo agregar rate limiting por endpoint en ASP.NET Core 11
Una guía completa de rate limiting por endpoint en ASP.NET Core 11: cuándo elegir fixed window vs sliding window vs token bucket vs concurrency, en qué se diferencian RequireRateLimiting y [EnableRateLimiting], cómo particionar por usuario o IP, el callback OnRejected, y la trampa de despliegue distribuido en la que cae todo el mundo.
- Cómo usar el nuevo tipo System.Threading.Lock en .NET 11
System.Threading.Lock llegó en .NET 9 y es la primitiva de sincronización por defecto en .NET 11 y C# 14. Esta guía muestra cómo migrar desde lock(object), cómo funciona EnterScope y los problemas alrededor de await, dynamic y los targets antiguos.
- Cómo escribir un generador de código fuente para INotifyPropertyChanged
Una guía completa para construir tu propio generador de código fuente incremental para INotifyPropertyChanged en C# 14 y .NET 11: la pipeline IIncrementalGenerator, atributos marcadores, salida de partial class, el patrón SetProperty y cómo mantener la compatibilidad con AOT.
- Como detectar cuando un archivo termina de escribirse en .NET
FileSystemWatcher dispara Changed antes de que el escritor termine. Tres patrones confiables para .NET 11 para saber que un archivo esta totalmente escrito: abrir con FileShare.None, hacer debounce con estabilizacion de tamano y el truco de renombrado del lado del productor que evita el problema por completo.
- Cómo usar SearchValues<T> correctamente en .NET 11
SearchValues<T> supera a IndexOfAny entre 5x y 250x, pero solo si lo usas como espera el runtime. La regla de cachear como static, la trampa de StringComparison, cuándo no vale la pena, y el truco de inversión con IndexOfAnyExcept que nadie documenta.
- SkiaSharp 4.0 Preview 1: SKPath inmutable, fuentes variables y un nuevo co-mantenedor
SkiaSharp 4.0 Preview 1 llega con Uno Platform como co-mantenedor junto al equipo de .NET. SKPath se vuelve inmutable detrás de un nuevo SKPathBuilder, y HarfBuzzSharp obtiene control completo de ejes de fuentes variables OpenType.
- Cómo subir un archivo grande mediante streaming a Azure Blob Storage
Sube archivos de varios GB a Azure Blob Storage desde .NET 11 sin cargarlos en memoria. BlockBlobClient.UploadAsync con StorageTransferOptions, MultipartReader para subidas en ASP.NET Core, y las trampas de buffering que dejan tu carga en el LOH.
- Cómo usar Native AOT con APIs mínimas de ASP.NET Core
Un recorrido completo para .NET 11 sobre cómo enviar una API mínima de ASP.NET Core con Native AOT: PublishAot, CreateSlimBuilder, JSON con generador de código fuente, la limitación de AddControllers, advertencias IL2026 / IL3050, y EnableRequestDelegateGenerator para proyectos de biblioteca.
- Cómo añadir un filtro global de excepciones en ASP.NET Core 11
Guía completa de manejo global de excepciones en ASP.NET Core 11: por qué IExceptionFilter es la herramienta equivocada, cómo IExceptionHandler y UseExceptionHandler funcionan juntos, respuestas con ProblemDetails, cadenas de varios manejadores y el cambio disruptivo de .NET 10 sobre la supresión de diagnósticos.
- Cómo construir un servidor MCP personalizado en C# sobre .NET 11
Construye un servidor Model Context Protocol funcional en C# 14 / .NET 11 usando el SDK oficial ModelContextProtocol 1.2. Cubre el transporte stdio, los atributos [McpServerTool], inyección de dependencias, la trampa del logging por stderr y el registro con Claude Code, Claude Desktop y VS Code.
- Cómo hacer pruebas unitarias de código que usa HttpClient
Una guía completa para probar HttpClient en .NET 11: por qué no debes mockear HttpClient directamente, cómo escribir un HttpMessageHandler de stub, intercambiar el handler primario con IHttpClientFactory, verificar reintentos de Polly, y la opción WireMock.Net.
- Aspire 13.2.4 corrige CVE-2026-40894: DoS por encabezado baggage en OpenTelemetry .NET
Aspire 13.2.4 incluye una actualización de OpenTelemetry para CVE-2026-40894, una amplificación de asignaciones en Gen0 al analizar los propagadores baggage, B3 y Jaeger. Actualiza OpenTelemetry.Api y OpenTelemetry.Extensions.Propagators a 1.15.3 incluso si no usas Aspire.
- Cómo perfilar una app .NET con dotnet-trace y leer su salida
Guía completa para perfilar apps .NET 11 con dotnet-trace: instalación, elección del perfil correcto, captura desde el inicio y lectura del .nettrace en PerfView, Visual Studio, Speedscope o Perfetto.
- Cómo usar Channels en lugar de BlockingCollection en C#
System.Threading.Channels es el reemplazo asíncrono de BlockingCollection en .NET 11. Esta guía muestra cómo migrar, cómo elegir entre acotado y no acotado, y cómo manejar contrapresión, cancelación y apagado controlado sin interbloqueos.
- Cómo escribir un JsonConverter personalizado en System.Text.Json
Una guía completa para escribir un JsonConverter<T> personalizado para System.Text.Json en .NET 11: cuándo realmente necesitas uno, cómo navegar correctamente Utf8JsonReader, cómo manejar genéricos con JsonConverterFactory y cómo mantenerlo compatible con AOT.
- .NET 10 en Ubuntu 26.04: tags de contenedor resolute y Native AOT en el archive
Ubuntu 26.04 Resolute Raccoon incluye .NET 10 en el archive, introduce los tags de contenedor -resolute para reemplazar -noble, y empaqueta el herramental de Native AOT vía dotnet-sdk-aot-10.0.
- Cómo generar código cliente fuertemente tipado desde una especificación OpenAPI en .NET 11
Usa Kiota, el generador oficial de OpenAPI de Microsoft, para producir un cliente C# fluent y fuertemente tipado desde cualquier especificación OpenAPI. Paso a paso: instalar, generar, conectar a la inyección de dependencias de ASP.NET Core y gestionar la autenticación.
- Como transmitir un archivo desde un endpoint de ASP.NET Core sin buffering
Sirve archivos grandes desde ASP.NET Core 11 sin cargarlos en memoria. Tres niveles: PhysicalFileResult para archivos en disco, Results.Stream para flujos arbitrarios y Response.BodyWriter para contenido generado -- con codigo para cada caso.
- Cómo cancelar una Task de larga duración en C# sin interbloquear
Cancelación cooperativa con CancellationToken, CancelAsync, Task.WaitAsync y tokens enlazados en .NET 11. Más los patrones de bloqueo que convierten una cancelación limpia en un interbloqueo.
- Cómo usar IAsyncEnumerable<T> con EF Core 11
Las consultas de EF Core 11 implementan IAsyncEnumerable<T> directamente. Aquí está cómo hacer streaming de filas con await foreach, cuándo preferirlo sobre ToListAsync, y las trampas alrededor de conexiones, tracking y cancelación.
- .NET 10.0.7 sale out-of-band para arreglar CVE-2026-40372 en ASP.NET Core Data Protection
Una falla de validación HMAC en Microsoft.AspNetCore.DataProtection 10.0.0 a 10.0.6 deja que atacantes falsifiquen ciphertexts. .NET 10.0.7 es el fix obligatorio.
- El Debugger Agent de Visual Studio 18.5 convierte a Copilot en un compañero vivo de caza de bugs
Visual Studio 18.5 GA incluye un workflow guiado de Debugger Agent en Copilot Chat que forma una hipótesis, pone breakpoints, acompaña un repro, valida contra estado en runtime y propone un fix.
- Agent Skills aterrizan en Visual Studio 2026 18.5: Copilot autodescubre SKILL.md desde tu repo
Visual Studio 2026 18.5.0 deja a GitHub Copilot cargar Agent Skills desde .github/skills, .claude/skills, y ~/.copilot/skills. Packs reutilizables de instrucciones SKILL.md viajan con tu repo.
- RyuJIT poda más bounds checks en .NET 11 Preview 3: index-from-end y i + constante
.NET 11 Preview 3 enseña a RyuJIT a eliminar bounds checks redundantes en accesos consecutivos index-from-end y en patrones i + constante < length, reduciendo presión de branches en loops apretados.
- RegexOptions.AnyNewLine aterriza en .NET 11 Preview 3: anchors Unicode-aware sin los hacks de \r?
.NET 11 Preview 3 agrega RegexOptions.AnyNewLine para que ^, $, \Z, y . reconozcan toda secuencia de newline Unicode, incluyendo \r\n, NEL, LS, y PS, con \r\n tratado como un break atómico.
- Aspire 13.2 --isolated: corre instancias paralelas de AppHost sin colisiones de puertos
Aspire 13.2 incluye un flag --isolated que le da a cada aspire run sus propios puertos random y su store de secrets. Desbloquea trabajo multi-checkout, worktrees de agentes, y tests de integración que necesitan un AppHost vivo.
- .NET 11 Preview 3: dotnet run -e setea variables de entorno sin launch profiles
dotnet run -e en .NET 11 Preview 3 pasa variables de entorno directo desde la CLI y las expone como items RuntimeEnvironmentVariable de MSBuild.
- dotnet watch en .NET 11 Preview 3: hosts Aspire, crash recovery, y Ctrl+C más sano
dotnet watch gana integración con Aspire app host, relanzamiento automático después de crashes, y manejo de Ctrl+C arreglado para apps desktop Windows en .NET 11 Preview 3.
- Construyendo un motor de base de datos de latencia de microsegundos en C#
El proyecto Typhon de Loic Baumann apunta a commits ACID de 1-2 microsegundos usando ref structs, intrínsecos de hardware y memoria fijada, demostrando que C# puede competir a nivel de programación de sistemas.
- Cómo los parámetros nvarchar default de Dapper matan silenciosamente tus índices de SQL Server
Los strings de C# enviados vía Dapper hacen default a nvarchar(4000), forzando a SQL Server a implicit conversions y scans completos de índice. Acá cómo arreglarlo con DbType.AnsiString.
- GitHub Copilot Modernization: el reporte de assessment es el producto real
GitHub Copilot Modernization se presenta como un loop Assess, Plan, Execute para migrar apps .NET legacy. La fase de assessment es donde vive el valor: un reporte de inventario, blockers categorizados, y guía de remediación a nivel de archivo que puedes diff como código.
- Hot Reload auto-restart en Visual Studio 2026: los rude edits dejan de matar tu sesión de debug
Visual Studio 2026 agrega HotReloadAutoRestart, un opt-in a nivel de proyecto que reinicia la app cuando un rude edit de otra forma terminaría la sesión de debug. Especialmente útil para proyectos Razor y Aspire.
- EF Core 11 te permite crear y aplicar una migración en un solo comando
El comando dotnet ef database update ahora acepta --add para crear y aplicar una migración en un solo paso. Aquí está cómo funciona, por qué importa para contenedores y .NET Aspire, y qué tener en cuenta.
- EF Core 11 agrega búsqueda vectorial nativa de SQL Server con índices DiskANN
EF Core 11 Preview 2 soporta VECTOR_SEARCH() de SQL Server 2025 y los índices vectoriales DiskANN directamente desde LINQ. Aquí está cómo configurar el índice, ejecutar consultas aproximadas, y qué cambia del enfoque VectorDistance de EF Core 10.
- Rider 2026.1 incluye un visor de ASM para la salida de JIT, ReadyToRun y NativeAOT
Rider 2026.1 agrega un plugin .NET Disassembler que te permite inspeccionar el código máquina generado por los compiladores JIT, ReadyToRun y NativeAOT sin salir del IDE.
- Los tipos de unión de C# 15 están aquí: las uniones de tipo llegan en .NET 11 Preview 2
C# 15 introduce la palabra clave union para uniones de tipo con coincidencia de patrones exhaustiva y conversiones implícitas. Disponible ahora en .NET 11 Preview 2.
- Kestrel deja las excepciones de su parser HTTP/1.1 en .NET 11
El parser de solicitudes HTTP/1.1 de Kestrel en .NET 11 reemplaza BadHttpRequestException con un struct de resultado, reduciendo la sobrecarga de solicitudes malformadas hasta en un 40%.
- Microsoft Agent Framework 1.0: construyendo agentes de IA en C# puro
Microsoft Agent Framework llega a 1.0 con APIs estables, conectores multi-proveedor, orquestación multi-agente, e interoperabilidad A2A/MCP. Aquí está cómo se ve en la práctica en .NET 10.
2026 / 03
- Generative AI for Beginners .NET v2: reconstruido para .NET 10 con Microsoft.Extensions.AI
El curso gratuito de IA generativa para desarrolladores .NET de Microsoft entrega la Versión 2, reconstruida para .NET 10 y migrada de Semantic Kernel al patrón IChatClient de Microsoft.Extensions.AI.
- Cómo se ven realmente 878 PRs de Copilot Coding Agent en dotnet/runtime
El equipo .NET comparte diez meses de datos reales sobre correr Copilot Coding Agent de GitHub en dotnet/runtime: 878 PRs, una tasa de merge del 67.9%, y lecciones claras sobre dónde ayuda el desarrollo asistido por IA y dónde aún se queda corto.
2026 / 02
- Idea para C# 14: los interceptores podrían hacer que la generación de código fuente de System.Text.Json se sienta automática
Una discusión de la comunidad propuso usar interceptores de C# 14 para reescribir las llamadas a JsonSerializer de modo que utilicen automáticamente un JsonSerializerContext generado, manteniendo la generación de código fuente compatible con AOT y con sitios de llamada más limpios.
- Polars.NET: un motor de DataFrame en Rust para .NET 10 que se apoya en LibraryImport
Un nuevo proyecto Polars.NET es tendencia después de un post de la comunidad del 6 de febrero de 2026. El titular es simple: una API DataFrame amigable con .NET respaldada por Rust Polars, con un ABI C estable e interop basada en LibraryImport para mantener el overhead bajo.
- .NET Framework 3.5 se vuelve independiente en las nuevas builds de Windows: qué se rompe
A partir de Windows 11 Build 27965, .NET Framework 3.5 ya no es un componente opcional de Windows. Esto es lo que se rompe en CI, aprovisionamiento e imágenes maestras, y cómo arreglarlo.
- TrailBase v0.23.7: una alternativa a Firebase de un solo binario para .NET 10 y Flutter
TrailBase es un backend de código abierto y ejecutable único, construido sobre Rust, SQLite y Wasmtime. La versión 0.23.7 trae correcciones de UI y mejor manejo de errores.
2026 / 01
- Spam de solicitudes “become owner” en NuGet: qué hacer (y qué cerrar) en .NET 9/.NET 10
Defiende tus paquetes .NET contra el spam de solicitudes de propiedad en NuGet. Lock files, Package Source Mapping y prácticas de Central Package Management para .NET 9 y .NET 10.
- Scalar en ASP.NET Core: por qué tu token Bearer es ignorado (.NET 10)
Si tu token Bearer funciona en Postman pero no en Scalar, el problema probablemente sea tu documento OpenAPI. Aquí está cómo declarar un esquema de seguridad correcto en .NET 10.
- TreatWarningsAsErrors sin sabotear las compilaciones de dev (.NET 10)
Cómo aplicar TreatWarningsAsErrors en compilaciones Release y CI manteniendo Debug flexible para el desarrollo local en .NET 10, usando Directory.Build.props.
- Perfetto + dotnet-trace: un ciclo práctico de profiling para .NET 9/.NET 10
Un ciclo práctico de profiling para .NET 9 y .NET 10: captura trazas con dotnet-trace, visualízalas en Perfetto e itera sobre problemas de CPU, GC e hilos del thread pool.
- Una app de notas "solo local" en WinUI 3 es el tipo correcto de aburrida: offline-first, SQLite, primero el teclado
Miyanyedi Quick Note es una app de notas en WinUI 3 + SQLite que es offline-first y respetuosa con la privacidad. Aquí va por qué solo local es una característica, más un snippet mínimo de SQLite para apps de escritorio en .NET 8.
- Un gestor SSH WPF open-source muestra un patrón práctico: xterm.js en WebView2, secretos vía DPAPI
SshManager es un gestor SSH WPF open-source construido sobre .NET 8. Muestra un patrón práctico: xterm.js dentro de WebView2 para el renderizado de la terminal, EF Core + SQLite para persistencia y DPAPI para proteger credenciales locales.
- CV Shortlist: un SaaS .NET 10 con IA se volvió open-source, y el stack vale la pena estudiarlo
CV Shortlist es un SaaS .NET 10 open-source que combina Azure Document Intelligence con un modelo de OpenAI. El stack, la disciplina de configuración y la frontera de integración con IA valen la pena estudiarlos.
- ModularPipelines V3: escribe pipelines de CI en C#, depura localmente y deja de niñear YAML
ModularPipelines V3 te permite escribir pipelines de CI en C# en lugar de YAML. Ejecútalos localmente con dotnet run, obtén seguridad en tiempo de compilación y depura con puntos de interrupción.
- Despliega una app .NET con Podman + systemd: reinicios estables, logs reales, sin magia
Despliega servicios .NET 9 y .NET 10 en una VM Linux usando Podman y systemd. Consigue reinicios estables, logs reales vía journald y una app en contenedor administrada como un servicio de verdad -- sin Kubernetes.
- gRPC en contenedores parece difícil en .NET 9 y .NET 10: 4 trampas que puedes corregir
Cuatro trampas comunes al alojar gRPC en contenedores con .NET 9 y .NET 10: desajustes de protocolo HTTP/2, confusión sobre la terminación de TLS, sondeos de salud rotos y mala configuración del proxy -- con la corrección de cada una.
- Microsoft `mcp`: cableando servidores Model Context Protocol desde C# en .NET 10
Cómo cablear servidores Model Context Protocol (MCP) en C# sobre .NET 10 usando microsoft/mcp. Cubre contratos de herramientas, validación de entradas, autenticación, observabilidad y patrones listos para producción.
- Monitorea trabajos en segundo plano en .NET 9 y .NET 10 sin Hangfire: salud + métricas + alertas
Monitorea trabajos BackgroundService en .NET 9 y .NET 10 sin Hangfire usando health checks de heartbeat, métricas de duración y alertas de fallo, con un ejemplo de código práctico.
- Las apps basadas en archivos de .NET 10 ahora soportan scripts multi-archivo: llega `#:include`
.NET 10 añade soporte para #:include en aplicaciones basadas en archivos, permitiendo que los scripts ejecutados con dotnet run abarquen varios archivos .cs sin crear un proyecto completo.
- SBOM para .NET en Docker: deja de obligar a una sola herramienta a verlo todo
Cómo rastrear las dependencias de NuGet y los paquetes del SO del contenedor de una imagen Docker de .NET usando CycloneDX, Syft y Dependency-Track -- y por qué un solo SBOM no es suficiente.
- System.CommandLine v2, pero con el cableado ya hecho: `Albatross.CommandLine` v8
Albatross.CommandLine v8 se basa en System.CommandLine v2 con un generador de código fuente, integración de DI y una capa de hosting para eliminar el código repetitivo de CLI en aplicaciones .NET 9 y .NET 10.
- Wave-IDE en 2026: la mínima plomería de Roslyn detrás de un IDE de WinForms en .NET 10
Wave-IDE muestra que WinForms y Roslyn en .NET 10 alcanzan para construir un IDE de C# funcional. Aquí está la plomería mínima para análisis incremental, autocompletado y diagnósticos.
- AWS Lambda soporta .NET 10: qué verificar antes de cambiar el runtime
AWS Lambda ahora soporta .NET 10, pero la actualización del runtime no es la parte difícil. Aquí hay una checklist práctica que cubre cold starts, trimming, native AOT y forma de despliegue.
- ¿.NET 10 hizo explotar tu lista de NICs? Filtrar GetAllNetworkInterfaces() sin engañarte a ti mismo
Cómo filtrar GetAllNetworkInterfaces() en .NET 10 cuando los adaptadores virtuales de Hyper-V, Docker, WSL y VPNs inundan la lista. Incluye un filtro en dos etapas con compensaciones explícitas.
- Queryable Encryption + búsqueda vectorial en el proveedor MongoDB EF Core (y por qué importa para .NET 9 y .NET 10)
El proveedor MongoDB EF Core ahora soporta Queryable Encryption y búsqueda vectorial. Esto es lo que significa para apps .NET 9 y .NET 10 que ya usan EF Core.
- SwitchMediator v3: un mediador con cero asignaciones que sigue siendo amigable con AOT
SwitchMediator v3 apunta a un dispatch sin asignaciones y compatible con AOT para servicios CQRS en .NET 9 y .NET 10. Esto es lo que significa y cómo medir tu propio mediador.
- Rendimiento en .NET 10: SearchValues
Usa SearchValues en .NET 10 para búsqueda multi-cadena de alto rendimiento. Reemplaza bucles foreach con coincidencias aceleradas por SIMD usando los algoritmos Aho-Corasick y Teddy.
- Streaming de tareas con Task.WhenEach de .NET 9
.NET 9 introduce Task.WhenEach, que devuelve un IAsyncEnumerable de tareas a medida que se completan. Aquí está cómo simplifica el procesamiento de resultados paralelos a medida que llegan.
- C# 13: el fin de las asignaciones de `params`
C# 13 finalmente elimina la asignación oculta de arrays detrás de params. Ahora puedes usar params con Span, ReadOnlySpan, List y otros tipos de colección para métodos variádicos sin asignaciones.
- .NET 9: el fin de lock(object)
.NET 9 introduce System.Threading.Lock, una primitiva de sincronización ligera y dedicada que reemplaza lock(object) con mejor rendimiento y una intención más clara.
- Optimizando el conteo de frecuencias con LINQ CountBy
Reemplaza GroupBy por CountBy en .NET 9 para un conteo de frecuencias más limpio y eficiente. Reduce las asignaciones de O(N) a O(K) al saltarse las estructuras intermedias de agrupación.
2025 / 04
- .NET 10: Asignación en pila de arreglos de tipos por valor
En .NET 10, el JIT puede asignar en pila arreglos pequeños de tamaño fijo de tipos por valor, eliminando asignaciones en el heap y ofreciendo hasta un 60% más de rendimiento frente a .NET 9.
- Novedades en .NET MAUI 10
Un resumen de las nuevas características, mejoras y cambios disruptivos en .NET MAUI 10, lanzado junto con .NET 10 y C# 14 en noviembre de 2025.
- Cómo cambiar el color del icono del SearchBar en .NET MAUI
Cómo cambiar el color del icono del SearchBar en .NET MAUI usando la nueva propiedad SearchIconColor introducida en .NET 10.
- C# 14: Parámetros simplificados con modificadores en lambdas
C# 14 permite usar los modificadores ref, out, in, scoped y ref readonly en parámetros de lambda con tipo implícito, eliminando la necesidad de declarar explícitamente los tipos de los parámetros.
- Constructores y eventos parciales en C# 14
C# 14 te permite declarar constructores de instancia y eventos como miembros parciales, dividiendo las definiciones entre archivos para una generación de código más limpia y una mejor separación de responsabilidades.
- C# 14: soporte de nameof para tipos genéricos no enlazados
C# 14 mejora la expresión nameof para admitir tipos genéricos no enlazados como List<> y Dictionary<,>, eliminando la necesidad de argumentos de tipo de relleno.
- Conversiones implícitas de Span en C# 14: soporte de primera clase para Span y ReadOnlySpan
C# 14 añade conversiones implícitas integradas entre Span, ReadOnlySpan, arreglos y strings, permitiendo APIs más limpias, mejor inferencia de tipos y menos llamadas manuales a AsSpan().
- .NET 10: mejoras de rendimiento en la enumeración de arreglos (desabstracción de arreglos en el JIT)
En .NET 10, el compilador JIT reduce la sobrecarga de iterar arreglos a través de interfaces. Mira los benchmarks que comparan .NET 9 vs .NET 10 con foreach, IEnumerable y análisis condicional de escape.
- C# 14: la palabra clave field y las propiedades respaldadas por field
C# 14 introduce la palabra clave contextual field en los accesores de propiedades, lo que te permite añadir lógica personalizada a las auto-properties sin declarar un campo de respaldo aparte.
2025 / 01
- Rendimiento en .NET: ToList vs ToArray
.NET 9 mejora considerablemente el rendimiento de ToArray usando InlineArray, haciéndolo más rápido y eficiente en memoria que ToList. Mira los benchmarks comparando .NET 8 vs .NET 9.
- C# 13: Usa colecciones params con cualquier tipo de colección reconocido
C# 13 extiende el modificador params más allá de los arrays para soportar Span, ReadOnlySpan, IEnumerable y otros tipos de colecciones, reduciendo el código repetitivo y mejorando la flexibilidad.
- Cómo cambiar a C# 13
Cómo arreglar 'Feature is not available in C# 12.0' y cambiar tu proyecto a C# 13 modificando el target framework o configurando LangVersion en tu archivo .csproj.
2024 / 12
- Qué hay de nuevo en C# 14.0
Un resumen de todas las nuevas características de C# 14.0, incluyendo la palabra clave field, los miembros de extensión, la asignación condicional de null, las conversiones implícitas de span y más.
- Historial de versiones del lenguaje C#
La evolución de C# lo ha transformado en un lenguaje moderno y de alto rendimiento. Esta guía recorre cada hito importante. Los primeros años (C# 1.0 - 1.2). C# se lanzó en 2002 como lenguaje principal para .NET Framework. Se sentía como Java pero con un enfoque en el desarrollo en Windows. La versión 1.2 llegó poco después con pequeñas...
- Qué hay de nuevo en .NET 10
Qué hay de nuevo en .NET 10: versión LTS con 3 años de soporte, nuevas optimizaciones del JIT, devirtualización de arrays, mejoras en la asignación de pila y más.
2024 / 04
- .NET 8 ToFrozenDictionary: Dictionary vs FrozenDictionary
Convierte un Dictionary a un FrozenDictionary con `ToFrozenDictionary()` en .NET 8 para lecturas más rápidas. Benchmark, cuándo usarlo y la contrapartida en tiempo de compilación.
2023 / 11
- Cómo añadir AdMob a tu app de MAUI
Aprende a mostrar anuncios banner de AdMob en tu app de .NET MAUI tanto en Android como en iOS, con configuración paso a paso e implementaciones de handlers específicas por plataforma.
- Empezando con .NET Aspire
Una guía paso a paso para construir tu primera aplicación .NET Aspire, cubriendo la estructura del proyecto, el descubrimiento de servicios y el dashboard de Aspire.
- Cómo instalar .NET Aspire (dotnet workload install aspire)
Instala .NET Aspire mediante `dotnet workload install aspire`. Configuración paso a paso de .NET 8, el workload de Aspire y Docker en Windows, macOS y Linux.
- ¿Qué es .NET Aspire?
Una visión general de .NET Aspire, el framework orientado a la nube para construir aplicaciones distribuidas escalables, abarcando orquestación, componentes y herramientas.
- C# Elegir aleatoriamente elementos de una lista
En C#, puedes seleccionar aleatoriamente elementos de una lista usando Random.GetItems, un método introducido en .NET 8. Aprende cómo funciona con ejemplos prácticos.
- Cómo publicar un contenedor como tar.gz en .NET
Aprende a publicar un contenedor de .NET 8 como un archivo tar.gz usando la propiedad ContainerArchiveOutputPath con dotnet publish.
- MAUI: Cómo registrar handlers en una biblioteca
Aprende a registrar view handlers y servicios desde dentro de una biblioteca de .NET MAUI usando el patrón builder y los métodos de extensión de MauiAppBuilder.
- Cómo solucionar: 'Point' no tiene un tamaño predefinido, por lo tanto sizeof solo se puede usar en un contexto unsafe
Soluciona el error de C# en el que sizeof no se puede usar con Point fuera de un contexto unsafe. Dos soluciones: habilitar código unsafe o usar Marshal.SizeOf.
- C# Acceder al campo de respaldo de una propiedad privada usando Unsafe Accessor
Usa UnsafeAccessorAttribute en .NET 8 para acceder a los campos de respaldo autogenerados de propiedades automáticas privadas en C# sin reflexión.
- C# Archivos ZIP a Stream
.NET 8 incluye nuevas sobrecargas de CreateFromDirectory y ExtractToDirectory que te permiten crear y extraer archivos ZIP directamente desde y hacia un Stream, sin escribir en disco.
- Rendimiento de .NET 8: GetGenericTypeDefinition 10 veces más rápido
Las pruebas de GetGenericTypeDefinition en .NET 8 frente a .NET 7 muestran un rendimiento casi 10 veces mayor. Mira el código del benchmark y los resultados con BenchmarkDotNet.
- Cómo tomar una captura de pantalla en .NET core
Aprende a capturar una imagen de todo tu escritorio desde una aplicación de consola .NET usando System.Windows.Forms. Solución solo para Windows que cubre todos los monitores.
- C# Cómo actualizar un campo readonly usando UnsafeAccessor
Aprende a actualizar un campo readonly en C# usando UnsafeAccessor, una alternativa a la reflexión sin la penalización de rendimiento. Disponible en .NET 8.
- Rendimiento de .NET 8: UnsafeAccessor vs. Reflection
Benchmark de UnsafeAccessor frente a Reflection en .NET 8. Mira cómo UnsafeAccessor logra rendimiento sin sobrecarga comparado con la reflexión tradicional.
2023 / 10
- C# UnsafeAccessor: miembros privados sin reflexión (.NET 8)
Usa el atributo `[UnsafeAccessor]` en .NET 8 para leer campos privados y llamar a métodos privados sin sobrecarga, sin reflexión y totalmente compatible con AOT.
- C# Cómo marcar características como experimentales
A partir de C# 12, un nuevo ExperimentalAttribute te permite marcar tipos, métodos, propiedades o ensamblados como experimentales. Aprende a usarlo con diagnosticId, etiquetas pragma y UrlFormat.
- C# parámetros ref readonly
El modificador ref readonly en C# ofrece una forma más transparente de pasar referencias de solo lectura. Aprende cómo mejora al modificador in con mejores restricciones y visibilidad para quien llama.
- C# ¿Cómo barajar un array?
La forma más sencilla de barajar un array en C# es usando Random.Shuffle, introducido en .NET 8. Funciona in-place tanto con arrays como con spans.
- System.Text.Json Cómo modificar un type info resolver existente
Usa el nuevo método de extensión WithAddedModifier en .NET 8 para modificar fácilmente cualquier contrato de serialización IJsonTypeInfoResolver sin crear un resolver nuevo desde cero.
- HttpClient obtener JSON como AsyncEnumerable
El nuevo método de extensión GetFromJsonAsAsyncEnumerable en .NET 8 deserializa el JSON de la respuesta HTTP en un IAsyncEnumerable. Aprende a usarlo con await foreach.
- JsonNode actualizaciones de API en .NET 8
Explora las nuevas APIs añadidas en .NET 8 a JsonNode y JsonArray, incluidas GetValueKind, GetPropertyName, GetElementIndex, ReplaceWith y ParseAsync.
- Clonado profundo e igualdad profunda de un JsonNode
Aprende a usar los nuevos métodos DeepClone() y DeepEquals() de JsonNode en .NET 8 para clonar y comparar nodos JSON en profundidad.
- System.Text.Json desactivar la serialización basada en reflexión
Aprende a desactivar la serialización basada en reflexión de System.Text.Json a partir de .NET 8 para aplicaciones trimmed y native AOT usando la propiedad JsonSerializerIsReflectionEnabledByDefault.
- Añadir/quitar TypeInfoResolver de un JsonSerializerOptions existente
Aprende a añadir o quitar instancias de TypeInfoResolver en un JsonSerializerOptions existente usando la nueva propiedad TypeInfoResolverChain en .NET 8.
- WPF Evitar que la selección del cuadro de diálogo se añada a recientes
Evita que las selecciones del cuadro de diálogo de archivos en WPF aparezcan en los recientes del Explorador de Windows y en el menú Inicio estableciendo AddToRecent en false en .NET 8.
- WPF estados individuales de diálogos usando ClientGuid
Usa la propiedad ClientGuid en .NET 8 para persistir estados individuales de los diálogos, como tamaño de ventana, posición y última carpeta usada, en los diálogos de archivos de WPF.
- C# 12 Interceptors
Aprende sobre los interceptors de C# 12, una característica experimental del compilador en .NET 8 que te permite reemplazar llamadas a métodos en tiempo de compilación usando el atributo InterceptsLocation.
- WPF Limitar el árbol de carpetas del OpenFileDialog a una carpeta concreta
Aprende a limitar el árbol de carpetas del OpenFileDialog de WPF a una carpeta raíz concreta usando la propiedad RootDirectory en .NET 8.
- Aceleración por hardware de WPF en RDP
Aprende a habilitar la aceleración por hardware de WPF sobre RDP en .NET 8 para mejorar el rendimiento y conseguir una experiencia de escritorio remoto más fluida.
- WPF Open / Select Folder Dialog (OpenFolderDialog de .NET 8)
Usa el nuevo `OpenFolderDialog` de .NET 8 en WPF para que los usuarios puedan abrir y seleccionar una o varias carpetas. Sustituye al antiguo apaño con FolderBrowserDialog de WinForms.
2023 / 09
- Implementation type Data.AppDbContext can't be converted to service type Microsoft.AspNetCore.Identity.IUserStore
Arregla el error de ASP.NET Core Identity en el que AppDbContext no se puede convertir a IUserStore añadiendo AddEntityFrameworkStores a tu configuración de identidad.
- .NET 8 serializar propiedades de jerarquías de interfaces
.NET 8 añade soporte para serializar propiedades de jerarquías de interfaces, incluyendo todas las propiedades de todas las interfaces según el tipo de la variable declarada.
- .NET 8 deserializar en propiedades no públicas
Aprende a deserializar JSON en propiedades no públicas en .NET 8 usando el atributo JsonInclude y constructores parametrizados.
- .NET 8 cómo usar JsonStringEnumConverter con native AOT
Aprende a usar el nuevo JsonStringEnumConverter<TEnum> en .NET 8 para una serialización de enums compatible con native AOT en System.Text.Json.
- The type or namespace name InterceptsLocationAttribute could not be found
Cómo arreglar el error CS0246 para InterceptsLocationAttribute en los interceptors de C# definiendo tú mismo el atributo.
- .NET 8 marcar JsonSerializerOptions como readonly
Aprende a marcar instancias de JsonSerializerOptions como de solo lectura en .NET 8 usando MakeReadOnly y a comprobar la propiedad IsReadOnly.
- .NET 8 serialización de Half, Int128 y UInt128
System.Text.Json en .NET 8 añade soporte integrado de serialización para los tipos numéricos Half, Int128 y UInt128.
- .NET 8 Memory<byte> se serializa como base64
A partir de .NET 8, tanto Memory<byte> como ReadOnlyMemory<byte> se serializan como cadenas Base64, mientras que otros tipos como Memory<int> siguen como arrays JSON.
- .NET 8 incluir miembros no públicos en la serialización JSON
Aprende a incluir propiedades private, protected e internal en la serialización JSON en .NET 8 usando el atributo JsonInclude.
- dotnet workload clean
Usa el comando `dotnet workload clean` para eliminar packs de workload de .NET sobrantes tras una actualización del SDK o de Visual Studio: cuándo usarlo, qué elimina y aspectos a tener en cuenta.
- .NET 8 deserializar en propiedades de solo lectura
Aprende a deserializar JSON en propiedades de solo lectura sin setter en .NET 8 usando JsonObjectCreationHandling o JsonSerializerOptions.
- .NET 8 manejar miembros no esperados al deserializar JSON
Aprende a lanzar excepciones por propiedades JSON sin mapear durante la deserialización en .NET 8 usando JsonUnmappedMemberHandling.
2023 / 08
- Cómo instalar dotnet script
dotnet script te permite ejecutar scripts de C# (.CSX) desde la CLI de .NET. El único requisito es tener instalado .NET 6 o más reciente en tu máquina. Puedes usar el siguiente comando para instalar dotnet-script de forma global: Luego, para ejecutar un archivo de script, basta con llamar a dotnet script <file_path>, como en el siguiente ejemplo: Cómo...
- C# ¿Cómo esperar a que termine un proceso?
Puedes usar el método WaitForExit para esperar a que el proceso se complete. Tu código esperará de forma síncrona hasta que el proceso termine y entonces continuará la ejecución. Veamos un ejemplo: El código anterior inicia un nuevo proceso cmd.exe y ejecuta el comando timeout 5. La llamada a process.WaitForExit() obligará a tu programa...
- .NET 8 JsonNamingPolicy: SnakeCaseLower y KebabCaseLower (System.Text.Json)
Usa los nuevos `JsonNamingPolicy.SnakeCaseLower` (y SnakeCaseUpper, KebabCaseLower, KebabCaseUpper) de .NET 8 para serializar JSON en snake_case / kebab-case con System.Text.Json, sin necesidad de un converter personalizado.
2023 / 06
- dotnet new api -aot: '-aot' is not a valid option
Soluciona el error '-aot is not a valid option' usando la sintaxis correcta con doble guion: dotnet new api --aot.
- Cómo empezar a programar con C#
Una guía para principiantes sobre cómo empezar a programar en C#, desde la instalación de Visual Studio hasta escribir tu primer programa y encontrar recursos para aprender.
- Novedades de .NET 8
.NET 8 fue lanzado el 14 de noviembre de 2023 como versión LTS (Long Term Support), lo que significa que seguirá recibiendo soporte, actualizaciones y correcciones de errores durante al menos tres años desde su lanzamiento. Como es habitual, .NET 8 trae soporte para una nueva versión del lenguaje C#, en este caso C# 12.