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 (193 posts)
2026 / 06
- BackgroundService vs IHostedService vs Hangfire para tareas en segundo plano en .NET 11
Elige BackgroundService para bucles en proceso, IHostedService puro cuando necesitas control fino del ciclo de vida, y Hangfire cuando las tareas deben sobrevivir a un reinicio. Una matriz de decisión con código y el detalle que decide por ti.
- .NET 11 eleva la linea base minima de CPU a x86-64-v2
.NET 11 Preview 4 deja de admitir chips x86/x64 anteriores a 2013 y sube la linea base del JIT a x86-64-v2. Esto es lo que se rompe, por que y como verificar tu hardware antes de actualizar.
- Solución: ObjectDisposedException: Cannot access a disposed context instance
Tu tarea fire-and-forget capturó un DbContext con ámbito de solicitud que el ámbito de DI ya había liberado. Resuelve un contexto nuevo dentro de la tarea con IServiceScopeFactory o IDbContextFactory.
- EF Core 11 Preview 4: Deja de reescribir --project y --startup-project con .config/dotnet-ef.json
EF Core 11 Preview 4 permite que la herramienta dotnet ef lea los valores de opciones predeterminados desde un archivo .config/dotnet-ef.json, para que las soluciones divididas ya no te obliguen a pasar --project y --startup-project en cada comando.
2026 / 05
- Cómo ejecutar trabajo fire-and-forget de forma segura en ASP.NET Core con BackgroundService
Llamar a Task.Run desde un controlador pierde trabajo al apagar, se traga las excepciones y captura servicios scoped ya desechados. El patrón seguro es una cola Channel acotada que drena un BackgroundService, que abre un scope nuevo por cada elemento de trabajo y termina el trabajo en curso en StopAsync.
- Cómo usar servicios scoped dentro de un BackgroundService en ASP.NET Core 11
Un BackgroundService es un singleton, así que no puede inyectar directamente un servicio scoped como un DbContext. Toma IServiceScopeFactory, abre un scope por unidad de trabajo con CreateAsyncScope, resuelve dentro de él y deséchalo al terminar.
- Migrar de MediatR a inyección de dependencias simple en .NET 11
Una lista de verificación paso a paso para eliminar MediatR 12-14 y reemplazar los handlers de IRequest, ISender, los pipeline behaviors y INotification por clases de servicio simples e inyección por constructor.
- Flutter vs React Native vs .NET MAUI: ¿cuál deberías elegir para un nuevo proyecto móvil en 2026?
Para una aplicación móvil nueva en 2026, elige Flutter 3.44 cuando importen una UI idéntica píxel a píxel y el presupuesto de animación, React Native 0.82 cuando tu equipo ya viva en TypeScript y necesites un hermano real en el navegador, y .NET MAUI 11 cuando iOS y Android sean parte de un producto .NET más amplio y necesites soporte de primera mano de Microsoft.
- .NET MAUI 10 SR6 termina Material 3 en Android detrás de una sola bandera UseMaterial3
MAUI 10 SR6 (10.0.60) extiende el tema Material 3 a Button, Entry, SearchBar, DatePicker, Slider, ProgressBar, ImageButton, Switch y Shell en Android. Activalo con una propiedad MSBuild. Sin renderers personalizados, sin editar styles.xml.
- MAUI vs Avalonia vs Uno Platform: ¿cuál elegir en 2026?
Para una nueva aplicación .NET multiplataforma de escritorio y móvil en 2026, elige Avalonia cuando necesites un único conjunto de controles renderizados en todos los destinos, Uno cuando también debas llegar al navegador, y MAUI solo cuando realmente necesites iOS y Android nativos más soporte de primera mano de Microsoft.
- Azure Functions modelo aislado vs en proceso en .NET 11: cuál elegir en 2026
Elige el modelo aislado (isolated worker) para toda nueva aplicación de Azure Functions en .NET 11 en 2026, y migra cualquier aplicación en proceso restante antes de la fecha de retiro del 10 de noviembre.
- Blazor Server vs Blazor WebAssembly vs Blazor United en .NET 11: ¿cuál elegir en 2026?
Para cualquier app Blazor nueva en .NET 11, crea un Blazor Web App (la plantilla antes apodada Blazor United) y elige el modo de render por página. Las plantillas Server-only o WebAssembly-only solo siguen teniendo sentido en casos puntuales.
- EF Core 11 Preview 4: las columnas de período de las tablas temporales por fin pueden ser propiedades reales
EF Core 11 Preview 4 elimina la antigua restricción de propiedad shadow en las tablas temporales de SQL Server. PeriodStart y PeriodEnd ahora pueden ser propiedades CLR normales, configuradas con lambdas HasPeriodStart y HasPeriodEnd fuertemente tipadas.
- List<T> vs Span<T> vs ReadOnlySpan<T> en C#: cuándo usar cada uno
List<T> es una colección de montículo que crece; Span<T> y ReadOnlySpan<T> son vistas solo en la pila sobre memoria que ya posees. Usa List<T> para todo lo que almacenes, devuelvas desde async o crezca; Span<T> para una vista mutable sin asignaciones en un método síncrono; ReadOnlySpan<T> para análisis de solo lectura sobre cadenas, literales u8 y segmentos.
- Parallel.ForEach vs Parallel.ForEachAsync vs Task.WhenAll en C#
Usa Parallel.ForEach para trabajo intensivo de CPU sobre datos en memoria, Parallel.ForEachAsync para E/S asíncrona sobre muchos elementos con un límite de concurrencia, y Task.WhenAll para un fan-out fijo y pequeño donde quieres todas las operaciones en vuelo y necesitas los resultados.
- StringBuilder vs interpolación de cadenas en .NET 11: ¿cuál deberías usar?
Usa la interpolación de cadenas para componer de una sola vez un conjunto fijo de valores; usa StringBuilder cuando agregas en un bucle o sobre un número desconocido de fragmentos. La línea divisoria es el bucle, no la cantidad de valores.
- lock vs Monitor vs SemaphoreSlim vs System.Threading.Lock en C#
Cuatro formas de proteger una sección crítica en C#, y una matriz de decisión para elegir una. Usa System.Threading.Lock para exclusión mutua síncrona en .NET 9+, SemaphoreSlim cuando la sección cruza un await, y Monitor solo cuando necesitas Wait/Pulse.
- Polly vs. resilience handlers en .NET 11: ¿cuál deberías usar?
Usa el resilience handler de Microsoft.Extensions.Http.Resilience para las llamadas con HttpClient, porque es Polly con valores predeterminados que entienden HTTP y telemetría en una sola línea. Recurre a ResiliencePipeline de Polly directamente solo cuando protejas algo que no sea un HttpClient.
- Task.Run vs Task.Factory.StartNew vs ThreadPool.QueueUserWorkItem
Tres formas de enviar trabajo al thread pool en C# y cuál elegir. Usa Task.Run para casi todo, ThreadPool.QueueUserWorkItem<TState> para fire-and-forget sin asignaciones, y Task.Factory.StartNew solo para LongRunning o un planificador personalizado.
- HttpClient vs HttpClientFactory vs Refit: ¿cuál deberías usar en .NET 11?
Nunca crees un HttpClient por solicitud. Usa IHttpClientFactory para gestionar el ciclo de vida, y añade Refit encima cuando quieras una interfaz tipada en lugar de escribir el código de solicitud a mano. Un HttpClient singleton sin más solo sirve para los casos más simples.
- MediatR vs clases de servicio simples en 2026: ¿debería moverte el cambio de licencia?
Para código nuevo, las clases de servicio simples son la mejor opción por defecto. El cambio de licencia de MediatR de julio de 2025 importa solo si superas el umbral Community de 5 millones de dólares o rechazas el copyleft de la RPL-1.5. Conserva MediatR cuando los pipeline behaviors sean esenciales.
- C# 16 convierte unsafe en un contrato para quien llama
C# 16 rediseña la palabra clave unsafe para que propague una obligación al llamador en lugar de abrir silenciosamente un contexto unsafe, y ahora los bloques unsafe internos son obligatorios.
- Native AOT vs ReadyToRun vs JIT en .NET 11: ¿cuál deberías publicar?
El JIT clásico con Dynamic PGO gana en rendimiento sostenido, ReadyToRun acelera el arranque sin tocar el código y Native AOT da el binario más pequeño y de arranque más rápido a costa de la reflexión y el código dinámico. Elige por la forma del despliegue, no por benchmarks aislados.
- System.Text.Json vs Newtonsoft.Json en 2026: ¿cuál deberías elegir?
Elige System.Text.Json para código nuevo en .NET 11: viene integrado, es aproximadamente 2 veces más rápido y es el único que funciona con Native AOT. Recurre a Newtonsoft.Json solo para JSONPath, TypeNameHandling o JSON realmente permisivo.
- El recorte de paquetes NuGet está activado por defecto en .NET 10
El recorte de paquetes NuGet llegó activado por defecto para proyectos net10.0, reduciendo los reportes de vulnerabilidades transitivas en un 70% y los tiempos de restore hasta en un 50%.
- Solución: framework_version=6.0.0 was not found al ejecutar un binario de .NET 6
El runtime de .NET 6 ya no está o no coincide. Instala net6.0 de nuevo, haz roll forward a net8.0 con runtimeconfig, cambia el csproj, o publica self-contained.
- dotnet new mcpserver ya viene incluido en el SDK de .NET 11 Preview 4
.NET 11 Preview 4 incluye la plantilla de proyecto mcpserver directamente en el SDK. Sin instalar Microsoft.McpServer.ProjectTemplates aparte, sin malabares con feeds de preview. Eliges transporte stdio o HTTP, activas Native AOT, y dotnet new mcpserver -o MyServer es toda la configuración.
- Solución: El perfil de aprovisionamiento no incluye el dispositivo seleccionado actualmente en MAUI iOS
El perfil que Visual Studio eligió se generó antes de registrar el UDID de este iPhone. Vuelve a registrar el dispositivo, regenera el perfil de desarrollo, descárgalo y vuelve a desplegar.
- Fix: Unable to find a valid iOS Simulator runtime durante la compilación de MAUI
Xcode 15+ no incluye runtimes del simulador de iOS. MAUI falla la compilación cuando SupportedOSPlatformVersion no tiene un runtime instalado que coincida. Instala uno con xcodebuild -downloadPlatform iOS o desde Settings de Xcode, y verifica con xcrun simctl list runtimes.
- .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
- 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.
- 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.
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
- 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 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.
- 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.