From 2f3dff2dbda64726c4292f82337203fd5bb0c7c9 Mon Sep 17 00:00:00 2001 From: Tomas Matousek Date: Mon, 2 May 2016 18:01:10 -0700 Subject: [PATCH] DSR.PortablePdb.Tests: Remove dependency on PdbUtilities --- ....DiaSymReader.PortablePdb.UnitTests.csproj | 7 --- .../TestHelpers/SymTestHelpers.cs | 53 +++++++++++++++++-- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/Debugging/Microsoft.DiaSymReader.PortablePdb.Tests/Microsoft.DiaSymReader.PortablePdb.UnitTests.csproj b/src/Debugging/Microsoft.DiaSymReader.PortablePdb.Tests/Microsoft.DiaSymReader.PortablePdb.UnitTests.csproj index abd0a470c27b3..abc7df8918330 100644 --- a/src/Debugging/Microsoft.DiaSymReader.PortablePdb.Tests/Microsoft.DiaSymReader.PortablePdb.UnitTests.csproj +++ b/src/Debugging/Microsoft.DiaSymReader.PortablePdb.Tests/Microsoft.DiaSymReader.PortablePdb.UnitTests.csproj @@ -28,10 +28,6 @@ {8635cb8f-d210-41ed-b4ff-71502cdb475c} xUnit.net - - {afde6bea-5038-4a4a-a88e-dbd2e4088eed} - PdbUtilities - {f83343ba-b4ea-451c-b6db-5d645e6171bc} Microsoft.DiaSymReader.PortablePdb @@ -93,9 +89,6 @@ - - TestHelpers\StreamExtensions.cs - diff --git a/src/Debugging/Microsoft.DiaSymReader.PortablePdb.Tests/TestHelpers/SymTestHelpers.cs b/src/Debugging/Microsoft.DiaSymReader.PortablePdb.Tests/TestHelpers/SymTestHelpers.cs index 43561817696f2..8eb9bee3d1fa8 100644 --- a/src/Debugging/Microsoft.DiaSymReader.PortablePdb.Tests/TestHelpers/SymTestHelpers.cs +++ b/src/Debugging/Microsoft.DiaSymReader.PortablePdb.Tests/TestHelpers/SymTestHelpers.cs @@ -2,11 +2,10 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection.Metadata; -using Roslyn.Test.PdbUtilities; +using System.Runtime.InteropServices; using Roslyn.Test.Utilities; using Xunit; @@ -14,9 +13,57 @@ namespace Microsoft.DiaSymReader.PortablePdb.UnitTests { internal static class SymTestHelpers { + [DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)] + [DllImport("Microsoft.DiaSymReader.Native.x86.dll", EntryPoint = "CreateSymReader")] + private extern static void CreateSymReader32(ref Guid id, [MarshalAs(UnmanagedType.IUnknown)]out object symReader); + + [DefaultDllImportSearchPaths(DllImportSearchPath.AssemblyDirectory)] + [DllImport("Microsoft.DiaSymReader.Native.amd64.dll", EntryPoint = "CreateSymReader")] + private extern static void CreateSymReader64(ref Guid id, [MarshalAs(UnmanagedType.IUnknown)]out object symReader); + + private static ISymUnmanagedReader3 CreateNativeSymReader(Stream pdbStream, object metadataImporter) + { + object symReader = null; + + var guid = default(Guid); + if (IntPtr.Size == 4) + { + CreateSymReader32(ref guid, out symReader); + } + else + { + CreateSymReader64(ref guid, out symReader); + } + + var reader = (ISymUnmanagedReader3)symReader; + reader.Initialize(pdbStream, metadataImporter); + return reader; + } + + private static ISymUnmanagedReader3 CreatePortableSymReader(Stream pdbStream, object metadataImporter) + { + return (ISymUnmanagedReader3)new SymBinder().GetReaderFromStream(pdbStream, metadataImporter); + } + + public static ISymUnmanagedReader3 CreateReader(Stream pdbStream, object metadataImporter) + { + pdbStream.Position = 0; + bool isPortable = pdbStream.ReadByte() == 'B' && pdbStream.ReadByte() == 'S' && pdbStream.ReadByte() == 'J' && pdbStream.ReadByte() == 'B'; + pdbStream.Position = 0; + + if (isPortable) + { + return CreatePortableSymReader(pdbStream, metadataImporter); + } + else + { + return CreateNativeSymReader(pdbStream, metadataImporter); + } + } + public static ISymUnmanagedReader CreateSymReaderFromResource(KeyValuePair peAndPdb) { - return SymReaderFactory.CreateReaderImpl(new MemoryStream(peAndPdb.Value), metadataImporter: new SymMetadataImport(new MemoryStream(peAndPdb.Key))); + return CreateReader(new MemoryStream(peAndPdb.Value), metadataImporter: new SymMetadataImport(new MemoryStream(peAndPdb.Key))); } public static void ValidateDocumentUrl(ISymUnmanagedDocument document, string url)