Artículos con la etiqueta «C#»
73 artículos con la etiqueta «C#», del más reciente al más antiguo.
-
Canalizaciones con nombre en la práctica — El IPC estándar de Windows, del diseño a la seguridad
Guía práctica de las canalizaciones con nombre, el IPC estándar de Windows. Organiza, a partir de fuentes primarias, la elección entre modo byte y modo mensa...
-
Despertares espurios — Por qué las variables de condición despiertan «sin haber sido notificadas» y cómo esperar correctamente en Windows
La espera de una variable de condición puede regresar incluso cuando no ha llegado ninguna notificación (un despertar espurio). Este artículo explica, a part...
-
Buenas prácticas de multithreading en la práctica — Edición .NET: qué decidir antes de aumentar los hilos
Reglas de diseño en .NET/C# para evitar fallos y bloqueos intermitentes con hilos: usar Task en lugar de hilos propios, reducir el estado compartido, discipl...
-
Usar WMI/CIM desde C# y PowerShell ── Guía práctica de obtención de información de hardware, monitorización de procesos y consultas remotas
WMI/CIM es la solución estándar para leer el número de serie, monitorizar el disco y detectar procesos. Cmdlets CIM, migración desde Get-WmiObject, C# y tram...
-
Las profundidades de la E/S de Windows (parte 4) — El administrador de caché: ¿cuándo llega su WriteFile al disco?
Cuarta entrega de la serie que explica con diagramas el administrador de caché de Windows: la caché implementada como asignación de archivos, la lectura anti...
-
Los entresijos de E/S de Windows (parte 3) — Puertos de finalización de E/S (IOCP) y el grupo de subprocesos de .NET: el sótano de async/await
Parte 3 de una serie que explica con diagramas el puerto de finalización de E/S (IOCP): la cola de finalización integrada con el control de subprocesos, el v...
-
¿Hasta cuándo se puede usar MSMQ? — La decisión de migración de una cola legacy que «ni siquiera está en desuso»
MSMQ no figura en la lista oficial de funciones en desuso, pero System.Messaging solo existe en .NET Framework y bloquea la migración a .NET. Resumimos los c...
-
Las profundidades de la E/S de Windows (Parte 2) ── E/S síncrona y E/S asíncrona: el verdadero significado de OVERLAPPED
Segunda entrega de la serie que explica con diagramas la E/S síncrona y la E/S asíncrona (E/S superpuesta) de Windows: el significado de FILE_FLAG_OVERLAPPED...
-
Las profundidades de la E/S de Windows (parte 1) — Toda lectura y escritura se convierte en un IRP: panorama general del sistema de E/S
Primera entrega de la serie que explica desde la base el sistema de E/S de Windows: el espacio de nombres del Administrador de objetos, los objetos driver, d...
-
Qué es el TPM en Windows — la "caja fuerte que no deja salir la llave" y el arranque medido, explicados con diagramas
Explicamos el TPM con diagramas: cómo evita que la clave salga del chip, el arranque medido con PCR, su uso en BitLocker y Windows Hello, las diferencias ent...
-
No confíe en el valor decodificado de un código QR sin validarlo — que la corrección de errores funcione no garantiza que el valor sea correcto
La corrección de errores del QR no garantiza que el valor leído sea correcto. Con pruebas reales y dos decodificadores explicamos por qué un daño mal ubicado...
-
Cómo gestionar dispositivos USB en aplicaciones de Windows — cómo elegir entre COM virtual, HID, WinUSB y SDK propietario
Comparamos cuatro formas de controlar equipos y dispositivos USB desde una aplicación de Windows —puerto COM virtual, HID, WinUSB y SDK del fabricante— y rep...
-
Cómo reemplazar un exe o una DLL en uso — Restart Manager y el problema del «archivo en uso» en las actualizaciones automáticas
Por qué un exe o DLL en uso no se puede sobrescribir, cómo evitarlo renombrando archivos, y cómo Restart Manager enumera, cierra y reinicia procesos, con cód...
-
Redirección y virtualización de 32/64 bits en el registro de Windows — Wow6432Node y el problema del «valor que debería estar y no está»
Explica cómo la escritura en HKLM\Software desde una app de 32 bits se redirige a Wow6432Node, cuándo la virtualización de UAC la traslada a VirtualStore, lo...
-
Diseño de códigos en sistemas empresariales ── Cómo definir códigos de producto y cliente, y el dígito de control
Guía práctica para diseñar códigos de producto y cliente en sistemas empresariales: código significativo frente a secuencial, fórmulas de dígito de control (...
-
Compatibilidad retroactiva de interfaces DLL y COM — Tabla de decisión sobre qué cambios rompen al lado que llama
Qué cambios de DLL o COM rompen al lado que llama: los tres niveles de compatibilidad, la tabla de decisión por cambio y la regla de inmutabilidad de COM.
-
Cómo versionar el esquema de la base de datos de una aplicación empresarial — Migraciones que evitan que «cada cliente tenga una base de datos distinta»
Guía práctica para versionar el esquema de bases de datos de aplicaciones empresariales dispersas entre clientes: PRAGMA user_version, migraciones progresiva...
-
Práctica de CI/CD para aplicaciones WinForms / WPF — automatizar desde la compilación hasta la firma y la distribución con GitHub Actions
CI/CD para WinForms/WPF con GitHub Actions: build y pruebas, versión por tags, firma con signtool y tabla de decisión por formato de distribución.
-
Cómo modificar con seguridad una aplicación de negocio legada sin pruebas — la práctica de las pruebas de caracterización y la refactorización
Con ejemplos en C#, muestra cómo fijar con pruebas de caracterización (método golden master) el comportamiento de una app legada sin pruebas, crear continuid...
-
Cuando su aplicación Windows de desarrollo propio es tratada como virus — cómo abordar los falsos positivos de Microsoft Defender y su impacto en el rendimiento
Procedimiento oficial para resolver falsos positivos de Microsoft Defender en apps Windows propias: por qué ocurren, cómo reportarlos, restaurar y excluir.
-
Suspensión, hibernación y Modern Standby: evitar con diseño que las apps de larga duración "se detengan de noche"
Analiza por qué las apps Windows de larga duración se detienen de noche, según las diferencias entre S3, hibernación y Modern Standby. Explica temporizadores...
-
¿Las aplicaciones empresariales funcionan en Windows para Arm? — La realidad de la emulación x64 (Prism), las DLL nativas y COM
Respondemos si las aplicaciones empresariales funcionan en Windows para Arm: la emulación x64 (Prism), las capas que no funcionan (controladores), el problem...
-
MAX_PATH y las trampas de rutas y nombres de archivo en Windows — el límite de 260 caracteres, nombres reservados, el punto final y las mayúsculas y minúsculas
Analizamos las limitaciones de rutas y nombres de archivo, causa habitual de «archivo no encontrado»: el desglose de MAX_PATH=260, la activación de rutas lar...
-
Trampas de las unidades de red y las rutas UNC — la gestión práctica de servidores de archivos (carpetas compartidas) en aplicaciones empresariales
Analizamos los problemas típicos al escribir en carpetas compartidas o monitorizarlas desde una app empresarial: la letra de unidad (Z:), los permisos según ...
-
Iconos de la bandeja del sistema y notificaciones toast en aplicaciones Windows — los escollos de NotifyIcon y cómo elegir el AppNotification adecuado
Organiza la implementación de la residencia en la bandeja del sistema y las notificaciones toast en aplicaciones Windows empresariales: el uso correcto de No...
-
¿Hasta cuándo seguirán funcionando las aplicaciones VB6? — Estado del soporte del runtime y un camino práctico hacia la migración a .NET
¿Hasta cuándo seguirán funcionando las aplicaciones VB6? Este artículo organiza la situación actual: el runtime sigue dentro del soporte incluso en Windows 1...
-
Era japonesa, festivos y fechas de cierre en aplicaciones empresariales — diseño resiliente a los cambios de era, JapaneseCalendar y cálculo de días hábiles en la práctica
Repasamos el tratamiento de fechas propio de las aplicaciones empresariales japonesas: visualización en era japonesa, cálculo de días hábiles excluyendo fest...
-
Internacionalización de aplicaciones WinForms/WPF — la práctica de resx, ensamblados satélite y el cambio de cultura
Organizamos la internacionalización de aplicaciones de escritorio Windows: la diferencia entre CurrentCulture y CurrentUICulture, el mecanismo de resx y ensa...
-
El CSV no es «solo texto»: guía práctica del manejo de CSV en aplicaciones empresariales con C# (codificación de caracteres, compatibilidad con Excel, protección contra inyección)
Repasamos los incidentes típicos de entrada/salida de CSV en aplicaciones empresariales -el parseo casero con Split(','), la corrupción de caracteres con UTF...
-
No envuelvas HttpClient en un using ── Comunicación HTTP en aplicaciones de negocio C# (patrones de creación, tiempos de espera y reintentos)
Crear HttpClient con using en cada solicitud agota los sockets, y usarlo como static no sigue los cambios de DNS. Repasamos el patrón de creación correcto co...
-
Identificar qué es «lento» con PerfView y dotnet-trace — introducción práctica a la investigación de rendimiento en .NET
Qué herramientas y datos conviene mirar cuando una aplicación de negocio va lenta, mantiene la CPU al máximo o se queda congelada ocasionalmente. Organizamos...
-
Introducción al registro de eventos de Windows y ETW — llevar los registros de aplicaciones de negocio al mecanismo estándar del sistema operativo
El registro de eventos y ETW son una capa de registro distinta, visible para el personal de operaciones y las herramientas estándar del sistema operativo. Ex...
-
No solo appsettings.json — gestión práctica de configuración en aplicaciones de negocio Windows (configuración por entorno, secretos y ubicaciones de escritura)
Organizamos la gestión de configuración de aplicaciones de negocio Windows: jerarquía de appsettings.json, uso de IOptions/IOptionsMonitor, configuración por...
-
Impresión y salida en PDF en aplicaciones empresariales de Windows ── cómo elegir entre System.Drawing.Printing, WPF y bibliotecas de informes
Organiza en una tabla de decisión por requisitos la impresión WinForms con PrintDocument, la impresión WPF con FlowDocument o FixedDocument y las alternativa...
-
Formarse una imagen clara del modelo OSI — diseccionar una única petición HTTP en sus siete capas
Entendemos el modelo OSI con un ejemplo real: construimos y diseccionamos en C# la trama Ethernet que transporta una petición HTTP GET, confirmamos con Wires...
-
Cómo entender el aislamiento de sesiones de Windows — Session 0, RDP y la ejecución simultánea de varios usuarios
Este artículo aclara el concepto de «sesión» de Windows, que suele confundir a los desarrolladores de aplicaciones. Explica por qué el aislamiento Session 0 ...
-
WinDbg + SOS para leer volcados de memoria — introducción práctica al análisis tras la recolección
Cómo leer volcados de memoria de Windows con WinDbg y SOS: rutas de símbolos, !clrstack, !dumpheap, !analyze -v y diferencias con dotnet-dump analyze.
-
Prevención de la ejecución múltiple en aplicaciones de Windows — Mutex con nombre y activación en el segundo inicio
Analizamos cómo implementar la prevención de la ejecución múltiple en apps Windows mediante un Mutex con nombre. Cubrimos Global\ y Local\, AbandonedMutexExc...
-
Cómo llamar a la API de Win32 desde C# de forma segura — Guía práctica de P/Invoke (DllImport / LibraryImport / CsWin32)
Repasamos los puntos prácticos de P/Invoke en C# para llamar a la API de Win32: DllImport frente a LibraryImport, generación automática con CsWin32, trampas ...
-
Integrar la autenticación de Entra ID en aplicaciones WinForms/WPF — Configuración práctica con MSAL.NET y el bróker WAM
Cómo integrar Entra ID en apps WinForms/WPF: cliente público, registro de la app, AcquireTokenSilent, bróker WAM y persistencia de la caché de tokens.
-
Fecha, hora y zona horaria en aplicaciones empresariales — de las trampas de DateTime al principio de UTC y el diseño de pruebas
Un traslado de servidor desplaza la hora 9 horas: exploramos el origen en el Kind de DateTime, DateTimeOffset, el principio de UTC, TimeZoneInfo, el horario ...
-
Pruebas de UI automatizadas para aplicaciones de escritorio de Windows ── el funcionamiento de UI Automation y pruebas resistentes a roturas con FlaUI
Organizamos las pruebas de UI automatizadas para apps WinForms/WPF desde el funcionamiento de Windows UI Automation: implementación mínima con FlaUI, diseño ...
-
Compatibilidad de WPF con alto DPI ── causas y soluciones del desenfoque pese a que «debería ser resistente al DPI»
WPF es System DPI Aware, pero al moverse a un monitor con otro DPI toda la ventana se difumina y los mapas de bits se ven borrosos. Repasamos el diagnóstico,...
-
El problema de EXCEL.EXE que permanece al operar Excel desde C# — Patrones de liberación de referencias COM y el criterio de sustitución
Explica por qué EXCEL.EXE permanece al operar Excel vía COM desde C#, mediante el conteo de referencias COM y el RCW. Cubre la regla de los dos puntos, los p...
-
Compatibilidad de WinForms con pantallas de alto DPI ── Por qué se ve borroso o se rompe el diseño en monitores 4K, y cómo abordarlo de forma realista
Explica por qué las aplicaciones WinForms se ven borrosas o rompen su diseño en monitores 4K, a partir de la virtualización de DPI y los modos de reconocimie...
-
Cómo elegir la comunicación entre procesos en Windows — canalizaciones con nombre / TCP / gRPC / memoria compartida / COM: tabla de decisión
Cómo elegir la comunicación entre procesos en Windows: comparamos en una tabla de decisión las canalizaciones con nombre, el TCP local, gRPC, la memoria comp...
-
Cómo usar SQLite en aplicaciones empresariales con C# — Modo WAL, control de exclusión, prevención de corrupción y cuándo usar EF Core
Reunimos el conocimiento práctico para integrar SQLite en aplicaciones empresariales con Microsoft.Data.Sqlite: modo WAL, SQLITE_BUSY, mapeo de tipos, copias...
-
Cómo crear y operar un servicio de Windows — de la diferencia con el Programador de tareas a la creación de servicios con BackgroundService
¿Un proceso en segundo plano debe ser servicio de Windows o basta con el Programador de tareas? Tabla de decisión, creación con .NET Worker Service, cuenta d...
-
Cómo elegir el destino de almacenamiento de datos en una app de Windows ── Tabla de decisión: SQLite / JSON / Registro / Access
Dónde y con qué guardar los datos de una app de escritorio Windows: uso de AppData/ProgramData, ventajas y trampas de SQLite, JSON, Registro y Access, con pr...
-
¿Qué es un PDB (Program Database)? — Cómo entender la información de depuración, los símbolos y Source Link
Qué es un PDB: qué contiene, qué no, y su relación con Debug/Release, Portable PDB, Source Link, servidores de símbolos y el análisis de volcados.
-
¿Qué es Roslyn? ── Leer, corregir y generar código C# desde la perspectiva del compilador
Resumen de Roslyn (.NET Compiler Platform): Syntax Tree, SemanticModel, Workspace, Analyzer, Source Generator, y sus usos y precauciones en la práctica.
-
Externalización y desarrollo por encargo de una app Windows: qué aclarar antes de solicitarlo
Antes de encargar la externalización o el desarrollo por encargo de una app Windows, estos son los puntos a aclarar: revisión de software existente, integrac...
-
Tipos de datos algebraicos en .NET Framework / .NET — Diseño que representa estados y resultados mediante tipos
Cómo usar los tipos de datos algebraicos, en especial los tipos suma y las uniones discriminadas, en .NET Framework y .NET: F#, jerarquías de clases en C#, r...
-
Cómo manejar correctamente los tokens de suplantación de Windows — préstamo de privilegios por hilo y una forma segura de revertirlos
Guía práctica sobre los tokens de suplantación de Windows: tokens de acceso, primarios y de hilo, niveles de suplantación, RevertToSelf y RunImpersonated de ...
-
El malentendido de que TCP permite recibir por cada unidad enviada con Send ── diseño de recepción para tratarlo como flujo de bytes
En TCP, suponer que se recibe por cada unidad enviada con Send o Write provoca fragmentación, uniones, texto corrupto y protocolos rotos. Este artículo trata...
-
Cómo distinguir la espera de GC de una fuga de memoria en .NET — Procedimiento práctico para observar, comparar y demostrar el crecimiento de memoria
Cómo distinguir, en aplicaciones .NET, si la memoria crece por espera de GC o por una fuga real, usando dotnet-counters, dotnet-gcdump y dotnet-dump.
-
Cómo ejecutar PowerShell desde C# (CSharp) y recibir los resultados como objetos
Explica, con enfoque práctico, cómo iniciar PowerShell desde C# y recibir los resultados como PSObject en vez de cadenas: PowerShell SDK, AddCommand, AddPara...
-
Lista de verificación para manejar procesos secundarios de forma segura en aplicaciones de Windows
Para manejar procesos secundarios de forma segura en aplicaciones de Windows, la propiedad del árbol de procesos y el procedimiento de cierre importan más qu...
-
Puntos débiles de las aplicaciones de comunicación serie - hasta el diseño de la reconexión y los registros
Puntos débiles habituales de las aplicaciones de comunicación serie en la integración con equipos e instrumentos de medición: framing, timeouts, RTS/CTS, DTR...
-
Cómo elegir entre WinForms, WPF y WinUI: tabla de decisión práctica
Analizamos qué elegir entre WinForms, WPF y WinUI según el desarrollo nuevo, los activos existentes, la distribución, la expresividad de la UI y la estructur...
-
Trampas de la memoria compartida y buenas prácticas para producción
Analizamos las trampas de usar memoria compartida en producción y el diseño que reduce la tasa de incidentes: sincronización, visibilidad, ciclo de vida, ABI...
-
Cómo comparar de forma justa la velocidad de ejecución de C#, C++, Java y Go
Cómo comparar de forma justa la velocidad de ejecución de C#, C++, Java y Go: diseño de la medición, warm-up, fijación del entorno, lectura estadística y ele...
-
Cómo usar una DLL de .NET 8 desde VBA con tipado - Exposición COM y TLB con dscom
Resumen de cómo exponer una biblioteca de clases de .NET 8 como COM, generar el TLB con dscom y usarla desde VBA con enlace temprano (early binding).
-
Lista de verificación previa a la migración de .NET Framework a .NET
Checklist práctico para revisar el tipo de proyecto, tecnologías no compatibles, dependencias NuGet, formato SDK, WPF/WinForms, CI/CD y operación antes de mi...
-
¿Qué es .NET Generic Host? - La base de DI, configuración y registro
Analiza el papel de Generic Host —DI, configuración, registro, IHostedService y BackgroundService— y resume, con criterio práctico, dónde conviene usarlo y d...
-
¿Qué es .NET Native AOT? Diferencias con JIT y trimming
Explicamos qué es Native AOT diferenciándolo de JIT, ReadyToRun, self-contained, single-file, trimming y source generator, y resumimos desde una perspectiva ...
-
Cómo elegir entre los 3 temporizadores de .NET - PeriodicTimer/Timer/DispatcherTimer
Diferencias entre PeriodicTimer, System.Threading.Timer y DispatcherTimer, y cómo elegirlos para el procesamiento async, los callbacks de ThreadPool y las ac...
-
Cómo invocar una DLL nativa de C# Native AOT desde C/C++
Publicar una biblioteca de C# como DLL nativa con Native AOT e invocar sus puntos UnmanagedCallersOnly desde C/C++: casos de uso, patrones y precauciones.
-
Por qué usar .NET Generic Host y BackgroundService en una aplicación de escritorio
Resumimos cómo usar Generic Host y BackgroundService en herramientas y apps residentes de Windows para organizar el inicio, el procesamiento periódico, el ci...
-
WPF/WinForms: async y el hilo de UI, resumidos en una hoja
Repasamos, en WPF / WinForms, a dónde vuelve await, Dispatcher / Invoke, ConfigureAwait(false) y dónde se atascan .Result / .Wait().
-
Guía práctica de FileSystemWatcher - Cómo evitar pérdidas de eventos y duplicados
Analizamos el uso de FileSystemWatcher: pérdida de eventos, notificaciones duplicadas, trampas de finalización, reescaneo, claim atómico e idempotency.
-
Tabla práctica de decisión de C# async/await - Task.Run y ConfigureAwait
Organizamos las mejores prácticas de C# async/await con una tabla de decisión para espera de E/S, cálculo de CPU, Task.Run, ConfigureAwait(false) y fire-and-...
-
Llamar DLL nativas desde C#: envoltorio C++/CLI frente a P/Invoke
Al usar DLL nativas desde C#, distinguimos cuándo basta P/Invoke y cuándo conviene un envoltorio C++/CLI, según propiedad, excepciones, tipos C++ y callbacks...