/// <summary> /// /// </summary> /// <param name="namespaceName"></param> /// <param name="baseType"></param> /// <param name="derivedType"></param> public void Add(string namespaceName, Type baseType, Type derivedType) { TypeHierarchy derivedTypesCollection = namespaces[namespaceName] as TypeHierarchy; if (derivedTypesCollection == null) { derivedTypesCollection = new TypeHierarchy(); namespaces.Add(namespaceName, derivedTypesCollection); } derivedTypesCollection.Add(baseType, derivedType); }
private void WriteTypeHierarchy(XmlWriter writer, TypeHierarchy derivedTypes, Type type) { writer.WriteStartElement("hierarchyType"); writer.WriteAttributeString("id", MemberID.GetMemberID(type)); writer.WriteAttributeString("displayName", MemberDisplayName.GetMemberDisplayName(type)); writer.WriteAttributeString("namespace", type.Namespace); ArrayList interfaces = baseInterfaces.GetDerivedTypes(type); if (interfaces.Count > 0) { writer.WriteStartElement("hierarchyInterfaces"); foreach (Type baseInterfaceType in interfaces) { writer.WriteStartElement("hierarchyInterface"); writer.WriteAttributeString("id", MemberID.GetMemberID(baseInterfaceType)); writer.WriteAttributeString("displayName", MemberDisplayName.GetMemberDisplayName(baseInterfaceType)); writer.WriteAttributeString("namespace", baseInterfaceType.Namespace); writer.WriteAttributeString("fullName", baseInterfaceType.FullName); writer.WriteEndElement(); } writer.WriteEndElement(); } ArrayList childTypesList = derivedTypes.GetDerivedTypes(type); foreach (Type childType in childTypesList) { WriteTypeHierarchy(writer, derivedTypes, childType); } writer.WriteEndElement(); }
/// <summary>Builds an Xml file combining the reflected metadata with the /doc comments.</summary> private void BuildXml(XmlWriter writer) { int start = Environment.TickCount; Debug.WriteLine("Memory making xml: " + GC.GetTotalMemory(false).ToString()); try { assemblyLoader = SetupAssemblyLoader(); string DocLangCode = Enum.GetName(typeof(SdkLanguage), this.rep.SdkDocLanguage).Replace("_", "-"); externalSummaryCache = new ExternalXmlSummaryCache(DocLangCode); notEmptyNamespaces = new Hashtable(); namespaceHierarchies = new NamespaceHierarchyCollection(); baseInterfaces = new TypeHierarchy(); derivedTypes = new TypeHierarchy(); interfaceImplementingTypes = new TypeHierarchy(); attributeFilter = new AttributeUsageDisplayFilter(this.rep.DocumentedAttributes); documentedTypes = new Hashtable(); PreReflectionProcess(); string currentAssemblyFilename = ""; try { // Start the document with the XML declaration tag writer.WriteStartDocument(); // Start the root element writer.WriteStartElement("ndoc"); writer.WriteAttributeString("SchemaVersion", "1.4"); if (this.rep.FeedbackEmailAddress.Length > 0) WriteFeedBackEmailAddress(writer); if (this.rep.CopyrightText.Length > 0) WriteCopyright(writer); if (this.rep.IncludeDefaultThreadSafety) WriteDefaultThreadSafety(writer); if (this.rep.Preliminary) writer.WriteElementString("preliminary", ""); WriteNamespaceHierarchies(writer); foreach (string AssemblyFileName in this.rep.AssemblyFileNames) { currentAssemblyFilename = AssemblyFileName; Assembly assembly = assemblyLoader.LoadAssembly(currentAssemblyFilename); int starta = Environment.TickCount; WriteAssembly(writer, assembly); Trace.WriteLine("Completed " + assembly.FullName); Trace.WriteLine(((Environment.TickCount - starta) / 1000.0).ToString() + " sec."); } writer.WriteEndElement(); writer.WriteEndDocument(); writer.Flush(); Trace.WriteLine("MakeXML : " + ((Environment.TickCount - start) / 1000.0).ToString() + " sec."); // if you want to see NDoc's intermediate XML file, use the XML documenter. } finally { if (assemblyLoader != null) { assemblyLoader.Deinstall(); } } } catch (ReflectionTypeLoadException rtle) { StringBuilder sb = new StringBuilder(); if (assemblyLoader.UnresolvedAssemblies.Count > 0) { sb.Append("One or more required assemblies could not be located : \n"); foreach (string ass in assemblyLoader.UnresolvedAssemblies) { sb.AppendFormat(" {0}\n", ass); } sb.Append("\nThe following directories were searched, \n"); foreach (string dir in assemblyLoader.SearchedDirectories) { sb.AppendFormat(" {0}\n", dir); } } else { Hashtable fileLoadExceptions = new Hashtable(); foreach (Exception loaderEx in rtle.LoaderExceptions) { System.IO.FileLoadException fileLoadEx = loaderEx as System.IO.FileLoadException; if (fileLoadEx != null) { if (!fileLoadExceptions.ContainsKey(fileLoadEx.FileName)) { fileLoadExceptions.Add(fileLoadEx.FileName, null); sb.Append("Unable to load: " + fileLoadEx.FileName + "\r\n"); } } sb.Append(loaderEx.Message + Environment.NewLine); sb.Append(loaderEx.StackTrace + Environment.NewLine); sb.Append("--------------------" + Environment.NewLine + Environment.NewLine); } } throw new DocumenterException(sb.ToString()); } }