更新:2007 年 11 月
采用调用方分配的缓冲区的 ICorProfilerInfo 方法通常符合以下签名。
HRESULT GetBuffer
(
[in] /* Some query information (for example, a name).*/,
[in] ULONG32 cBufferSizeStart,
[out] ULONG32 *pcBufferMax,
[out] /* TYPE */ InfoBuffer[]
);
这些方法始终按如下方式运行:
cBufferSizeStart 参数指定缓冲区中分配的元素数目。此值表示由此方法的调用方分配的缓冲区的大小。
pcBufferMax 参数设置为可用元素的总数。该方法返回后,pcBufferMax 将设置为原本应该返回的最大元素数目,而不是实际返回的元素数目。因此,pcBufferMax 与调用方分配的缓冲区的实际大小无关。
InfoBuffer 参数指定调用方分配的缓冲区。它由此方法的调用方创建。其大小由 cBufferSizeStart 指定。该方法返回后,此缓冲区中将填充尽可能多的元素。可用的元素可能比可放入缓冲区中的元素多。如果 InfoBuffer 为 Null,则 cBufferSizeStart 必须为 0。如果返回了任何元素,方法将返回 S_OK,并将 pcBufferMax 设置为可用元素的总数。
备注
可采用两种方法来处理调用方分配的缓冲区:
单遍方法:分配一个您认为大小足以包含所有返回的元素的缓冲区。如果缓冲区证实太小,要准备好重新分配缓冲区。否则,数据将可能被截断。
双遍方法:以交替方式调用方法两次。第一次使用长度为零的 InfoBuffer 参数调用以获取正确的缓冲区大小。然后,将缓冲区大小设置为 pcBufferMax 中返回的值,并再次调用函数。
第一种方法更快,并可避免动态分配。但是,如果缓冲区大小不足以包含信息,您可能需要重新分配缓冲区。
第二种方法较慢,因为它牵涉到两次调用和动态分配。例如,假定请求的查询信息针对的是应用程序域的名称。此方法返回后,您必须验证 InfoBuffer 是否足够大以包含应用程序域的完整名称。为此,请将 pcBufferMax 指向的值与 cBufferSizeStart 参数的值进行比较。如果 pcBufferMax 指向大于 cBufferSizeStart 的值,请分配更大的 InfoBuffer 缓冲区,用新的、更大的大小更新 cBufferSizeStart,然后再次调用该方法。