IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

PInvoke et Importation de DLL


Sujet :

C#

  1. #1
    Candidat au Club
    Homme Profil pro
    DUT Info 2A
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : DUT Info 2A
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut PInvoke et Importation de DLL
    Bonjour,

    J'essaye actuellement d'importer des DLL (littleCMS) depuis le langage C vers C#; et j'ai quelques soucis avec Pinvoke.
    Avec les codes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    namespace myLib
    {
        public class WrapperLCMS
        {
            public struct cmsHPROFILE
            {
                Object profile;
            }
    #region import
     
            [DllImport("lcms.dll")]
            public static extern unsafe cmsHPROFILE cmsOpenProfileFromFile(char* ICCProfile, char* sAccess);
    #endregion import
     
    #region InitFct
            public static unsafe cmsHPROFILE OpenProfileFromFile(string profile, string sAccess)
    	    {
                fixed (char* ICC = profile.ToCharArray())
                    fixed (char* access = sAccess.ToCharArray())
                        return cmsOpenProfileFromFile(ICC, access);
    	    }
    #endregion InitFct
        }
    }
    sur ma DLL et le code suivant dans un main de test qui à ma DLL en référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    using myLib;
     
    namespace test_luib
    {
        class Program
        {
            static void Main(string[] args)
            {
                WrapperLCMS.cmsHPROFILE hInProfile, hOutProfile;
               // WrapperLCMS.cmsHTRANSFORM hTransform;
     
                hInProfile = WrapperLCMS.OpenProfileFromFile("1.icc", "r");
                hOutProfile = WrapperLCMS.OpenProfileFromFile("2.icc", "r");
            }
        }
    }
    Est-ce que j'utilise mon wrapper de la bonne façon ? le message d'erreur est : La signature du type de cette méthode n'est pas compatible avec PInvoke.

    Merci d'avance de votre aide.

    PS: J'espère être dans le bon endroit pour poster cela.

    EDIT : voila le prototype en C de la fonction que j'essaye de wrapper : CMSAPI cmsHPROFILE CMSEXPORT cmsOpenProfileFromFile(const char *ICCProfile, const char *sAccess);

  2. #2
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    Essaye de changer cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     [DllImport("lcms.dll", EntryPoint="cmsOpenProfileFromFile")]

  3. #3
    Candidat au Club
    Homme Profil pro
    DUT Info 2A
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : DUT Info 2A
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Aucun changement, même message d'erreur.

  4. #4
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    peux tu stp mettre le message d'erreur

  5. #5
    Candidat au Club
    Homme Profil pro
    DUT Info 2A
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : DUT Info 2A
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    "Une exception non gérée du type 'System.Runtime.InteropServices.MarshalDirectiveException' s'est produite dans myLib.dll

    Informations supplémentaires*: La signature du type de cette méthode n'est pas compatible avec PInvoke."

  6. #6
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    Il faut définir ton type de retour cmsHPROFILE

  7. #7
    Candidat au Club
    Homme Profil pro
    DUT Info 2A
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : DUT Info 2A
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    c'est a dire ? la structure que j'ai créé au dessus ne suffit pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public struct cmsHPROFILE
            {
                Object profile;
            }
     
     
    public static unsafe cmsHPROFILE OpenProfileFromFile(string profile, string sAccess)
    	    {
                fixed (char* ICC = profile.ToCharArray())
                    fixed (char* access = sAccess.ToCharArray())
                        try
                        {
                            return cmsOpenProfileFromFile(ICC, access);
                        }
                        catch
                        {
                            Exception e;
                        }
                return new cmsHPROFILE();
    	    }

  8. #8
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    Essaye comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [StructLayout(LayoutKind.Sequential)]
    public struct cmsHPROFILE
    {
         Object profile;
    }

  9. #9
    Candidat au Club
    Homme Profil pro
    DUT Info 2A
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : DUT Info 2A
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    j'ai changé ma définition en rajoutant [StructLayout(LayoutKind.Sequential)]
    mais pas d'évolution même problème qu'au dessus
    "Une exception non gérée du type 'System.Runtime.InteropServices.MarshalDirectiveException' s'est produite dans myLib.dll

    Informations supplémentaires*: La signature du type de cette méthode n'est pas compatible avec PInvoke."

  10. #10
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    Dernière Piste: il faut changer le type :

  11. #11
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    à quoi ressemble la struct côté C ?
    Plus je connais de langages, plus j'aime le C.

  12. #12
    Candidat au Club
    Homme Profil pro
    DUT Info 2A
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : DUT Info 2A
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    la structure de cmsHPROFILE ressemble à ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void* cmsHPROFILE;
    ce que j'ai traduis par ça en C#
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public struct cmsHPROFILE
    {
         Object profile;
    }
    Ce qui m'amène a mon autre question, comment traduire simplement un Typedef en C# (après quelques recherches google --> pas faisable simplement)
    Du coup, je pensais utiliser un Singleton qui comprenait chaque type redéfini comme attribut ?

  13. #13
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Alors il me semble que "marshaller" du void* c'est pas la fête ...
    T'as la main sur la lib C ou tu dois l'utiliser "as is" ?
    Plus je connais de langages, plus j'aime le C.

  14. #14
    Candidat au Club
    Homme Profil pro
    DUT Info 2A
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : DUT Info 2A
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    On m'a demandé d'y toucher vraiment en dernier recours en fait, mais si il y a pas d'autres solutions, je peut y toucher ^^

  15. #15
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Que peut-il y avoir derrière ce void* ? (faut lire le code C).
    Les pointeurs anonymes en C c'est un hack super pratique, en managé c'est moins le fun.
    Plus je connais de langages, plus j'aime le C.

  16. #16
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Un void* c'est un pointeur. En managé, un pointeur est représenté par IntPtr. Peux-tu faire un essai avec ce type ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  17. #17
    Candidat au Club
    Homme Profil pro
    DUT Info 2A
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : DUT Info 2A
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Bonjour !!

    Du coup pour répondre dans l'ordre mon type de retour derrière mon Void * correspond :
    - Soit à Null en cas d'échec d'ouverture, lecture ...
    - Soit à un pointeur sur cette structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    struct _cms_io_handler {
     
        void* stream;   // Associated stream, which is implemented differently depending on media.
     
        cmsContext        ContextID;
        cmsUInt32Number   UsedSpace; 
        cmsUInt32Number   ReportedSize;
        char              PhysicalFile[cmsMAX_PATH];
     
        cmsUInt32Number   (* Read)(struct _cms_io_handler* iohandler, void *Buffer,
                                                                      cmsUInt32Number size,
                                                                      cmsUInt32Number count);
        cmsBool           (* Seek)(struct _cms_io_handler* iohandler, cmsUInt32Number offset);
        cmsBool           (* Close)(struct _cms_io_handler* iohandler);
        cmsUInt32Number   (* Tell)(struct _cms_io_handler* iohandler);
        cmsBool           (* Write)(struct _cms_io_handler* iohandler, cmsUInt32Number size,
                                                                       const void* Buffer);
    };
    Du coup, j'ai remplacé ma structure Object par IntPtr --> Ca compile, du coup je regarde maintenant comment vérifier sur quoi pointe IntPtr. (Mon Console.WriteLine(outProfile) me parait un peu inutile (affiche : 0))
    J'éditerai ce msg dès que je trouve comment récupérer le contenu du pointeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void button2_Click(object sender, EventArgs e)
            {
                Console.WriteLine("bla");
                openFileDialog1 = new OpenFileDialog();
                openFileDialog1.ShowDialog();
                IntPtr inProfile, outProfile;
                inProfile = WrapperLCMS.OpenProfileFromFile(openFileDialog1.FileName, "r");
                openFileDialog1.ShowDialog();
                outProfile = WrapperLCMS.OpenProfileFromFile(openFileDialog1.FileName, "r");
                Console.WriteLine(outProfile);
            }

  18. #18
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Pas si inutile que ça : un pointeur qui vaut 0 c'est mauvais signe quand même.
    Plus je connais de langages, plus j'aime le C.

  19. #19
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    A priori, tu as juste en retour un pointeur NULL.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  20. #20
    Candidat au Club
    Homme Profil pro
    DUT Info 2A
    Inscrit en
    Avril 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : DUT Info 2A
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2017
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Donc je n'arrive pas à ouvrir mon fichier, je vais chercher où sa passe pas alors !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment importer une DLL dans du code???
    Par Jayceblaster dans le forum Delphi .NET
    Réponses: 29
    Dernier message: 19/04/2006, 19h19
  2. Importer une DLL
    Par Sallie dans le forum MFC
    Réponses: 8
    Dernier message: 14/04/2006, 10h47
  3. [NetBeans] importer une dll
    Par guitalca dans le forum NetBeans
    Réponses: 1
    Dernier message: 16/12/2005, 11h13
  4. [v6.0] Importer une DLL
    Par ni0urk dans le forum MFC
    Réponses: 19
    Dernier message: 17/11/2005, 16h19
  5. [FLASH MX2004] Importer une dll
    Par Fry dans le forum Flash
    Réponses: 4
    Dernier message: 07/01/2005, 10h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo