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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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...)

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