SourceBrowser 的源码流程(待继续细化)
先读取 sln 项目里的文件,这里会读取到对应的项目,里面可以找到 在读取cs等文件,创建输出文件夹
会生成一个类似集合对象,里面有你的代码文件,然后遍历集合,找出代码文件
如 xx.cs文件,然后读取 cs 文件里的代码 ,还有一些roslyn 读取 语法根,获取语义模型异步,获取文档范围 rangs,创建委托
部分该不太确定具体意义
SourceText res = await _document.GetTextAsync();
Root = await _document.GetSyntaxRootAsync();//获取语法根
SemanticModel = await _document.GetSemanticModelAsync();//获取语义模型异步
根据 cs文件名称创建 html文件,
然后通过 StreamWriter( html文件地址) 写入数据待文件
然后读取rangs 中的 text,( 理解为文本所在的位置,读取这个位置的文本[0-20] 为 // <auto-generated/>)
有实现则会生成链接连接到实现处,没有则展示
检查这个文本有没有实现
1 有实现(例如 A a=new() 自定义对象)
会先获取 当前 rangs 里 获取 token,然后 rang,token 去获取 GetSymbol 获取 符号们就是有没有实现(此处系统的如system.write() 等 要有 网上的程序集集合才能获取到)
然后 判断 程序集 ISymbol 的种类
if ((symbol.Kind == SymbolKind.Event ||
symbol.Kind == SymbolKind.Field ||
symbol.Kind == SymbolKind.Method ||
symbol.Kind == SymbolKind.NamedType ||
symbol.Kind == SymbolKind.Property) &&
symbol.Locations.Length >= 1)
然后 生成链接
var typeSymbol = symbol as ITypeSymbol;
string symbolId = SymbolIdService.GetId(symbol);
var location = symbol.Locations[0];
string destinationAssemblyName = null;
if (location.IsInSource)
{
//生成有元数据的链接
result = GenerateHyperlink(symbol, symbolId, location.SourceTree, out destinationAssemblyName);
}
链接主要有 程序cs名称,加上 ISymbol 生成的 的id (由程序名称的 MD5 获取 hash 在转化字符 )
链接例子: A.cs.html#666fbff426dc92fc
return new HtmlElementInfo
{
Name = "a",
Attributes =
{
{ "href", href },
}
};
通过 stringbuild 拼接文本 生成html代码
<span class="comment">// <auto-generated/></span>
然后写入StreamWriter
2 没实现 (public class a)
则通过 stringbuild 拼接都出来的文本 生成html代码
<span class="comment">// <auto-generated/></span>
然后写入StreamWriter
在读取 项目里的所有cs文件并创建对应html,
遍历读取cs文件,有些类,方法 有实现的添加链接并写入
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)