1

Hello,
Je voudrais utiliser des DLL faites en C# dans un projet VC++.
Ces DLL sont chiantes à coder, donc j'aimerais ne pas avoir à les refaire en C++.

Je ne suis pas certain de comprendre comment faire, mais j'ai essayé de passer par une interface COM.
J'ai donc mis dans les propriétés de ces DLL "Inscrire pour COM Interop". Ce qui a eu pour effet de créer un fichier .tlb en plus de la DLL.
Ensuite, je ne sais pas quoi faire...
J'ai tenté d'ajouter l'objet COM dans la boite à outils, j'ai une erreur "Echec de l'inscription automatique de c:/chemin du fichier.tlb"
J'avoue que c'est la première fois que j'essaie d'utiliser un objet COM, et il y a très peu de documentation disponible, celle de MSDN ne m'a pas aidé.
Pouvez vous m'aider SVP ?

2

Hmm COM c'est assez bordélique à utiliser malheureusement... Et pour ce qui concerne l'import des bibliothèques en C++ je ne pourrai t'être d'aucune aide sad
Enfin bon, à savoir tlb c'est "Type LiBrary", c'est un fichier de définition de ce qu'il y a dans ton composant COM, similaire aux fichiers .lib pour les DLL natives normales.
Après, j'ai toujours pensé qu'il y fallait des header C/C++ qui définissaient proprement les interfaces utilisables par ta DLL (peut être qu'un outil .tlb => .h existe déjà d'ailleurs) comme c'est le cas pour bon nombre d'API Microsoft utilisant COM, mais les recherches google pointent vers une directive #import "machin.tlb"... Je suppose que c'est ce que tu devrais faire, mais ensuite je ne sais pas comment tu accèdes aux types définis dedans grin

Par contre je ne comprends quand même pas trop un truc, pourquoi faire une interface COM entre C++ et C# ? Tu pourrais utiliser les Managed Extensions for C++ Programming (évolution de Managed C++) pour accéder directement à tes DLL C#. Celà aurait pour effet/obligation de créer un assembly mixte natif/managé, ce qui normalement est sans effet sur les parties natives de ton code, mais te permet d'utiliser directement le CLR
A moins que tu ne sois (bêtement) contraint à séparer code natif et managed, il me semble que c'est de loin la solution optimale, et peu-être aussi la plus simple (car dans un cas comme dans n'importe quel autre, le runtime .NET sera requis, et chargé dans l'espace mémoire de ton application, donc autant réduire la surcharge des wrapper inutiles à 0 smile)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

3

pourquoi faire une interface COM entre C++ et C# ? Tu pourrais utiliser les Managed Extensions for C++ Programming (évolution de Managed C++)
Parce que je ne connaissais pas. Merci beaucoup!
Je vais regarder comment ça fonctionne.
Tu l'a déjà utilisé?

4

Non encore jamais utilisé mais de ce que j'en ai lu c'est beaucoup plus simple que l'ancien MC++, et d'ailleurs je me suis trompé ça s'apelle C++/CLI maintenant. (oué en fait Managed Extensions ct juste le nom long de managed C++ je suis con cheeky )
En gros tu as des opérateurs et mots clés spéciaux pour traiter les types CLR (class => ref class, struct => ref struct, new => gcnew, etc...)
Tu peux trouver des infos ici: http://msdn.microsoft.com/en-us/library/xey702bw.aspx
Et je trouve que l'article de Wikipedia résume assez bien ce que tu peux faire: http://en.wikipedia.org/wiki/C%2B%2B/CLI
Enfin, hmm voila cheeky
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

5

Après avoir lus ce que j'ai trouvé, je ne suis plus très sûr, j'ai même du mal à en saisir l'utilité sauf à utiliser des types et fonctions du C# en C++.
On ne peut pas appeler une méthode en donnant son namespace.nom_de_la_classe.nom_de_la_méthode.
Pour ça il faut du interrop, donc ça ne change rien.
Mais j'avoue qu'après 1 ans sans C++ sa syntaxe me semble lourde (j'étais en c# ^^), et j'ai tout oublié, on ne peut même pas utiliser de type string !
J'ai suppose que c'est plus puissant que je ne le dis ici, mais c'est tellement mal documenté.

Je suis un boulet : Je n'arrive toujours pas à faire un simple wrapper de c# à c++, même pas un simple hello-world.

6

GUNNM (./5) :
Après avoir lus ce que j'ai trouvé, je ne suis plus très sûr, j'ai même du mal à en saisir l'utilité sauf à utiliser des types et fonctions du C# en C++.
Ce n'est pas justement ce que tu cherches à faire ?
On ne peut pas appeler une méthode en donnant son namespace.nom_de_la_classe.nom_de_la_méthode.
Non ça fonctionne parfaitement ça cheeky
Je suis un boulet : Je n'arrive toujours pas à faire un simple wrapper de c# à c++, même pas un simple hello-world.

Codé à l'arrache en quelques minutes: http://goldencrystal.free.fr/projects/CppCliTest.zip
Si ça peut t'inspirer quelque chose tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

7

Rhoo, je faisais des trucs de merde 100 fois plus compliqués...
I love bones... thx u.

Il n'y a même pas un appel vers une dll... Pour l'instant je n'y comprend rien, c'est trop simple #louche#, mais au boulot je vais être un cador pendant au moins 5min.
Merci! king

8

GUNNM (./5) :
Mais j'avoue qu'après 1 ans sans C++ sa syntaxe me semble lourde (j'étais en c# ^^), et j'ai tout oublié, on ne peut même pas utiliser de type string !

Si, il y a un std::string, et aussi des dizaines de libs qui te proposent leur propre classe string (genre QString de Qt).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité