protected override void ParseFile(string fileName, IProgressMonitor parentMonitor)
        {
            if (!File.Exists(fileName))
            {
                return;
            }
            IProgressMonitor monitor = parentMonitor;

            IDisposable timer = Counters.AssemblyParseTime.BeginTiming();

            // Update the package version
            SystemPackage pkg = Runtime.SystemAssemblyService.GetPackageFromPath(assemblyFile);

            if (pkg != null)
            {
                packageVersion = pkg.Name + " " + pkg.Version;
            }

            try {
                if (parentMonitor == null)
                {
                    monitor = ProjectDomService.GetParseProgressMonitor();
                }
                parsing = true;

                if (monitor != null)
                {
                    monitor.BeginTask(string.Format(GettextCatalog.GetString("Parsing assembly: {0}"), Path.GetFileName(fileName)), 1);
                }
                if (useExternalProcess)
                {
                    using (DatabaseGenerator helper = GetGenerator(true))
                    {
                        string tmpDbFile = helper.GenerateDatabase(runtime.Id, fx.Id, baseDir, assemblyFile);
                        if (Disposed)
                        {
                            if (tmpDbFile != null)
                            {
                                File.Delete(tmpDbFile);
                            }
                            return;
                        }
                        if (tmpDbFile != null)
                        {
                            // GenerateDatabase generates the info in a temp file. Now we have to
                            // unlock the current database file, copy the new file over it, and
                            // read (and lock) the database again.
                            UnlockDatabaseFile();
                            File.Delete(RealDataFile);
                            File.Move(tmpDbFile, RealDataFile);
                            Read();
                        }
                    }
                }
                else
                {
                    DomCecilCompilationUnit ainfo = DomCecilCompilationUnit.Load(fileName, false, true, false);

                    UpdateTypeInformation(ainfo.Types, ainfo.Attributes, fileName);

                    // Reset the error retry count, since the file has been
                    // successfully parsed.
                    FileEntry e = GetFile(fileName);
                    e.ParseErrorRetries = 0;

                    Flush();
                }
            } catch (Exception ex) {
                FileEntry e = GetFile(fileName);
                e.LastParseTime = DateTime.MinValue;
                if (e.ParseErrorRetries > 0)
                {
                    if (--e.ParseErrorRetries == 0)
                    {
                        e.DisableParse = true;
                    }
                }
                else
                {
                    e.ParseErrorRetries = 3;
                }
                if (monitor != null)
                {
                    monitor.ReportError("Error parsing assembly: " + fileName, ex);
                }
                throw;
            } finally {
                parsing = false;
                if (monitor != null)
                {
                    monitor.EndTask();
                    if (parentMonitor == null)
                    {
                        monitor.Dispose();
                    }
                }
                timer.Dispose();
            }
            ProjectDomService.NotifyAssemblyInfoChange(fileName, assemblyFile);
        }