如何释放在C#中分配给从C ++ dll传递给IntPtr的内存?

时间:2019-02-26 21:33:58

标签: c# dll marshalling

一个指针从C ++ dll传递给我,如下所示:

[DllImport("myfile.dll", EntryPoint = "LoadFile", SetLastError = true, CharSet = CharSet.None)]
public static extern IntPtr dLoadFile(string x);

IntPtr p = dLoadFile("myfile");

//Do things with p.

Marshal.FreeHGlobal(p) //crash on this line with exception below.
  

System.Runtime.InteropServices.COMException:“一个或多个参数   无效(来自HRESULT的异常:0x80000003)'

我应该释放分配给IntPtr的内存吗?如果是,该如何正确执行? 显然,似乎Marshal.FreeHGlobal()并非可行之路...

谢谢

1 个答案:

答案 0 :(得分:0)

一般规则是“需要调用分配资源的人来执行清理”。在c#中,您不拥有内存:clr拥有它。共享的c#程序集也共享clr,因此您有印象在一个程序集中创建一个对象,然后在另一个程序集中释放它。执行互操作性时,应通过附加的导出api由同一库清除由库创建的资源。但是,也有一些例外,它们会考虑何时创建操作系统对象:根据有关对象的特定文档,您可以在调用者站点上释放资源。

以您为例,您应该在我的file.dll中导出适当的api,以正确执行清理。

此规则允许您不透露内部详细信息,从而可以在不打断呼叫者的情况下更改内部信息。