12
votes

Comment utiliser une bibliothèque C ++ dans une application C #?

jusqu'à présent, j'ai compris que je devais sortir, je devais recompiler la bibliothèque comme un .dll au lieu d'un .lib , activer / clr et / eha au lieu de / ehsc . Maintenant, j'ai une DLL gérée que j'ai ajouté comme référence dans mon projet C #.

Maintenant, comment puis-je l'utiliser?

Je suis prêt à écrire des wrappers, mais je ne sais pas où commencer ou comment "voir" quelles fonctions j'ai gagnées. J'ai lu un peu de savoir comment les noms de classe et les fonctions pourraient être mangés par le compilateur ... Dois-je revenir en arrière et ajouter __ DeclSpec exportations partout (si oui, comment?), Existe-t-il une option dans VS2010 qui dit "Ne pas l'endormir!"?

La bibliothèque C ++ en question est toujours en cours de développement actif. J'espère donc que je puisse modifier la bibliothèque C ++ aussi peu que possible et simplement le recompiler périodiquement avec quelques commutateurs, puis exposer la nouvelle fonctionnalité que j'en ai besoin.


0 commentaires

4 Réponses :


8
votes

Si vous allez compiler votre C ++ (si elle était à l'origine non gérée C ++), vous devrez faire beaucoup plus que d'ajouter le commutateur / CLR. Pour que C # n'utilise la DLL, vous devrez créer des classes gérées et d'autres types basés sur CTS compatible avec C # (.NET).

Voir et classes Ref.

Un bon livre à lire sur le sujet (IMHO) est celui-ci un


2 commentaires

Alors ... pour créer les classes gérés, dois-je le faire en C ++ / CLI, ou quoi? J'ai besoin d'un peu plus pour continuer.


Oui, vous avez besoin de plus pour continuer, je suggérerais de vérifier les liens. Il existe également des outils pour convertir C ++ en géré C ++ de Microsoft, cela peut également aider. Consultez ceci: Stackoverflow.com/Questtions/151776/...



6
votes

Vous pouvez expercer les fonctions telles que les fonctions de style C (c'est-à-dire sans gérer) de votre DLL ou vous pouvez les exposer en tant qu'objets COM.


1 commentaires

Comment puis-je les utiliser comme des objets COM?



4
votes

Je suggérerais d'écrire une emballage COM et d'utiliser cela à la place. Regardez http://msdn.microsoft .com / fr-US / bibliothèque / 035x3kbh% 28v = vs.80% 29.aspx pour les instructions d'introduction. Vous voudrez effectuer vos interfaces d'objet dérivées d'IDISPATCH et d'être compatible automatisation, ce qui doit permettre à l'exécution de les consommer sans le maréchalage personnalisé.

Un bon avantage de cette approche est que vous pouvez continuer à construire votre code natif en tant que bibliothèque et à simplement effectuer votre projet COM. En outre, il s'agit toujours de code natif dans l'objet COM, il y a donc beaucoup moins de potentiel pour des problèmes inconnus (une fois que vous obtenez la couche d'interface fonctionne).

C'est ma suggestion, de toute façon.


0 commentaires

2
votes

Oui, enveloppez-le à un objet COM. Je crois que ATL est ce que vous devez faire cela avec le moins d'effort.


2 commentaires

ATL? Vous parlez à quelqu'un qui n'a jamais fait cela auparavant.


Bibliothèque de modèles ActiveX. Cela fait partie de l'environnement de développement MS et utilisé pour la création d'objets COM dans C ++.