/// <summary> /// Metadata locator helper for the DAC. /// </summary> /// <param name="imagePath">file name and path to module</param> /// <param name="imageTimestamp">module timestamp</param> /// <param name="imageSize">module image</param> /// <param name="mvid">not used</param> /// <param name="mdRva">not used</param> /// <param name="flags">not used</param> /// <param name="bufferSize">size of incoming buffer (pMetadata)</param> /// <param name="pMetadata">pointer to buffer</param> /// <param name="pMetadataSize">size of outgoing metadata</param> /// <returns>HRESULT</returns> internal int GetMetadataLocator( IntPtr self, string imagePath, uint imageTimestamp, uint imageSize, byte[] mvid, uint mdRva, uint flags, uint bufferSize, IntPtr pMetadata, IntPtr pMetadataSize) { Debug.Assert(imageTimestamp != 0); Debug.Assert(imageSize != 0); if (pMetadata == IntPtr.Zero) { return(HResult.E_INVALIDARG); } int hr = HResult.S_OK; int dataSize = 0; ImmutableArray <byte> metadata = _symbolService.GetMetadata(imagePath, imageTimestamp, imageSize); if (!metadata.IsEmpty) { dataSize = metadata.Length; int size = Math.Min((int)bufferSize, dataSize); Marshal.Copy(metadata.ToArray(), 0, pMetadata, size); } else { hr = HResult.E_FAIL; } if (pMetadataSize != IntPtr.Zero) { Marshal.WriteInt32(pMetadataSize, dataSize); } return(hr); }