예제 #1
0
        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 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;
            }
        }