Linux fournit ses API natives dans le langage de programmation C. Un programme Linux natif utilise ces API pour accéder aux fichiers, aux périphériques d'E/S, aux sockets (réseau), aux communications interprocessus, au threading, etc. Pour créer une application Linux native, vous devez écrire votre application en C, puis la compiler avec (très probablement) GCC pour obtenir un exécutable. Vous pouvez même aller plus loin et utiliser des bibliothèques d'interface graphique dans votre programme pour ajouter une interface graphique (GTK et Qt sont deux bibliothèques populaires) ou utiliser un système de packaging pour empaqueter votre application (comme les fichiers .deb et .rpm).
C#, F# et VB ont leur propre compilateur (qui produit normalement du code IL au lieu du code machine) et, au lieu d'utiliser directement les API natives de Windows ou de Linux (toutes deux en C), ils les entourent de leur propre enveloppe. Cela signifie qu'il doit y avoir une autre couche supplémentaire entre le code compilé et le système d'exploitation. Cette couche supplémentaire doit lire le code IL et le traduire en API natives de Windows, Linux ou macOS. Cette couche supplémentaire peut être .NET Framework, Mono ou .NET Core (actuellement juste .NET).
Maintenant, pour répondre à la question "C# est-il utilisable pour la programmation de systèmes Linux ?", dans la plupart des cas, oui.
Le .NET dispose de bibliothèques pour la gestion des fichiers, la mise en réseau, le threading et certains périphériques d'entrée/sortie. Maintenant, par exemple, disons que vous avez besoin d'accéder à Bluetooth dans votre application. .NET n'a pas d'API pour Bluetooth, donc dans ce cas vous avez deux options :
- Trouver l'API native en C et l'appeler en C#
- Rechercher dans NuGet pour voir si quelqu'un l'a déjà fait.
D'autres exemples seraient WiFi Direct, Gamepad, température du CPU, informations sur la batterie, caméra, GPS, capteurs de l'ordinateur portable, etc. Donc, pour les applications de bas niveau, vous devez vous débrouiller tout seul (c'est le cas même sous Windows, sauf si vous optez pour UWP). Pour de telles applications sur Linux, le C ou Python serait un bien meilleur choix.
Si vous voulez ajouter une interface graphique à votre application, .NET dispose de bibliothèques d'interface graphique mais uniquement pour Windows. Mono, quant à lui, dispose de liens pour GTK appelés GTK# mais, naturellement, GTK# sera toujours en retard sur le développement de GTK (ce qui n'est pas un problème, sauf si vous voulez les dernières fonctionnalités).
.NET 6 offre une autre solution pour les interfaces graphiques multiplateformes. Dans .NET 6, vous pouvez créer une application Blazor avec C#, HTML et CSS et utiliser Electron pour créer une application de bureau à partir de celle-ci (au moment où j'écris ces lignes, ce n'est pas encore prêt).
Pour résumer :
Les avantages de C# sur Linux
- Vous utiliserez vos compétences existantes
- Si vous vous en tenez aux bibliothèques .NET, votre application sera portable sous Windows et Mac.
- Vous avez affaire à un langage moderne et propre plutôt qu'à un langage vieux de 50 ans (les programmeurs C purs et durs peuvent ne pas être d'accord :D).
Les inconvénients de C# sur Linux
- De nombreuses API natives ne sont pas disponibles
- Sur le papier, le code C natif serait plus rapide que le code C# dépendant du framework. Bien qu'il soit possible de compiler directement pour Linux, nous perdrions en portabilité et, avec le matériel actuel, les utilisateurs ne sentiraient pas la différence de toute façon.
- Vos mains sont plus serrées pour une application GUI