generator.cs
来自「全功能c#编译器」· CS 代码 · 共 112 行
CS
112 行
using System;
using System.IO;
using System.Collections;
using System.Reflection;
using System.Windows.Forms;
using System.Xml;
namespace ICSharpCode.HelpConverter.HelpTreeBuilder
{
public class Generator
{
public Generator(XmlDocument doc, XmlNode rootNode, string[] args)
{
AssemblyLoader loader = new AssemblyLoader();
Assembly[] assemblies;
try {
assemblies = loader.LoadAssemblies(args);
} catch(Exception e) {
throw e;
}
Hashtable typesByNamespace = loadTypesByNamespace(assemblies);
string[] namespacesSorted = new string[typesByNamespace.Keys.Count];
int count = 0;
foreach(string nspace in typesByNamespace.Keys) {
namespacesSorted[count] = nspace;
count++;
}
Array.Sort(namespacesSorted);
foreach(string nspace in namespacesSorted) {
// create folder node for namespace
XmlNode namespaceNode = doc.CreateElement("HelpFolder");
XmlAttribute attrib = doc.CreateAttribute("name");
attrib.Value = nspace;
namespaceNode.Attributes.Append(attrib);
string[] typesSorted = new string[((Hashtable)typesByNamespace[nspace]).Count];
count = 0;
foreach(string typeName in ((Hashtable)typesByNamespace[nspace]).Keys) {
typesSorted[count] = typeName;
count++;
}
Array.Sort(typesSorted);
// put the namespace in a separate file
XmlDocument newDoc = new XmlDocument();
newDoc.LoadXml("<HelpCollection/>");
bool setNamespaceLink = false;
foreach(string typeName in typesSorted) {
Type type = (Type)((Hashtable)typesByNamespace[nspace])[typeName];
try {
newDoc.DocumentElement.AppendChild(TypeNodeFactory.CreateNode(type, newDoc));
// set link to namespace description
if (!setNamespaceLink) {
classNodeBuilder cbn = new classNodeBuilder();
cbn.SetLink(doc, namespaceNode, cbn.ConvertLink(classNodeBuilder.helpFileFormat.NamespaceFormat,type ));
setNamespaceLink = true;
}
} catch(Exception e) {
System.Console.WriteLine(e.Message);
}
}
string helpFileName = Application.StartupPath + Path.DirectorySeparatorChar + nspace + "Help.xml";
HelpBrowserApp.HelpFiles.Add(helpFileName);
newDoc.Save(helpFileName);
// create help reference
XmlElement referenceNode = doc.CreateElement("HelpReference");
attrib = doc.CreateAttribute("reference");
attrib.Value = nspace + "Help.xml";
referenceNode.Attributes.Append(attrib);
namespaceNode.AppendChild(referenceNode);
// add the namespace + reference node to the document
rootNode.AppendChild(namespaceNode);
}
}
Hashtable loadTypesByNamespace(Assembly[] assemblies)
{
Hashtable namespaces = new Hashtable();
foreach(Assembly assembly in assemblies) {
foreach(Type type in assembly.GetTypes()) {
if(type.Namespace != null && type.IsPublic) {
if(namespaces.Contains(type.Namespace) == false) {
namespaces.Add(type.Namespace, new Hashtable());
}
((Hashtable)namespaces[type.Namespace]).Add(type.Name, type);
} else {
System.Console.WriteLine("no namespace, ignoring: " + type.Name);
}
}
}
return namespaces;
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?