指针从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()不是要走的路......
谢谢
一般规则是“需要调用谁分配资源来执行清理”。在c#中,你不拥有内存:clr拥有它。您的共享c#程序集也共享clr,因此您可以在一个程序集中创建对象并将其释放到另一个程序集中。执行互操作性时,库创建的资源应由同一个库通过其他导出的api清理。但是有一些例外,他们会在创建操作系统对象时考虑:根据相关对象的特定文档,您可以在调用者站点释放资源。
在您的情况下,您应该在我的file.dll中导出适当的api,以正确执行清理。
此规则允许您不透露内部详细信息,从而允许您在不打破调用者的情况下更改内部。