Question

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

Était-ce utile?

La solution

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.

Des livres entiers ont été écrits sur P / Invoke ( http: // www. .amazon.com / NET-COM-Guide complet d'interopérabilité / dp / 067232170X ), et bien sûr des sites Web entiers ont été créés: http://www.pinvoke.net/ .

Autres conseils

Il existe plusieurs itinéraires que vous pouvez emprunter avec celui-ci. Premièrement, vous pouvez mettre à jour vos bibliothèques C ++ non gérées pour avoir un wrapper d'extensions C ++ gérées et pour que C # les utilise directement. Cela prend un peu de temps, mais cela fournit un bon pont au code non géré hérité. Mais sachez que les extensions C ++ managées sont parfois un peu difficiles à naviguer, car la syntaxe est similaire à celle du C ++ non managé, mais suffisamment proche pour qu'un œil très averti puisse voir les différences.

L'autre voie à suivre consiste à implémenter les classes COM de votre umnanaged C ++ et à ce que C # l'utilise via un assemblage d'interopérabilité généré automatiquement. Cette façon de faire est plus facile si vous connaissez assez bien COM.

J'espère que cela vous aidera.

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 à l'aide de P / Invoke via les attributs d'appel. Lorsque le code managé appelle le monde non managé, les paramètres doivent être marshallés. Il semble donc que les performances risquent d’être légèrement altérées, mais vous devrez effectuer des tests pour voir si le marshalling est significatif ou non.

La façon la plus simple de commencer est de s’assurer que toutes les fonctionnalités C ++ sont exposées en tant que fonctions de style "C". Assurez-vous de déclarer la fonction en tant que _stdcall.

extern " C " __declspec (dllexport) int _stdcall Foo (int a)

Assurez-vous que le classement est correct, en particulier pour les éléments comme les pointeurs et wchar_t *. Si vous vous trompez, il peut être difficile de déboguer.

Déboguez-le des deux côtés, mais pas les deux. Lors du débogage mixte natif & amp; géré, le débogueur peut devenir très lent. Déboguer un côté à la fois fait gagner beaucoup de temps.

Pour être plus précis, il faudrait poser une question plus précise.

Vous pouvez également appeler du code non géré via P / Invoke. Cela peut être plus facile si votre code n'utilise pas actuellement COM. J'imagine que vous auriez probablement besoin d'écrire des points d'exportation spécifiques dans votre code à l'aide de "C". des liaisons si vous avez emprunté cette voie.

Selon mon expérience, la plus grande chose à surveiller, c’est que le manque de récupération de place déterministe signifie que vos destructeurs ne fonctionneront pas alors que vous auriez pu le penser auparavant. Gardez cela à l'esprit et utilisez IDisposable ou une autre méthode pour vous assurer que votre code géré est nettoyé quand vous le souhaitez.

Bien sûr, il y a toujours PInvoke aussi si vous avez compressé 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 aptitude à écrire les enveloppes COM ou Managed C, soit b) de changer de bras chez PInvoke.

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

Il s'agit d'un projet bien entretenu qui construit efficacement une enveloppe mince autour de votre bibliothèque C ++ et qui permet aux langages tels que C # de communiquer directement avec votre code natif, ce qui vous évite d'avoir à mettre en œuvre (et à déboguer) le code collant.

Si vous voulez de bons exemples PInvoke, vous pouvez consulter PInvoke.net . Il contient des exemples sur la façon d’appeler la plupart des fonctions win api.

Vous pouvez également utiliser l'outil de cet article Clr Inside Out: PInvoke qui traduira votre fichier .h en wrappers c #.

scroll top