public static ISymbolReader GetSymbolReaderForFile(ISymbolBinder1 binder, string pathModule, string searchPath) { // Guids for imported metadata interfaces. Guid dispenserClassID = new Guid(0xe5cb7a31, 0x7512, 0x11d2, 0x89, 0xce, 0x00, 0x80, 0xc7, 0x92, 0xe5, 0xd8); // CLSID_CorMetaDataDispenser Guid importerIID = new Guid(0x7dac8207, 0xd3ae, 0x4c75, 0x9b, 0x67, 0x92, 0x80, 0x1a, 0x49, 0x7d, 0x44); // IID_IMetaDataImport // First create the Metadata dispenser. var metaHost = new ClrMetaHost(); var runtime = metaHost.GetRuntime("v4.0.30319"); var dispenser = runtime.GetInterface <IMetaDataDispenser>(dispenserClassID); dispenser.OpenScope(pathModule, 0, ref importerIID, out var objImporter); IntPtr importerPtr = IntPtr.Zero; ISymbolReader reader; try { // This will manually AddRef the underlying object, so we need to // be very careful to Release it. importerPtr = Marshal.GetComInterfaceForObject(objImporter, typeof(IMetadataImport)); reader = binder.GetReader(importerPtr, pathModule, searchPath); } finally { if (importerPtr != IntPtr.Zero) { Marshal.Release(importerPtr); } } return(reader); }
private static ISymbolBinder1 GetSymbolBinder() { if (symbolBinder == null) { symbolBinder = new SymbolBinder(); Debug.Assert(symbolBinder != null); } return(symbolBinder); }