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 :

dll non libérée (Attempted to read or write protected memory.)


Sujet :

C#

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut dll non libérée (Attempted to read or write protected memory.)
    Bonjour,

    J'ai une page qui utilise une classe C# implémentant une .dll écrite en C de la manière suivante :


    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
    //Chargement de la DLL kernel 32 afin de charger la fonction loadLibrairy
        [DllImport("Kernel32.dll", EntryPoint = "LoadLibrary")]
        private static extern IntPtr LoadLibrary(
               [In] string lpFileName
               );
     
     
        //déclaration de la fonction dans la DLL pour la décompression
        [DllImport("CompressionTrame.dll", EntryPoint = "DecompressionLZW", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int DecompressionLZW(ref COMPRESSION_TRAME trame);
     
        //déclaration de la fonction dans la DLL pour la compression
        [DllImport("CompressionTrame.dll", EntryPoint = "CompressionLZW", ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
        public static extern int CompressionLZW(ref COMPRESSION_TRAME trame);
     
     
        // ###############################################
        //                      CONSTRUCTEUR
        // ###############################################
        /// <summary>
        /// Le constructeur de la classe.
        /// </summary>
        /// <param name="chemin">Chemin permettant d'accéder aux .dll</param>
     
        public compressionCriptage(String chemin)
    	{
            //chargement de CompressionTrame.dll
            LoadLibrary(chemin + "\\CompressionTrame.dll");
    	}
    Tout fonctionne très bien sauf dans le cas où ma page est appelée plusieurs fois de suite. Dans ce cas j'ai une erreur (cf ci-dessous) :

    "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
    Exception Details: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is
    corrupt.

    Stack Trace:
    [AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.]
    compressionCriptage.CompressionLZW(COMPRESSION_TRAME& trame) +0
    compressionCriptage.Compression(String chaine) in c:\Inetpub\...\compressionCriptage.cs:125
    communication_XXX.Page_Load(Object sender, EventArgs e) in c:\Inetpub\....communication_XXX.aspx.cs:303
    System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +15
    System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +34
    System.Web.UI.Control.OnLoad(EventArgs e) +99
    System.Web.UI.Control.LoadRecursive() +47
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +1061

    Je pense qu'il s'agit d'un problème de libération des ressources (la .dll n'est pas encore dispo quand on a re-besoin d'elle).
    Le problème est que je ne sais pas comment "libérer" ma .dll

    Pour info, j'ai déjà regardé un peu sur Google et aussi du côté de
    - http://nico-pyright.developpez.com/t...vokeWithCSharp,
    - http://morpheus.developpez.com/dlldotnet/,
    - http://laurent-dardenne.developpez.c...seurs/#L2-10-2 etc...

    et les choses ne me semblent pas beaucoup plus clair (faut il une méthode close dans la .dll?, utiliser IDisposable?..)

    Merci d'avance pour votre aide.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2004
    Messages : 52
    Points : 60
    Points
    60
    Par défaut
    Bonjour
    A quoi te sert ta méthode LoadLibrary?
    A t'elle un intérêt dans ton cas?
    cdlt,

  3. #3
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Points : 5 195
    Points
    5 195
    Par défaut
    On n'utilise pas le LoadLibrary dans des cas d'import (interop)

    On fait directement le dllImport de la fonction dont on a besoin
    et on ne se soucie pas de monter la DLL...

    (Evidemment, la dll doit se trouver dans un endroit accessible (path, exe root)

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2014, 21h57
  2. Réponses: 12
    Dernier message: 29/09/2009, 15h55
  3. Réponses: 1
    Dernier message: 28/09/2009, 21h41
  4. Attempted to read or write protected memory
    Par identifiant_bidon dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 06/02/2008, 14h37

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