Esempio n. 1
0
        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);
        }
Esempio n. 2
0
 private static ISymbolBinder1 GetSymbolBinder()
 {
     if (symbolBinder == null)
     {
         symbolBinder = new SymbolBinder();
         Debug.Assert(symbolBinder != null);
     }
     return(symbolBinder);
 }