我在C上使用func:
有一个非托管DLLchar* My_Func(char* data, int input_length, int output_length);
在这个功能中我有
result = (char*)malloc(output_lenght);
strcpy(result,test_char);
return(result);
在C#中导入它
[DllImport(@"libsmev.DLL", CharSet = CharSet.Ansi)]
public static extern IntPtr My_Func([MarshalAs(UnmanagedType.LPStr)]string data, int input_length, out int output_length);
并称之为
IntPtr result = My_Func (n1, n1.Lenght,n2);
如何释放char *或IntPtr?
Marshal.FreeHGlobal(IntPtr)和Marshal.FreeCoTaskMem(IntPtr)不起作用。
答案 0 :(得分:4)
您需要导出一个可以使用free
释放指针的函数。您已经注意到Marshal.FreeHGlobal
并且Marshal.FreeCoTaskMem
不起作用,因为这些函数需要使用不同分配函数分配的指针。
如果您创建一个分配内存并返回指向此内存的指针的API,您还必须在API中添加一个函数来释放内存。否则,您的API将无法在用于分配内存的库外部使用(在本例中为C标准库)。
答案 1 :(得分:3)
在C中,像这样:
void Free_Obj(char* obj) {
free(obj);
}
在C#中,类似这样:
[DllImport("libsmev.DLL")]
public static extern void Free_Obj(IntPtr obj);
并称之为:
IntPtr result = My_Func (n1, n1.Lenght,n2);
Free_Obj(result);
答案 2 :(得分:0)
您可以使用CoTaskMemAlloc代替malloc
来分配内存,而不是在DLL中创建自定义免费功能。
然后,您可以使用Marshal.FreeCoTaskMem
释放它。