J'utilise DllImport pour appeler la méthode dans la bibliothèque d'encapsuleur c de ma propre classe .net. Cette méthode dans c dll crée une variable chaîne et renvoie le pointeur de la chaîne.La mémoire libre n'efface pas le bloc de mémoire
Quelque chose comme ceci;
_declspec(dllexport) int ReturnString()
{
char* retval = (char *) malloc(125);
strcat(retval, "SOMETEXT");
strcat(retval, "SOMETEXT MORE");
return (int)retval;
}
Puis j'ai lu la chaîne en utilisant Marshall.PtrToStringAnsi (ptr). Après avoir obtenu une copie de la chaîne, j'appelle simplement une autre méthode c HeapDestroy qui est dans la librairie c wrapper qui appelle free (ptr).
Voici la question; Récemment, alors qu'il fonctionne comme un charme, j'ai commencé à obtenir l'exception «Tentative de lecture ou d'écriture de zone de mémoire protégée». Après une analyse plus approfondie, j'ai compris, je crois, bien que j'appelle méthode libre pour ce pointeur, la valeur du pointeur n'est pas effacée, et ceci remplit le tas sans surveillance et fait que mon processus de travail iis lance cette exception. En passant, c'est un projet de site Web qui appelle cette méthode dans la bibliothèque c.
Pourriez-vous m'aider à ce sujet?
Bien sûr, voici le code C#;
[DllImport("MyCWrapper.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private extern static int ReturnString();
[DllImport("MyCWrapper.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private extern static void HeapDestroy(int ptr);
public static string GetString()
{
try
{
int i = ReturnString();
string result = String.Empty;
if (i > 0)
{
IntPtr ptr = new IntPtr(i);
result = Marshal.PtrToStringAnsi(ptr);
HeapDestroy(i);
}
return result;
}
catch (Exception e)
{
return String.Empty;
}
}
Pourriez-vous s'il vous plaît poster le code C# que vous utilisez? –
J'ai ajouté le code C#. Merci –