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.