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 :

[CF][C#/C++] Pourquoi une Missing Methode Exception sur DllImport ?


Sujet :

Windows Mobile .NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Points : 102
    Points
    102
    Par défaut [CF][C#/C++] Pourquoi une Missing Methode Exception sur DllImport ?
    Salut me revoilà avec mes problem de telephone...
    Je cherche ç utiliser des dll C++ dans mon code C# => plateforme invoke
    J'ai une dll simpel en C++.
    le cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "MyDll.h"
     
    // This is an example of an exported function.
    MYDLL_API int fnMyDll()
    {
    	return 42;
    }
    et le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifdef MYDLL_EXPORTS
    #define MYDLL_API __declspec(dllexport)
    #else
    #define MYDLL_API __declspec(dllimport)
    #endif
     
    MYDLL_API int fnMyDll();
    Avec ça j'ecri un wrapper pour pouvoir recuperer le 42 de la fonction de ma dll.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    [DllImport("MyDll.dll",EntryPoint="fnMyDll",CharSet=CharSet.Unicode)]
            private static extern int fnMyDll();
     
            int GetInt()
            {
                return fnMyDll();
            }
    en en utilisant ma fonction je leve une exception : Missing Methode Exception c'est balaud il trouva pas fnMyDll() !

    Je n'ai rien rajouter dans les options du linker du projet C# (dll import doit ce demerdé tout seul je suppose) mais alors pourquoi j'ai cette exception ??

    EDIT : Ma dll et l'exe sont au meme endroit

  2. #2
    Membre régulier Avatar de Piet
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    111
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 111
    Points : 108
    Points
    108
    Par défaut
    J'ai des doutes, mais tu peux toujours essayer :

    [DllImport("MyDll.dll",EntryPoint="fnMyDll",CallingConvention = CallingConvention.Cdecl)]
    private static extern int fnMyDll();
    et pour ce qui est de ton entrypoint, il faut t'assurer que c'est bien un point d'entrée de ta dll.
    Piet

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Points : 102
    Points
    102
    Par défaut la j'ai un doute...
    Mummm j'ai fait un test :
    Un peojet C++ qvec une dll toute bete contenta un simple fonction qui renvoi un nombre. Le projet marche exe en C++ dll en C++ je recupere bien mon nombre.

    Ensuite je garde la meme dll et j'appel la fontion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     [DllImport("MyDll.Dll", EntryPoint="fnMyDll")]
            private static extern int fnMyDll();
     
            private int GetInt()
            {
                return fnMyDll();
            }
    Et la pouf pb il ne trouve pas le methode, alors je me demande si comme Piet a dit ma fonction est bien un point d'entree de ma dll commet en etre sur ou comment le verifier ?
    ça doit etre bon ça non ??? je comprends pas trop ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifdef MYDLL_EXPORTS
    #define MYDLL_API __declspec(dllexport)
    #else
    #define MYDLL_API __declspec(dllimport)
    #endif
     
     
    MYDLL_API int fnMyDll();
    et le cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // MyDll.cpp : Defines the entry point for the DLL application.
    //
     
    #include "MyDll.h"
     
    // This is an example of an exported function.
    MYDLL_API int fnMyDll()
    {
        return 99;
    }
    Ce qui m'etonne c'est que mon projet C++/C++ fonctionne et C#/C++ ça plante


    Un autre truc drole le p/invoke marcche bien quand meme si je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    [DllImport("coredll.Dll")]
            private static extern int CreateProcess(string strImageName, string
     strCmdLine, IntPtr pProcessAttributes, IntPtr pThreadAttributes, int
     bInheritsHandle, int dwCreationFlags, IntPtr pEnvironment, IntPtr
     pCurrentDir, Byte[] bArray, ProcessInfo oProc);
     
            private void StartCalc()
            {
     
                ProcessInfo pi = new ProcessInfo();
                CreateProcess("calc.exe", "", IntPtr.Zero, IntPtr.Zero, 0, 0,
     IntPtr.Zero, IntPtr.Zero, new Byte[128], pi);
    Et bien j'ai bien une tite calculette qui est lancée
    Faut il que le dll soit a un endroit precis pour faire des p/invoke ???

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Points : 102
    Points
    102
    Par défaut Humm la reponse est surement la...
    Il va falloir bien lire ce truc :
    http://www.microsoft.com/france/msdn...ime-netcf.html

    En gros il faut respecter les conventions !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifdef MYDLL_EXPORTS
    #define MYDLL_API __declspec(dllexport)
    #else
    #define MYDLL_API __declspec(dllimport)
    #endif
     
    extern "C"
    {
        MYDLL_API int fnMyDll();
    }
    Il ne faut pas oublier extern "C"

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Points : 102
    Points
    102
    Par défaut parfait
    Excellent le tableau de correspondance !
    Merci beacoup a tous

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/06/2006, 15h46
  2. Réponses: 7
    Dernier message: 23/05/2006, 11h32
  3. Réponses: 7
    Dernier message: 27/07/2005, 17h34
  4. Pb avec une Classe d'exception EOleError
    Par raoulmania dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/05/2005, 12h39
  5. Pourquoi une seule valeur de retour pour les fonctions ?
    Par Bruno75 dans le forum Langages de programmation
    Réponses: 33
    Dernier message: 18/01/2004, 13h58

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