diff --git a/src/Compilers/Core/Portable/PEWriter/PdbWriter.cs b/src/Compilers/Core/Portable/PEWriter/PdbWriter.cs index 3339dc88801ff8098c8a6c67ee902bfab4ac03e0..a89635a460ea3869f7d7f79e2ff24993223d4ab0 100644 --- a/src/Compilers/Core/Portable/PEWriter/PdbWriter.cs +++ b/src/Compilers/Core/Portable/PEWriter/PdbWriter.cs @@ -55,8 +55,15 @@ internal sealed class PdbWriter : IDisposable private uint[] _sequencePointEndLines; private uint[] _sequencePointEndColumns; - [DllImport("shlwapi.dll", ExactSpelling = true, CharSet = CharSet.Unicode)] - private extern static IStream SHCreateMemStream([In] IntPtr pInit, [In] uint cbInit); + [DllImport("Ole32", ExactSpelling = true)] + private static extern int CreateStreamOnHGlobal(IntPtr hGlobal, bool fDeleteOnRelease, out IStream stream); + + private static IStream CreateNativeStream() + { + IStream stream = null; + Marshal.ThrowExceptionForHR(CreateStreamOnHGlobal(IntPtr.Zero, fDeleteOnRelease: true, stream: out stream)); + return stream; + } public PdbWriter(string fileName, Func symWriterFactory = null) { @@ -600,7 +607,7 @@ public void SetMetadataEmitter(MetadataWriter metadataWriter) // and the resulting PDB has Age = existing_age + 1. // PERF: Use a native stream for the write and copy it at the end. This reduces the total GC // allocations for the COM interop and geometric growth of the underlying managed stream. - _nativeStream = SHCreateMemStream(IntPtr.Zero, 0u); + _nativeStream = CreateNativeStream(); instance.Initialize(new PdbMetadataWrapper(metadataWriter), _fileName, _nativeStream, fullBuild: true);