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

Windows Mobile .NET Discussion :

Utilisation d'une dll C++ en C# pour pocket pc : problème "NotSupportedException"


Sujet :

Windows Mobile .NET

  1. #1
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 47
    Points : 23
    Points
    23
    Par défaut Utilisation d'une dll C++ en C# pour pocket pc : problème "NotSupportedException"
    Bonjour à tous,
    ça fait deux ans que je viens lire vos post et vous m'êtes à chaque fois d'une grande utilité mais pour la première fois, je ne trouve pas de réponse à mon problème et je sollicite votre aide...
    J'espère déjà avoir posté au bon endroit...

    Voilà mon problème j'ai une dll qui a été écrite en c++ et qui fonctionne très bien dans un programme écrit en c++...

    voici le code de mon programme c++

    Dans le .h:
    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
    26
    27
    28
    29
    30
    31
    32
    #if defined(_VB_)
       #define FCT_PREFIX __stdcall
       #define TOTO_API
    #elif defined(_WIN32) || defined (__WIN32__) || defined (_WIN32_WCE)
       #ifdef TOTO_EXPORTS
          #define TOTO_API __declspec(dllexport) 
          #define FCT_PREFIX
       #else
          #define TOTO_API __declspec(dllimport) 
          #define FCT_PREFIX
       #endif
    #elif defined (__BORLANDC__) && defined (_WIN32)
       #define TOTO_API __cdecl
       #define FCT_PREFIX
    #else
       #define FCT_PREFIX
       #define TOTO_API
    #endif
     
    #define TOTO_Init(iReaderType, iCardSlot, pszReaderName) TOTO_InitEx(iElem1, iElem2, pszElem3, iElem4, iElem5)
    TOTO_API TOTO_Status FCT_PREFIX TOTO_InitEx(int iElem1, int iElem2, char *pszElem3, long lElem4, long lElem5);
    TOTO_API TOTO_Status FCT_PREFIX TOTO_Exit();
     
     
    typedef struct 
    {
       long  general       ;          /* General return code  */
       long  system        ;          /* System error         */
       BYTE  cardSW   [2]  ;
       char  ErrorMsg [64] ;          /* Eror Message         */
       char  rfu      [14] ;
    } TOTO_Status;
    Dans le .cpp
    TOTO_Init(TOTO_I, 0, NULL);
    //mon code...
    TOTO_Exit();
    Et là tout fonctionne nickel...


    Mais quand il est question de l'utiliser en C# c'est un tout autre problème...

    mon code en C#

    Ma region DLLImport:

    [DllImport("TOTO_SDK.dll", EntryPoint = "MOB_InitEx")]
    public static extern TOTO_Status TOTO_InitEx(int iElem1, int iElem2, string pszElem3, int iElem4, int iElem5);

    [DllImport("TOTO_SDK.dll", EntryPoint = "TOTO_Exit")]
    public static extern TOTO_Status TOTO_Exit();

    Ma définition de TOTO_Status
    [StructLayout(LayoutKind.Sequential)]
    public class TOTO_Status
    {
    public long general ; /* General return code */
    public long system ; /* System error */
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
    public Byte[] cardSW ;// = new Byte [2];
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)]
    public string ErrorMsg; /* Eror Message */
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 14)]
    public string rfu;
    }
    Et mon appel:
    TOTO_Status = TOTO_InitEx(iElem1, 0, null, iElem4, iElem5);
    TOTO_Status =TOTO_Exit();
    Et quand j'exécute...
    j'ai ce message d'erreur :

    L'exception NotSupportedException n'a pas été gérée, et je vais au lieu qu'il m'indique...
    alors j'ai ces infos...

    Assurez-vous que la méthode est prise en charge.
    Il y a des méthodes qui ne sont pas prises en charge dans la classe de base et dont il est attendu qu'elles soient plutôt implémentées dans les classes dérivées. Si une classe dérivée implémente uniquement un sous-ensemble des méthodes de sa classe de base, elle lève une exception NotSupportedException pour les méthodes non prises en charge.
    et encore
    Lorsque vous utilisez le .NET Compact Framework et P/Invoke sur une fonction native, cette exception peut être levée dans les cas suivants :

    la déclaration dans le code managé est incorrecte ;

    le .NET Compact Framework ne prend pas en charge l'opération que vous tentez d'effectuer ;

    les noms de DLL sont tronqués lors de l'exportation.

    Dans ce cas :

    Recherchez toutes violations des restrictions P/Invoke du .NET Compact Framework.

    Recherchez tous les argument qui requièrent de la mémoire pré-allouée. Si vous en trouvez, vous devez passer une référence à une variable existante.

    Vérifiez que les noms des fonctions exportées sont corrects. Cette vérification peut être réalisée à l'aide de DumpBin.exe.

    Vérifiez que vous n'essayez pas de passer un trop grand nombre d'arguments.
    mais je pense avoir fait le nécessaire... ça fait deux jours que je bloque là-dessus...
    Je ne sais plus du tout quoi faire...
    J'en rêve de la nuit même... je parie que mon erreur est idiote mais je suis tellement naze que je vois pas... je suis coincée par des délais de temps très strict... et c'est pour ça que je vous demande votre aide...
    Si vous pouviez m'aider ce serait vraiment gentil...
    Merci à tous d'avance d'avoir lu mon message...

  2. #2
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Peut etre que ta DLL C++ fait des appels système qui n'existe pas sur PocketPC?

  3. #3
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par neptune Voir le message
    Peut etre que ta DLL C++ fait des appels système qui n'existe pas sur PocketPC?
    le programme écrit en c++ que l'ont m'a fournit tourne sur pocket pc...
    donc théoriquement cela devrait tourner aussi.
    Il n'y a aucune raison pour qu'un programme c++ fonctionne et pas en c#, enfin je suppose...

  4. #4
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    As tu tracé en débug à quel point ton programme lève l'exception?

  5. #5
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    j'appelle ma fonction dans un évènement clique de bouton et c'est à la première instruction que ça plante.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     private void button1_Click(object sender, EventArgs e)
            {
                TOTO_Status = TOTO_InitEx(iElem1, 0, null, iElem4, iElem5);
    //... mon code
                TOTO_Status = TOTO_Exit();
            }
    j'ai direct la petite fenêtre blanche.

  6. #6
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Ah oui, tu l'avais déjà dit dans ton premier post, j'ai lu trop vite.

    Dans un premier temps, j'essaierai l'appel de TOTO_InitEx() sans affecter la valeur de retour de la fonction, juste pour exclure que ta structure soit mal définie.

    Ensuite, je regarderais ce que fait cette fonction au sein de la DLL, si tu as le code source évidement.

    Courage...

  7. #7
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    malheureusement je n'ai pas le code source...
    et qui plus est j'ai déjà essayer sans valeur de retour...
    j'ai cherché sur des forums après plusieurs solution ou plusieurs idées mais je fais choux blanc...
    j'ai pensé un moment que mon appel à ma dll était mal déclaré, mais ce serait un peu gros mais bon, il n'y a que celui qui ne travaille pas qui se trompe jamais.
    j'ai même essayé d'uniquement de faire appel à mon Exit qui ne prend pas de paramètre et sans valeur de retour et bien je n'ai rien non plus... où plutot si NotSupportedException... C'est pas pour dire mais c'est pas très clair comme exception
    mais si je met n'importe quoi dans dans mon DLLImport genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("TOTO_SDK.dll", EntryPoint = "MachinTrucChose")]
    public static extern TOTO_Status TOTO_InitEx(int iElem1, int iElem2, string pszElem3, int iElem4, int iElem5);
    enfin j'espère être claire dans mes explications
    il me dira bien que MachinTruc Chose n'a pas été trouvée dans la DLL...
    je suis complètement perdue

  8. #8
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Sinon, raconte un peu ce que fait cette DLL, quel est son but?

    As tu essayé dans une application pour PC?

  9. #9
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    J'aurais bien aimé essayer pour PC mais c'est une dll qui ne peut fonctionner que pour pocket pc.
    C'est une dll fournie par un fournisseur de matériel, pour intéragir avec son matériel. Mon périphérique ne peut fonctionner que sur PDA donc je ne pourrais même pas le tester pour PC...
    Le code c++ est en fait le code fournit dans son SDK. Mais moi je ne travaille pas en C++ mais en C#. C'est la première fois que je rencontre ce genre de problème, précédemment j'ai déjà fait plusieurs appel à des dll en c++ mais celle là va savoir pourquoi elle ne veut pas fonctionner.

  10. #10
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Je crois que le problème se situe justement là. Au sein de la méthode Init de la DLL, le code C++ initialize le matériel en question et pour ce faire, doit probablement accéder à des zones mémoires particulière et/ou faire appel à des interruptions matérielles.

    J'imagine donc que ce type de "manipulation" C++ au sein de l'interpréteur .NET est prohibé.

    Le plus simple pour le moment est de te tourner vers le fournisseur de la DLL et de lui demander si elle est supportée pour .NET.

    Peut tu citer la marque et le type de matériel en question, ainis que le nom de la DLL ou c'est confidentiel?

  11. #11
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Je pense que le nom de la dll te sera d'une grande inutilité, et pour le fournisseur je ne préfère pas le citer. Ce que je peux dire c'est que le matériel que je souhaite utiliser est un lecteur de carte.
    ça réponse concernant le .Net c'est : "je ne garanti rien"...

    J'utilise le dll, mais je n'ai pas dis que je disposais aussi des .lib et .h
    et ça honnêtement je ne sais pas quoi en faire. Enfin si pour le .h mais le .lib gros et énorme point d'interrogation. Précédemment je n'ai jamais eu à utiliser le .lib en faisant appel à une dll... c'est peut-être là que je commet une erreur.

  12. #12
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Non, le DLL est la version compilée dynamiquement tandis que le lib la version statique.

    Le .h est nécessaire en C++.

  13. #13
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par neptune Voir le message
    Non, le DLL est la version compilée dynamiquement tandis que le lib la version statique.

    Le .h est nécessaire en C++.
    je le savais mais bon... si jamais il y avait eu une exception...
    pfff je suis vraiment désespérée...

  14. #14
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Ne le sois pas, on va trouver

    Plutot que directement vouloir exploiter ta dll en C#, on peut essayer de créer un wrapper en C++/CLI (C++ version .net) et qu'ensuite tu utilises ce wrapper en C#.

  15. #15
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    je n'ai jamais fait ça
    Comment est-ce qu'on procède?

  16. #16
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    J'ai fait un wrapper dans ce genre il y a quelques mois... Mais je n'arrive plus à mettre la main sur le projet.

    Je te tiens au courant!

  17. #17
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    merci

  18. #18
    Membre éprouvé Avatar de neptune
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2003
    Messages : 835
    Points : 958
    Points
    958
    Par défaut
    Je ne retrouve plus dans quel projet j'ai du faire cela, donc j'en ai re-créé un rapidement pour te démontrer le fonctionnement.

    Une librairie statique Win32 "NativeDLL" définit un classe. Une class library C++ managéé "ManagedDLL" englobe cette classe (wrapper) et expose les méthodes sur la classe, mais managées. Et un projet C# de démonstration qui exploite la classe managée (qui elle même exploite la classe non managée).

    J'espère qu'avec cet petit exemple tu pourras trouver une solution à ton problème.
    Fichiers attachés Fichiers attachés

  19. #19
    Membre à l'essai
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2007
    Messages : 47
    Points : 23
    Points
    23
    Par défaut
    je vais regarder à ça tout de suite...
    en tout cas merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. utilisation d'une dll pour le pop3
    Par alex61 dans le forum VB.NET
    Réponses: 7
    Dernier message: 08/02/2011, 15h31
  2. Réponses: 4
    Dernier message: 03/03/2010, 09h08
  3. Réponses: 8
    Dernier message: 20/06/2008, 09h00
  4. [DLL] Utilisation d'une DLL pour utiliser serveur Firebird
    Par sekiryou dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/08/2004, 14h20

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