2009-06-15 7 views
26

J'ai écrit précédemment en C/C++ mais actuellement, j'en ai besoin pour convertir en C#.Écrire des pilotes en C#

Quelqu'un peut-il me dire le code/chemin Comment écrire des pilotes en C#?

Actuellement, j'ai quelques problèmes avec mon ancienne application écrite en C++ et nous devons écrire les pilotes de notre LPT1, COM Imprimantes et autres pilotes USB en C#.

Répondre

22

Simplement vous ne pouvez pas. C# produit un langage intermédiaire interprété par une machine virtuelle (.NET). Tous ces éléments s'exécutent en mode utilisateur et les pilotes WDM s'exécutent en mode noyau.

Il existe un DDK mais il n'est pas non plus supporté dans VStudio (mais vous pouvez faire un projet makefile pour la compilation).

Le développement du pilote est complexe, prédisposé à l'écran bleu et nécessite une bonne compréhension de C, des structures du noyau et de la manipulation de mem. Aucune de ces compétences n'est requise pour C# et .NET, il y a donc un parcours de formation long et pénible.

+0

Considérant que le code doit être signé avant l'exécution, il n'est pas possible de créer un driver signé (bien que IL puisse l'être) si le code est JITted. (Sur la Xbox 360, tout le code XNA/.NET s'exécute dans l'espace utilisateur contrairement aux jeux de code natifs, donc Microsoft n'a apparemment pas de "solution" pour cela). Il y a quelques OS C#, cependant, dans lesquels les pilotes sont faits en C#, assez soigné. –

+2

Tous les pilotes de périphériques sous Windows ne nécessitent pas l'exécution du mode noyau. Les pilotes vidéo, et je crois que les pilotes audio, fonctionnent maintenant en mode utilisateur dans Windows Vista et Windows 7.Il existe également un cadre de pilote en mode utilisateur disponible auprès de Microsoft. Notez bien que si cela fonctionne avec .NET, c'est probablement encore basé sur C/C++. http://www.microsoft.com/whdc/driver/wdf/UMDF.mspx –

1

Vous ne pouvez pas écrire de pilotes en C#; les pilotes doivent fonctionner avec des privilèges élevés pour pouvoir parler au matériel; le code managé ne peut pas être exécuté dans l'environnement approprié.

+0

Sinon, est-il possible de gérer mon code précédent en C#? –

+0

Eh bien, nous ne savons pas vraiment ce que fait votre code. Parlez-vous d'écrire des pilotes de périphérique en C#, ce qui n'est pas possible (comme mentionné) ou parlez-vous d'ouvrir les périphériques en C# et de leur envoyer des données (ce qui devrait être possible car vous devriez les ouvrir en tant que fichier et juste lire/écrire sur la poignée). –

10

Vous ne pouvez pas écrire de pilotes en mode noyau en C# (l'exécution s'exécute en mode utilisateur, vous ne pouvez donc pas entrer dans ring0). Ce SO Q/A fournit des liens pourraient vous être utiles:

C# driver development?

26

En fait, vous pouvez écrire des pilotes en C# si vous utilisez UMDF parce qu'il fonctionne en mode utilisateur (voir Getting Started with UMDF). Mais ma recommandation est d'utiliser C/C++.

+0

Ce lien ne va plus directement à UMDF, et mon Google-fu ne montre rien qui indique que vous pouvez écrire des pilotes en mode utilisateur en C# aujourd'hui. –

+0

@Oran: Merci, j'ai mis à jour le lien. Je pense que C# n'est pas utilisé pour UMDF parce que Microsoft ne fournit pas de support out-of-the-box et vous devez faire beaucoup de choses par vous-même (déclaration des fonctions, constantes, struct et etc). –

8

Vous n'êtes pas certain de savoir si vous avez l'intention de développer des pilotes de périphérique Windows ou d'interagir avec du matériel via les pilotes de périphériques existants. Par exemple, pour interagir avec les périphériques connectés à votre port série, vous n'avez pas besoin d'écrire votre propre pilote et en fait, vous pouvez y accéder via la classe SerialPort de .NET.

Même les périphériques USB sont accessibles depuis l'espace utilisateur (et, en fin de compte, code managé) grâce à des cadres tels que libusb-win32, WinUSB etc.

Questions connexes