public SymbolWriter(string binaryFile, string pdbFile) { Contract.Requires(binaryFile != null); Contract.Requires(pdbFile != null); IntPtr importer = IntPtr.Zero; try { object dispenser; OLE32.CoCreateInstance(ref XGuid.dispenserClassID, null, 1, ref XGuid.dispenserIID, out dispenser); object pUnknown; ((IMetaDataDispenserSubset)dispenser).OpenScope(binaryFile, 0, ref XGuid.importerIID, out pUnknown); importer = Marshal.GetComInterfaceForObject(pUnknown, typeof(IMetadataImport)); object writer2; OLE32.CoCreateInstance(ref XGuid.symWriterClassID, null, 1, ref XGuid.symWriterIID, out writer2); writer = (ISymUnmanagedWriter2)writer2; writer.Initialize(importer, pdbFile, null, true); } catch (Exception x) { Console.WriteLine(x.Message); } finally { if (importer != IntPtr.Zero) { Marshal.Release(importer); } } }
/// <summary> /// Constructor for SymbolReader. /// Just creates a reference to the unmanaged reader /// from the COM world. This Reader only implements /// the method(s) required by PERWAPI. /// </summary> /// <param name="filename"></param> public SymbolReader(string filename) { Contract.Requires(filename != null); IntPtr importer = IntPtr.Zero; try { object ppb; OLE32.CoCreateInstance(ref XGuid.dispenserClassID, null, 1, ref XGuid.dispenserIID, out ppb); object pBnd; OLE32.CoCreateInstance(ref XGuid.binderCLSID, null, 1, ref XGuid.binderIID, out pBnd); // Get the metadata dispenser from mscoree.dll Util.ComCheck(ppb != null, "Failed to create metadata dispenser"); object pUnk; ((IMetaDataDispenserSubset)ppb).OpenScope(filename, 0, ref XGuid.importerIID, out pUnk); Util.ComCheck(pUnk != null, "Failed to open scope"); importer = Marshal.GetComInterfaceForObject(pUnk, typeof(IMetadataImport)); object retVal; ((ISymUnmanagedBinder)pBnd).GetReaderForFile(importer, filename, null, out retVal); private_reader = (ISymUnmanagedReader)retVal; } catch (Exception x) { Console.WriteLine(x.Message); } finally { if (importer != IntPtr.Zero) { Marshal.Release(importer); } } }