我在C#中使用了本机方法调用和DllImport功能。我想知道应该如何在本机方面手动释放内存方法参数。我应该在C#dllimport本机方法调用中释放内存参数吗?
目前,我发送double []数组到本地方法,本地方法获取paretmer作为double *类型。我应该在本地方法中释放double *吗?
我在C#中使用了本机方法调用和DllImport功能。我想知道应该如何在本机方面手动释放内存方法参数。我应该在C#dllimport本机方法调用中释放内存参数吗?
目前,我发送double []数组到本地方法,本地方法获取paretmer作为double *类型。我应该在本地方法中释放double *吗?
不,你应该让.NET处理内存管理本身。本地代码编组器遵循COM互操作的基本规则,这也是P/Invoke大部分时间工作的原因,因为Win32也遵循规则。 (也有例外,但他们会在Windows API文档中调出)。
既然你写了P/Invoke调用的两端,你应该遵循这些相同的规则,让你的生活变得轻松。就内存分配而言,大部分时间调用者负责释放任何跨越P/Invoke边界的内存,因为被调用者不知道是否/何时可以安全地执行此操作。这包括:
在这两种情况下的out
参数或返回值,只有调用者知道何时不再需要内存并且可以安全地释放内存。在P/Invoke调用的情况下,运行时编组人员知道这一点,并且它会分配内存以在编组调用之前将您的double[]
编组到double *
,然后在调用返回时释放该内存。根据ref
,out
,[In]
或[Out]
属性的组合,它可能会也可能不会尝试将数据复制回您的double[]
,但它将始终释放该内存。
感谢您的好评! – 2014-11-09 10:19:23