Gdcm

Résolu
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 5 févr. 2009 à 15:03
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 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.

Lorsqu'on télécharge le projet (http://sourceforge.net/project/showfiles.php?group_id=137895&package_id=197047) on se retrouve grossomodo avec gdcm_csharp.dll qui est le wrapper et gdcm.dll qui est la lib c++.

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...

J'ai trouvé à cette adresse (http://apps.sourceforge.net/mediawiki/gdcm/index.php?title=Configuring_and_Building_With_VS_.NET_2008_%28Include_C_sharp_wrapping%29) la marche à suivre pour insérer le wrapper dans VS mais à vrai dire j'ai été bloqué au point numéro 3 (utilisation de cmake). Pas compris pourquoi il fallait faire ça ni comment il fallait le faire.

Si quelqu'un à une idée pour faire fonctionner ce wrapper....
Merci d'avance!

<hr />
-Blog-
-Site Perso-

5 réponses

Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
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.
3
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
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 ).
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
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

   [code://mscorlib:1.0.5000.0:b77a5c561934e089/System.Runtime.InteropServices.DllImportAttribute/.ctor(String) DllImport("gdcm", EntryPoint="CSharp_Anonymizer_GetFile")]
    publicstaticexternIntPtr Anonymizer_GetFile (=code://mscorlib:1.0.5000.0:b77a5c561934e089/System.Runtime.InteropServices.HandleRef HandleRef jarg1);

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!

<hr />
-Blog-
-Site Perso-
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
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.)

<hr />
-Blog-
-Site Perso-
0
Rejoignez-nous