如何解组指向以后应释放的数组的指针?

时间:2018-07-11 16:53:54

标签: c# pinvoke marshalling

我想从C#程序中调用AuditEnumerateCategories函数,为此我声明了如下外部函数:

[DllImport("advapi32.dll", SetLastError = true)]
private static extern bool AuditEnumerateCategories(
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] out Guid[] auditCategories,
    out uint numCategories);

然后我可以在代码中将其用作:

if (AuditEnumerateCategories(out Guid[] categories, out uint dummySize)) 
{
    ...
}

这很好用,但是随后我在docs中注意到了有关作为第一个参数返回的数组的以下内容:

  

使用完此缓冲区后,通过调用AuditFree函数将其释放。

是否有一种方法可以从我可以用来调用AuditFree函数的IntPtr变量中提取一个categories?还是我应该宣布AuditEnumerateCategories返回IntPtr并自己对Guid[]进行编组?

1 个答案:

答案 0 :(得分:3)

该框架不会自动为您执行此操作。您需要将参数声明为IntPtr并手动进行所有封送处理。