From 3abd28cedfcdbef558ced23b7d8a2635874c79e6 Mon Sep 17 00:00:00 2001 From: Paul Harrington Date: Wed, 22 Apr 2015 07:37:58 -0700 Subject: [PATCH] Use CreateStreamOnHGlobal instead of SHCreateStream SHCreateStream isn't available on server OS --- src/Compilers/Core/Portable/PEWriter/PdbWriter.cs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Compilers/Core/Portable/PEWriter/PdbWriter.cs b/src/Compilers/Core/Portable/PEWriter/PdbWriter.cs index 3339dc88801..a89635a460e 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); -- GitLab