我正在使用 DllImport 从我自己的 .net 类中调用 c 包装器库中的方法。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,它位于调用 free(ptr) 的 c 包装器库中。
这是问题;最近,虽然它像魅力一样工作,但我开始出现“尝试读取或写入受保护的内存区域”异常。经过更深入的分析,我发现,我相信,虽然我为此指针调用了 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;
}
}