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

问题描述 投票:-1回答:1

指针从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# dll marshalling
1个回答
0
投票

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

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

此规则允许您不透露内部详细信息,从而允许您在不打破调用者的情况下更改内部。

© www.soinside.com 2019 - 2024. All rights reserved.