pma3d
Messages postés36Date d'inscriptionlundi 13 juin 2005StatutMembreDernière intervention14 septembre 2005
-
16 juin 2005 à 10:59
pma3d
Messages postés36Date d'inscriptionlundi 13 juin 2005StatutMembreDernière intervention14 septembre 2005
-
17 juin 2005 à 10:09
Bonjour à tous.
Avant toute chose, je tiens à préciser que j'ai découvert à la fois
.NET, C++ et les dlls il y a maintenant une semaine (vive
l'enseignement actuel informatique : pas de microsoft, donc linux,
java, et pas de dlls !!).
Je bosse actuellement dans une boîte développant un logiciel écrit en
C++. Pour mon stage, je dois créer un service web .net utilisant des
DLLs déjà existantes. Ca fait trois jours que je me renseigne, et
d'après ce que j'ai compris, j'ai deux solutions pour pouvoir les
utiliser :
- faire de MC++ en appelant les DLLs,
- faire du C# et utiliser le mécanisme PInvoke (DllImport).
J'ai réussi (avec beaucoup de difficultés !!) à créer mon service web
en MC++, mais j'aimerais essayer de le faire en c#, ce dernier étant le
langage de prédilection de la plateforme .NET.
Mon problème est le suivant : j'ai une dll qui contient une classe avec
ces méthodes, et je souhaiterais pouvoir utiliser cette classe dans mon
code C#. Le problème est que DllImport force à importer les méthodes de
la dll en 'static extern', ce qui me fait perdre le principe des
instances.
Je m'explique : par exemple prenons une classe 'Nombre' ayant pour
attribut un entier et qui contient un constructeur, une méthode
'ajoute(Nombre n)' et une méthode 'affiche()'.
Dans mon code C#, je ne peux récupérer que les deux méthodes, et
lorsque je veux les utiliser, comme elles sont en static, je ne peux
les utiliser qu'en méthode de classe, et je ne peux donc par exemple
pas afficher une instance précise de ma classe Nombre.
Je ne sais pas si ma demande est claire, mais je vous en prie, aidez
moi, parce que c'est ultra frustrant de passer d'un monde que l'on
maitrise depuis plusieurs années (le java en l'occurrence pour moi) à
quelque chose qu'on ne connait pas du tout...
Merci d'avance à ceux qui prendront le temps de me répondre...
Miiitch
Messages postés52Date d'inscriptionjeudi 28 octobre 2004StatutMembreDernière intervention24 août 20051 16 juin 2005 à 11:53
Je ne pense pas que tu pourras appeler directement ta classe depuis le monde managé, par contre, il est tout a fait possible dans ta DLL, d'ajouter des fonctions qui vont faire appel à des methodes de ton objet, en passant le pointeur vers ton objet à chaque fois. sur ce principe là:
pma3d
Messages postés36Date d'inscriptionlundi 13 juin 2005StatutMembreDernière intervention14 septembre 2005 16 juin 2005 à 12:01
En fait, premièrement, le but est de ne pas avoir à modifier les dlls (il y en a des dizaines!!)...
Deuxièmement, j'avais pensé à ce genre de solution, mais j'en reviens
toujours au même problème : une fois que j'ai cette méthode, il faut
que je puisse lui passer un paramètre de type 'MaClasse'.
Le problème est que je n'ai même pas accès à la classe depuis le code
C#, puisque je ne peux récupérer que les méthodes (et pas la classe qui
les contient)...
Pour reprendre l'exemple de ma classe Nombre, lorsque je crée un objet
de type Nombre dans mon code C#, il me dit à juste titre que ce type
lui est inconnu ! (le seul accès possible à la dll se fait par les
DllImport qui ne permettent d'importer que des méthodes)
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 16 juin 2005 à 20:14
Salut, J'ai pas bien compris ce que tu veux faire, mais voila quelques pistes.. Pour appeler des methodes d'une classe on utilise l'attribut [ DllImport( "MyLib.dll", CallingConvention = CallingConvention.ThisCall ) ] Mais pour utiliser cet attribut tu dois avant recuperer un pointeur sur ta classe.. Et comme tu le dis plus haut C# ne connait pas ta classe, on maintient donc le pointeur dans un IntPtr.. Le probleme maintenant c'est justement de recuperer ce pointeur ! Si tu as le code source de ta librairie, tu rajoutes une fonction qui construit l'object et qui renvoie le pointeur et une fonction pour detruire l'object.. Ces deux fonctions doivent bien sur etre en dehors de la classe.. Le SDK du framework a un tres bon exemple appele PInvokeLib.dll
pma3d
Messages postés36Date d'inscriptionlundi 13 juin 2005StatutMembreDernière intervention14 septembre 2005 17 juin 2005 à 09:02
OK OK... Voilà un début de piste. J'aurais préféré une solution qui ne
me demande aucune modification du code source (surtout que je ne sais
même pas si j'ai le droit d'y toucher !), mais je commence vraiment à
douter que ce soit possible.
Cependant, je me pose quelques questions, parce que contrairement à ce
que tu dis, je n'ai pas besoin d'un pointeur sur la classe pour faire
appel à DllImport, ça marche très bien sans.
Et puis, autre chose : je ne comprends pas pourquoi il ne faut pas que ces méthodes soient dans la classe.
C'est peut-être bête, mais je ne vois pas..
En tous cas, cette solution me paraît intéressante, je vais explorer ça... Merci !
Vous n’avez pas trouvé la réponse que vous recherchez ?