Mélange de code C # et de code C ++ géré sur Windows avec Visual Studio

Je voudrais appeler mes bibliothèques C ++ non managées à partir de mon code C #. Quels sont les pièges potentiels et les précautions à prendre? Merci pour votre temps.

Cette question est trop large. La seule réponse raisonnable est P / Invoke, mais cela revient à dire que si vous voulez programmer pour Windows, vous devez connaître l’API Win32.

Beaucoup de livres entiers ont été écrits sur P / Invoke ( http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X ), et bien sûr des sites entiers ont été créés: http: // http://www.pinvoke.net/ .

Il y a deux voies que vous pouvez utiliser avec cela – une, vous pouvez mettre à jour vos bibliothèques C ++ non gérées pour avoir une extension gérée par C ++ et faire en sorte que C # utilise directement ces classes. Cela prend un peu de temps, mais il fournit un pont intéressant avec le code non géré hérité. Mais sachez que les extensions C ++ gérées sont parfois un peu difficiles à naviguer car la syntaxe est similaire à celle du C ++ non géré, mais suffisamment proche pour qu’un oeil très formé puisse voir les différences.

L’autre voie à suivre est de faire en sorte que votre C ++ implémente les classes COM et que C # l’utilise via un assembly d’interopérabilité généré automatiquement. Cette façon de procéder est plus facile si vous connaissez assez bien le contenu de COM.

J’espère que cela t’aides.

Vous décrivez P / Invoke. Cela signifie que votre bibliothèque C ++ devra s’exposer via une interface DLL, et que l’interface devra être suffisamment simple pour être décrite par P / Invoke via les atsortingbuts d’appel. Lorsque le code managé appelle le monde non géré, les parameters doivent être regroupés, il semble donc qu’il y ait une légère baisse de performance, mais vous devez effectuer des tests pour voir si le regroupement est significatif ou non.

La manière la plus simple de démarrer consiste à vérifier que toutes les fonctionnalités du C ++ sont exposées en tant que fonctions de style «C». Assurez-vous de déclarer la fonction comme _stdcall.

extern “C” __declspec (dllexport) int _stdcall Foo (int a)

Assurez-vous d’avoir le droit de marshalling, en particulier des choses comme les pointeurs & wchar_t *. Si vous vous trompez, il peut être difficile de déboguer.

Déboguer de chaque côté, mais pas les deux. Lors du débogage mixte natif & géré, le débogueur peut devenir très lent. Le débogage d’un côté à la fois permet de gagner beaucoup de temps.

Obtenir plus de précision nécessiterait une question plus spécifique.

Vous pouvez également appeler un code non géré via P / Invoke. Cela peut être plus facile si votre code n’utilise pas actuellement COM. Je suppose que vous auriez probablement besoin d’écrire des points d’exportation spécifiques dans votre code en utilisant les liaisons “C” si vous aviez suivi cette route.

La plus grande chose à laquelle je dois faire attention dans mon expérience est probablement le fait que l’absence de récupération de données déterministe signifie que vos destructeurs ne fonctionneront pas si vous pensiez qu’ils le feraient auparavant. Vous devez garder cela à l’esprit et utiliser IDisposable ou une autre méthode pour vous assurer que votre code managé est nettoyé lorsque vous le souhaitez.

Bien sûr, il y a toujours PInvoke là-bas si vous avez empaqueté votre code en tant que DLL avec des points d’entrée externes. Aucune des options n’est sans douleur. Ils dépendent soit de votre capacité à écrire des enveloppes COM ou C gérées, soit du changement de votre arm sur PInvoke.

Je jetterais un coup d’oeil à swig , nous l’utilisons à bon escient dans notre projet pour exposer notre API C ++ à d’autres plates-formes de langage.

C’est un projet bien géré qui construit efficacement une enveloppe mince autour de votre bibliothèque C ++ qui permet aux langages tels que C # de communiquer directement avec votre code natif, ce qui vous évite d’implémenter (et de déboguer) du code de colle.

Si vous voulez un bon exemple de PInvoke, vous pouvez consulter PInvoke.net . Il a des exemples de la façon d’appeler la plupart des fonctions de l’API Win.

Aussi, vous pouvez utiliser l’outil de cet article Clr Inside Out: PInvoke qui traduira votre fichier .h en wrappeurs c #.