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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 émérite 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
    Par défaut
    Peut etre que ta DLL C++ fait des appels système qui n'existe pas sur PocketPC?

  3. #3
    Membre averti
    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
    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 émérite 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
    Par défaut
    As tu tracé en débug à quel point ton programme lève l'exception?

  5. #5
    Membre averti
    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
    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 émérite 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
    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 émérite 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
    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

  8. #8
    Membre averti
    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
    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