La gran confusión sobre .NET y la compatibilidad multiplataforma

¿Alguna vez te has preguntado si los programas hechos en .NET deberían poder correr perfectamente tanto en Linux como en Mac? Es una pregunta que surge constantemente, pero la respuesta es mucho más compleja de lo que parece. La idea moderna de .NET es ser multiplataforma, pero eso no significa que cualquier programa hecho para Windows vaya a funcionar mágicamente en otro sistema.

Diagrama técnico de la evolución de .NET
La división histórica entre el antiguo .NET Framework y el moderno .NET Core/5 que permite la compatibilidad multiplataforma.

La gran ruptura histórica

Para entender esto, primero tenemos que distinguir entre las versiones. .NET Framework clásico (versiones 1.0 a 4.8) fue creado esencialmente para Windows. Dependía de cosas como el Registro o COM. Por otro lado, .NET Core y sus sucesores modernos (5, 6, 7…) fueron diseñados desde el principio para ser multiplataforma.

La clave está en la pregunta: ¿en qué versión estás trabajando? Un programa compilado con .NET moderno puede funcionar en Windows, Linux y macOS sin problemas. Sin embargo, si el código toca APIs específicas de Windows como System.Windows.Forms, Registry o WMI, entonces la portabilidad se rompe.

Aplicaciones gráficas versus dependencias nativas

Aquí es donde las cosas se ponen interesantes. Si estás desarrollando una aplicación gráfica, no puedes simplemente asumir que WinForms funcionará en Linux. Frameworks como Avalonia o .NET MAUI están diseñados específicamente para crear aplicaciones de escritorio que puedan ejecutarse en los tres sistemas operativos.

Comparativa entre aplicaciones gráficas y dependencias nativas
Diferencia entre frameworks gráficos multiplataforma como Avalonia y las limitaciones impuestas por dependencias nativas.

Además, incluso con código C# puro y moderno, las dependencias pueden ser un problema. A veces librerías NuGet traen DLLs nativas específicas de Windows. Por eso es común ver carpetas separadas como runtimes/win-x64, linux-x64 o osx-arm64 en los paquetes.

Conclusión

En resumen, sí, .NET moderno está diseñado para ser compatible con Windows, Linux y macOS. Pero la portabilidad no es una propiedad del lenguaje C# por sí solo; pertenece a la aplicación concreta que estás usando. Un programa que usa APIs multiplataforma puede escribirse una vez y ejecutarse en tres sistemas, mientras que uno antiguo o dependiente de librerías nativas podría necesitar una reescritura completa para funcionar fuera de Windows.