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

How to unmarshal a pointer to an array that should later be freed?

我想从 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 中关于作为第一个参数返回的数组的以下内容:

When you have finished using this buffer, free it by calling the AuditFree function.

有没有办法从我可以用来调用 AuditFree 函数的 categories 变量中获取 IntPtr?或者我应该声明 AuditEnumerateCategories 返回一个 IntPtr 并自己编组到 Guid[] 吗?

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