1

我在 C 上有一个带有 func 的非托管 DLL:

char* 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) 不起作用。

4

3 回答 3

4

您需要导出一个可以使用free. 正如您所注意到Marshal.FreeHGlobal的并且Marshal.FreeCoTaskMem不起作用,因为这些函数需要使用不同分配函数分配的指针。

如果您创建一个分配内存并返回指向该内存的指针的 API,您还必须在 API 中添加一个函数来释放内存。否则,您的 API 在用于分配内存的库(在本例中为 C 标准库)之外将不可用。

于 2012-09-17T13:20:36.473 回答
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);
于 2012-09-17T13:26:21.907 回答
0

在您的 DLL 中创建自定义自由函数时,您还可以使用CoTaskMemAlloc 来代替malloc分配内存。

然后,您可以使用Marshal.FreeCoTaskMem它来释放它。

于 2012-09-17T13:29:55.380 回答