Я использую DllImport для вызова метода в библиотеке оболочки c из моего собственного класса .net. Этот метод в c dll создает строковую переменную и возвращает указатель строки.
Что-то вроде этого;
_declspec(dllexport) int ReturnString()
{
char* retval = (char *) malloc(125);
strcat(retval, "SOMETEXT");
strcat(retval, "SOMETEXT MORE");
return (int)retval;
}
Затем я прочитал строку, используя Marshall.PtrToStringAnsi(ptr). После того, как я получаю копию строки, я просто вызываю другой метод c HeapDestroy, который находится в библиотеке-оболочке c, которая вызывает free(ptr).
Вот вопрос; Недавно, пока он работает как часы, я начал получать исключение «Попытка чтения или записи в защищенную область памяти». После более глубокого анализа я понял, я верю, хотя я вызываю метод free для этого указателя, значение указателя не очищается, и это заполняет кучу без присмотра и заставляет мой рабочий процесс iis выдавать это исключение. Кстати, это проект веб-сайта, который вызывает этот метод в библиотеке c.
Не могли бы вы помочь мне в этом вопросе?
Конечно, вот код 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;
}
}