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 :

DllImport, PInvoke et MissingMethodException


Sujet :

Windows Mobile .NET

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 67
    Par défaut DllImport, PInvoke et MissingMethodException
    Bonjour à Tous,

    Je viens vers vous pour avoir quelques éléments de réponse car j'ai un soucis que je n'arrive pas à résoudre malgré mes recherches (ici et ailleurs).

    Je cherche à utiliser une dll Win32 sur PocketPC mais j'ai toujours l'erreur MissingMethodException : Can't find PInvoke DLL 'MyDll.dll'.

    La dll a été copié avec l'exécutable (et sous le répertoire \windows aussi pour lever les doutes)

    Voici le code source C# :

    Code C# : 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
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using System.IO;
    using System.Reflection;
     
    namespace test {
      public partial class Form1 : Form {
        [DllImport("MyDll.dll")]
        public static extern int dll_getInteger();
     
        public Form1() {
          InitializeComponent();
          textBox.Text = dll_getInteger().ToString(); 
        }
      }
    }


    Voici le code source Delphi au cas où :
    Code Delphi : 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
     
    library MyDll;
     
    {$R *.res}
     
    function dll_getBool: boolean; stdcall;
    begin
      result := false;
    end;
     
    function dll_getString: PChar; stdcall;
    var p : PChar;
    begin
      p := PChar('valeur');
      result := p;
    end;
     
    function dll_getInteger : integer; stdcall;
    begin
      result := 1000;
    end;
     
    exports dll_getBool;
    exports dll_getString;
    exports dll_getInteger;
     
    begin
    end.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 5
    Par défaut
    Salut,

    Pour savoir doit viens le problème regarde si ta DLL export bien les fonctions.
    Récupere juste un petit logiciel pour voir les fonctions accéssible dans les DDL. Comme cela tu seras sur que c'est la partie 'client' qui ne fonctionne pas.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 67
    Par défaut
    Citation Envoyé par metos57 Voir le message
    Salut,

    Pour savoir doit viens le problème regarde si ta DLL export bien les fonctions.
    Récupere juste un petit logiciel pour voir les fonctions accéssible dans les DDL. Comme cela tu seras sur que c'est la partie 'client' qui ne fonctionne pas.
    Merci pour ta réponse mais j'ai déjà vérifié avec l'utilitaire depends. On voit bien les fonctions exportées.
    Ce qui est étonnant c'est qu'avec le .Net framework normal (windows) il n'y a pas de soucis, on peut utiliser les fonction mais c'est sous Compact Framework que j'ai l'erreur à l'exécution.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'est peut-être lié à la CallingConvention de la méthode. Elle est déclarée comme stdcall. Or dans la doc de l'attribut DllImportAttribute, pour la propriété CallingConvention, on voit que la valeur par défaut est Winapi, et le commentaire pour cette valeur est le suivant :
    This member is not actually a calling convention, but instead uses the default platform calling convention. For example, on Windows the default is StdCall and on Windows CE.NET it is Cdecl.
    Donc si tu es sous Win CE ce n'est pas stdcall qui est utilisé. Pour lever le doute, modifie ton attribut comme ça :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    [DllImport("MyDll.dll", CallingConvention = CallingConvention.StdCall])

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 67
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [DllImport("MyDll.dll", CallingConvention = CallingConvention.StdCall])
    Je ne peux pas compiler avec ce code car il me dit que CallingConvention.StdCall n'est pas autorisé. Selon ici et c'est ce que j'ai vu dans l'auto-complétion (pas d'autres choix), le compact framework n'autorise que CallingConvention.WinApi

    Le Pocket est sous WM2003SE avec Compact Framework 2 installé.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    tu as la main sur le code Delphi ? dans ce cas essaie de modifier la déclaration de la fonction pour que ce soit pas en stdcall (je connais pas Delphi donc je sais pas quelles sont les conventions d'appel possibles...)

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 61
    Par défaut
    Est-ce que la dll est bien compilée pour arm ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 67
    Par défaut
    [tomlev]
    Oui j'ai la main sur le code source. J'ai déjà essayé de modifié la déclaration à la place du stdcall, j'ai mis cdecl, etc... mais j'ai toujours la même erreur.

    Ce qui m'étonne le plus c'est que le même fichier dll marche quand on utilise sous .Net normal - mais pas sur le compact framework.

    [Diody]
    je n'ai pas fais de compilation particulière.
    Est-ce obligatoire ? L'interet du PInvoke n'est il pas d'utiliser les dll natives Win32 justement ?
    Sinon, comment faire pour avoir cà ?

    Merci de votre aide.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2004
    Messages : 61
    Par défaut
    Si tu as copier une dll win32 directement, c'est normal que ca ne marche pas sur le pocket. Il en faut une compilée pour le type de processeur ciblé (arm ici).

    Pour résoudre le prob il te faut une version arm de ta dll. Soit il en existe une, soit, si t'as les sources, la compiler toi même

Discussions similaires

  1. [C#/DllImport] Comment appeler fonction de type char* ?
    Par SesechXP dans le forum C++/CLI
    Réponses: 1
    Dernier message: 18/08/2006, 10h02
  2. [win32] dllimport function not allowed
    Par FamiDoo dans le forum Windows
    Réponses: 13
    Dernier message: 28/07/2006, 10h13
  3. [C#] Soucis avec DLLImport
    Par xanagos dans le forum C#
    Réponses: 2
    Dernier message: 01/06/2006, 15h01
  4. Réponses: 5
    Dernier message: 07/07/2005, 10h20
  5. [C#] Problème avec [dllImport]
    Par NL dans le forum Windows Forms
    Réponses: 7
    Dernier message: 01/12/2004, 10h40

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