cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 2013
-
5 févr. 2009 à 15:03
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 2013
-
6 févr. 2009 à 08:36
Bonjour,
J'essaye d'utiliser la libraire gdcm (qui est open source) qui est écrite en c++.
Un wrapper C# a cependant vu le jour, et c'est ce qui m'intéresse.
En faisant une bête référence sur gdcm_csharp.dll dans mon projet et en m'assurant que gdcm.dll est dans le même répertoire (debug/release), j'obtiens tout le temps l'erreur "The type initializer for 'gdcm.gdcmPINVOKE' threw an exception." "The type initializer for 'SWIGExceptionHelper' threw an exception." lorsque je tente d'utiliser un objet de la lib [par exemple Anonymizer x = new Anonymizer();]. Il semblerait donc que ce soit un problème du côté de P/Invoke...
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 6 févr. 2009 à 04:32
Si gdcm_csharp.dll est bien le wrapper C# mais comme il est déja buildé on a pas besoin du tutorial. Avec Dependency Walker on voit que gdcm.dll est dépendant de tout un tas d'autres libs dont le CRT 9.0. Pour que ça marche tu dois copier toutes les *.dlls du dossier BIN vers RELEASE/DEBUG.
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 5 févr. 2009 à 18:12
Salut, elle est bien compliquée ta lib ( je comprends même pas trop à quoi elle sert ^^ ).. elle est écrite en C++ et dont inaccessible en C#. Pour qu'une lib C++ soit accessible elle doit exporter ses types et définir des fonctions Create/Destroy pour ses types.. Là ils utilisent SWIG ( que je connais que de nom ) qui apparemment permet de créer des interfaces vers d'autres langages.. D'ailleurs le tuto que tu donnes en lien est à mon avis le tuto pour builder la lib en C++ et générer le wrapper avec SWIG.
L'exception TypeInitializationException doit contenir une inner exception avec un msg plus explicite.
Je me demande si tout simplement il te manque pas le CRT 9.0 dans le dossier release/debug ( ou à installer ). ( c'est les 4 derniers fichiers dans le dossier BIN de GDCM ).
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 5 févr. 2009 à 22:39
Salut Lutinore et merci de ta réponse.
Pour le wrapper, c'est pas le fichier gdcm_csharp.dll ? Pourtant, j'ai pu faire une référence dans VS et en jetant un coup d'oeil avec Reflector j'ai vu qu'il contenait les méthodes nécessaires avec tout le P/Invoke qu'il faut..., par exemple
Je ne comprends donc pas toutes les manipulations à faire, j'ai pourtant crû qu'une fois le wrapper écrit, il fallait juste faire une référence dessus (comme j'ai fait) et ajouté la dll gdcm.dll dans le bon répertoire. A moins que cette dll ait d'autres dépendances, dans ce cas je ne comprends pas pourquoi elles seraient pas livrées avec le projet...
Concernant la lib, elle permet en fait d'interagir avec un format d'image spécial (DICOM) très utilisé dans le monde médical. Je ne sais pas encore beaucoup plus, ça fait 2j que je suis dedans seulement. J'ai trouvé plusieurs lib, mais c'est la seule à ma connaissance qui a déjà un wrapper C#, ce qui m'arrange car ça m'économise des 10aines d'heures (voire plus) de travailles...
Pour l'InnerException, elle dit ceci : ""Unable to load DLL 'gdcm': The specified module could not be found. (Exception from HRESULT: 0x8007007E)". Je ne sais pas si c'est très parlant, car la dll est bien présente. C'est éventuellement donc une autre dll qui est manquante mais je ne vois vraiment pas laquelle ?! Et pourquoi elle ne serait pas fournie?
Pour fini, j'avoue que SWIG et cmake, j'ai pas encore trop compris comment ça fonctionnait ni à quoi ça servait exactement. SWIG permettrait donc de générer directement le wrapper C# à partir de la dll C++?
Ha oui, j'ai essayé de copier les fichiers dans bin/debug comme tu le proposes mais ca n'a rien changé au problème: même exception levée...
Donc si t'as une idée...
Merci!
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 6 févr. 2009 à 04:46
"SWIG permettrait donc de générer directement le wrapper C# à partir de la dll C++?"
Oui c'est ça mais ça n'a rien d'automatique, le dévelopeur C++ a du ajouter dans son code des interfaces et d'autres infos pour permettre à SWIG de créer le wrapper ( du moins c'est ce que je comprends ).
SWIG semble utiliser le compilo de DotGNU Portable.NET c'est qui est assez rare.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Bidou
Messages postés5487Date d'inscriptiondimanche 4 août 2002StatutMembreDernière intervention20 juin 201361 6 févr. 2009 à 08:36
Je viens de copier toutes les dll, ça semble fonctionner (plus d'erreur en tout cas).
Merci :)
Pour SWIG, ça semble intéressant, car écrire un wrapper c'est un peu pénible. Par contre, c'est sûr que si le tool n'est pas automatique, c'est tout de suite moins utile...
En tout cas un grand merci, je commençais à perdre patience (les explications sur le site officilelles sont vraiment mauvaises je trouve.)