Ecriture de serveurs COM pour l’API Windows en C #, par où commencer?

J’essaie d’écrire des plugins pour fonctionner avec l’ interface de plug-in Session Broker des services Terminal Server . Je parle couramment C # mais je n’ai pas fait de C ++ depuis la fin des années 90. Pour le plugin que je vous écris, je prévois communiquer avec une firebase database et je préférerais utiliser System.Data.SqlClient pour en parler car je sais que les entrées et les sorties sont assez bonnes. J’ai le SDK Windows qui m’a fourni le fichier .idl pour l’interface ( tssbx.idl ). Le SDK fournit également un fichier d’en-tête C ( tssbx.h ) et un fichier source C ( tssbx_i.c ).

Je n’avais jamais écrit de serveur COM auparavant et j’avais beaucoup de difficulté à trouver des ressources pour apprendre à lire un fichier IDL et à le convertir en C #. Tout ce que je trouve indique ” Use TlbImport “, mais cela nécessite que des éléments tels que la library blocs soient dans l’IDL que tssbx.idl pas (ni ses dépendants).

Quelle serait ma meilleure option:

  1. Recherchez un outil pour C # équivalent à MIDL pour parsingr un fichier .idl dans un fichier .cs.
  2. Apprenez IDL (j’ai eu du mal à trouver de bons guides pour l’apprendre) et écrivez le tout en C # à la main.
  3. Ecrivez une dll auxiliaire en utilisant les fichiers C fournis et recevez cet appel dans ma dll C # pour mes parties .NET.
  4. Ré-apprenez le C ++, utilisez les fichiers .h et .c fournis et utilisez le CLR pour passer mes appels .NET.
  5. Une autre option à laquelle je n’ai pas pensé.

Pour ce faire, vous devez convertir les définitions IDL en interfaces C #, puis les implémenter en tant que classes C #. Vous appliquez les atsortingbuts appropriés (principalement ComVisible , ClassInterface et ProgId ) aux classes que vous souhaitez exposer à COM et vous utilisez l’outil regasm pour enregistrer votre assembly en tant que serveur COM.

Traduire IDL en C # n’est en fait pas si complexe; pour la plupart, il mappe assez directement des mots-clés IDL aux mots-clés C # et / ou MarshalAs atsortingbuts MarshalAs . J’ai une série de billets de blog sur la façon de procéder à l’interopérabilité de COM, y compris un article sur la façon de lire IDL . Je ne connais aucun outil, en particulier, qui fasse un bon travail dans ce domaine, mais si cela fait partie du SDK de Windows, vous devez toujours vérifier pinvoke.net en premier au cas où quelqu’un d’autre le ferait pour vous.

En ce qui concerne vos autres options, 3 et 4 représentent à peu près la même chose. Vous ne pouvez pas appeler directement du code géré à partir de code non géré, à moins que cela soit effectué via COM Interop ou une bibliothèque C ++ en mode mixte. Dans le premier cas, vous devrez toujours résoudre tous les problèmes d’enregistrement de votre assemblage C # auprès de COM pour que votre dll C appelle, afin que vous évitiez ainsi d’interrompre l’intermédiaire. Pour le second, vous faites essentiellement manuellement les mêmes opérations que le code d’interopérabilité du moteur d’exécution, et vous utilisez un langage moins familier pour démarrer, ce qui me semble être une perte nette.

Sachez cependant que le chargement d’assemblys .NET dans un contexte non géré n’est pas toujours possible. Par exemple, les extensions de shell gérées ne sont pas explicitement sockets en charge dans Windows 2008. Je ne sais pas si l’interface TSSBX vous permettra de charger des assemblys gérés en tant qu’objects COM. Vous devez donc être conscient de cette possibilité. Si vous ne le pouvez pas, aucune de vos options ne fonctionnera et vous devrez éviter d’utiliser du tout le .NET Framework, utiliser une autre technologie d’access à la firebase database et écrire l’ensemble du projet en C ++ non géré.

Je poste ceci comme une réponse parce que c’est trop long pour un commentaire

D’après ce que je comprends, écrire de tels plugins dans .NET pourrait poser des problèmes plus tard – en particulier. dans un scénario où plusieurs plug-in .NET doivent être chargés et que les deux (ou plusieurs) plug-ins utilisent différentes versions .NET (ces problèmes ont été expressément mentionnés dans le contexte des extensions de shell – je prends juste les raisons de ce scénario comme base de mes soupçons …).

En ce qui concerne votre option, IDL ne peut rien implémenter – c’est un langage de description d’interface .

Je suggérerais d’utiliser quelque chose de similaire à l’option n ° 3 avec quelques modifications:

Implémentez la partie .NET en tant que service Windows et communiquez entre le C et .NET via IPC – Je vous recommanderais d’utiliser une mémoire partagée extrêmement rapide et bien prise en charge avec .NET4.