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

C# Discussion :

AccessViolationException avec DllImport


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Par défaut AccessViolationException avec DllImport
    Bonjour à tous, je suis actuellement en train de coder un wrapper C# qui doit me permettre d'appeler des fonctions d'une DLL écrite en C (bien évidemment je n'ai pas accès au code source de la DLL). Pour cela j'utilise P/Invoke puisque je ne peux pas utiliser le C++/CLI.

    Le prototype d'une des fonctions de la DLL est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void fonction(const char* name, unsigned int id);
    Dans mon code C#, je déclare cette fonction de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("api.dll")]
    private static extern fonction(string name, int id);
    Seulement quand je tente d'appeler cette fonction dans mon code C#, j'obtiens une AccessViolationException.

    Après avoir fait quelques tests pour cerner le problème, je ne sais absolument pas d'où peut venir cette erreur et je ne vois vraiment pas dans quelle direction chercher

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Par défaut
    Bonjour,

    Je pencherai pour une problème avec string, de mémoire tu dois soit passer un vrai tableau de char, soit rajouter les informations de marshaling qui vont bien

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2011
    Messages : 14
    Par défaut
    J'ai déjà essayé de passer un tableau de char, sans succès, et j'ai également essayé de définir le paramètre de type string avec les options de marshalling suivantes :

    [...] fonction([MarshalAs(UnmanagedType.LPStr)] string [...]

    Mais j'obtiens exactement la même erreur au même endroit.

    Après j'ai essayé quasiment toutes les options de MarshalAs existantes, mais rien n'a fonctionné.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 269
    Par défaut
    Bon j'ai pu faire un test
    Et voici un code qui passe correctement les paramètres à la méthode

    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
     
            private const int MaxStringSize = 255;
     
            [DllImport("DllToImport")]
            private static extern void fonction(
                [MarshalAs(UnmanagedType.LPArray, SizeConst = MaxStringSize)] 
                char[] name,
                int id);
     
            static void Main(string[] args)
            {
                string name = "La test a toto";
                Console.WriteLine("Appel de la methode");
                char[] realdata = name.ToCharArray();
                fonction(realdata, 2);
                Console.WriteLine("Fin d'appel de la methode");
            }
    Maintenant avec Visual Studio 2010 tu peux avoir une erreur du genre PInvokeStackImbalance apres l'appel
    C'est du a changement de la convention d'appel par défaut.

    pour corrigé ce petit soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [DllImport("DllToImport", CallingConvention = CallingConvention.Cdecl)]
            private static extern void fonction(
                [MarshalAs(UnmanagedType.LPArray, SizeConst = MaxStringSize)] 
                char[] name,
                int id);
    Il suffit juste de specifier la bonne convention d'appel.

    LPStr et LPWStr sont a mon avis réservé pour les type microsoft C++ qui vont bien (et dont j'ai oublier le nom ^^)

Discussions similaires

  1. System.AccessViolationException avec c_str
    Par gibsam dans le forum C++/CLI
    Réponses: 19
    Dernier message: 23/02/2011, 23h02
  2. AccessViolationException avec un OCX
    Par duffman dans le forum Windows Forms
    Réponses: 0
    Dernier message: 01/03/2010, 16h39
  3. AccessViolationException avec dllimport
    Par sebhehe dans le forum C++/CLI
    Réponses: 1
    Dernier message: 21/02/2008, 09h52
  4. [C#] Soucis avec DLLImport
    Par xanagos dans le forum C#
    Réponses: 2
    Dernier message: 01/06/2006, 15h01
  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