private static int CreateSymbolReader(ISymUnmanagedBinder3 binder, IntPtr importer,
                                              string filename, string searchPath, bool avoidLocks, out ISymUnmanagedReader reader)
        {
            if (!avoidLocks)
            {
                return(binder.GetReaderForFile(importer, filename, searchPath, out reader));
            }

            reader = null;

            string pdbFilename = Path.ChangeExtension(filename, ".pdb");

            if (!File.Exists(pdbFilename))
            {
                return(E_PDB_NOT_FOUND);
            }

            try
            {
                byte[] bytes = File.ReadAllBytes(pdbFilename);

#if USE_ISTREAM
                IStream stream = new ComStream(new MemoryStream(bytes, 0, bytes.Length, false, true));
                return(binder.GetReaderFromStream(importer, stream, out reader));
#else
                IDiaReadExeAtOffsetCallback callback = new DiaReadExeAtOffsetCallback(bytes);
                return(binder.GetReaderFromCallback(importer, filename, searchPath,
                                                    CorSymSearchPolicyAttributes.AllowReferencePathAccess, callback, out reader));
#endif
            }
            catch (IOException)
            {
                return(E_FAIL);
            }
        }
        private static ISymUnmanagedReader CreateSymbolReader(string filename, string searchPath, bool avoidLocks)
        {
            // Guids for imported metadata interfaces.
            Guid CLSID_CorMetaDataDispenser = new Guid(0xe5cb7a31, 0x7512, 0x11d2, 0x89, 0xce, 0x00, 0x80, 0xc7, 0x92, 0xe5, 0xd8);
            Guid IID_IMetaDataImport        = new Guid(0x7dac8207, 0xd3ae, 0x4c75, 0x9b, 0x67, 0x92, 0x80, 0x1a, 0x49, 0x7d, 0x44);
            Guid CLSID_CorSymBinder         = new Guid("0A29FF9E-7F9C-4437-8B11-F424491E3931");

            // First create the Metadata dispenser.
            IMetaDataDispenser dispenser = (IMetaDataDispenser)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_CorMetaDataDispenser));

            IntPtr importer = IntPtr.Zero;

            try
            {
                int errorCode = dispenser.OpenScope(filename, 0, ref IID_IMetaDataImport, out importer);
                if (errorCode < 0)
                {
                    if (errorCode == E_FAIL ||
                        errorCode == E_FILE_NOT_FOUND)
                    {
                        return(null);
                    }
                    Marshal.ThrowExceptionForHR(errorCode);
                }

                ISymUnmanagedBinder3 binder = (ISymUnmanagedBinder3)Activator.CreateInstance(Type.GetTypeFromCLSID(CLSID_CorSymBinder));
                ISymUnmanagedReader  reader;

                errorCode = CreateSymbolReader(binder, importer, filename, searchPath, avoidLocks, out reader);

                if (errorCode < 0)
                {
                    if (errorCode == E_FAIL ||
                        errorCode == E_PDB_DEBUG_INFO_NOT_IN_PDB ||
                        errorCode == E_PDB_NO_DEBUG_INFO ||
                        errorCode == E_PDB_NOT_FOUND)
                    {
                        return(null);
                    }
                    Marshal.ThrowExceptionForHR(errorCode);
                }

                return(reader);
            }
            finally
            {
                if (importer != IntPtr.Zero)
                {
                    Marshal.Release(importer);
                }
            }
        }
        private static int CreateSymbolReader(ISymUnmanagedBinder3 binder, IntPtr importer,
            string filename, string searchPath, bool avoidLocks, out ISymUnmanagedReader reader)
        {
            if (! avoidLocks)
                return binder.GetReaderForFile(importer, filename, searchPath, out reader);

            reader = null;

            string pdbFilename = Path.ChangeExtension(filename, ".pdb");
            if (!File.Exists(pdbFilename))
                return E_PDB_NOT_FOUND;

            try
            {
                byte[] bytes = File.ReadAllBytes(pdbFilename);

#if USE_ISTREAM
                IStream stream = new ComStream(new MemoryStream(bytes, 0, bytes.Length, false, true));
                return binder.GetReaderFromStream(importer, stream, out reader);
#else
                IDiaReadExeAtOffsetCallback callback = new DiaReadExeAtOffsetCallback(bytes);
                return binder.GetReaderFromCallback(importer, filename, searchPath,
                    CorSymSearchPolicyAttributes.AllowReferencePathAccess, callback, out reader);
#endif
            }
            catch (IOException)
            {
                return E_FAIL;
            }
        }