aardio 文档
aardio 范例: .NET 名字空间分析工具
//.NET 名字空间分析工具
import win.ui;
/*DSG{{*/
var winform = win.form(text=".NET 名字空间分析工具";right=830;bottom=469)
winform.add(
button={cls="button";text="分析";left=673;top=7;right=820;bottom=43;dr=1;dt=1;z=3};
edit={cls="edit";left=15;top=54;right=816;bottom=456;db=1;dl=1;dr=1;dt=1;edge=1;hscroll=1;multiline=1;vscroll=1;z=1};
editNameSpace={cls="edit";left=177;top=12;right=546;bottom=41;dl=1;dr=1;dt=1;edge=1;multiline=1;z=2};
editNetVersion={cls="edit";text="4.0";left=599;top=12;right=654;bottom=41;edge=1;z=5};
static={cls="static";text=".NET Framework 名字空间:";left=12;top=10;right=169;bottom=35;align="right";center=1;dl=1;dt=1;transparent=1;z=4};
static2={cls="static";text="版本:";left=549;top=10;right=597;bottom=35;align="right";center=1;transparent=1;z=6}
)
/*}}*/
winform.edit.limit = -1;
winform.button.oncommand = function(id,event){
if(!#winform.editNameSpace.text){
return winform.editNameSpace.showErrorTip("请输入 .NET 名字空间")
}
winform.edit.text = "";
thread.invoke(
function(winform,netNamespace,netVersion){
winform.button.disabledText = {"✶";"✸";"✹";"✺";"✹";"✷"}
//创建 HTML + HTTP 客户端
import web.rest.htmlClient;
var htmlClient = web.rest.htmlClient();
//创建 JSON + HTTP 客户端
import web.rest.jsonClient;
var jsonClient = web.rest.jsonClient();
//声明远程 API
var apiUrl = "https://learn.microsoft.com/en-us/dotnet/api/_splitted/{namespace}/toc.json?view=netframework-"+netVersion;
var tocApi = jsonClient.api(apiUrl);
//抓取 JSON 并自动解析
var tocInfo = tocApi[netNamespace].get();
if(!tocInfo){
winform.button.disabledText = null;
winform.msgboxErr("获取数据失败");
return;
}
var map = {}
for(i,item in tocInfo.items[1][["children"]] ){
var apiName = item.uid;
var url = inet.url.joinpath(apiUrl,item.href);
url = inet.url.canonicalize(url)
//抓取 HTML 并解析
var htmlDoc = htmlClient.get( url,{view="netframework-"+netVersion});
//查找程序集名称
var assembly;
for ele in htmlDoc.eachQuery(tagName="dl"){
var moniker = ele["data-moniker"];
if( moniker && string.find(moniker,"netframework-"+netVersion)){
if(ele.dd[1]){
assembly = ele.dd[1].innerText()
if(..string.endWith(assembly,".dll")){
break;
}
}
}
}
if(!assembly) continue;
winform.edit.print(apiName,assembly)
if(!map[assembly]){
map[assembly] = {}
}
table.push(map[assembly],apiName);
}
import web.json;
winform.edit.text = web.json.stringify(map,true);
winform.button.disabledText = null;
},winform,winform.editNameSpace.text,winform.editNetVersion.text
)
}
winform.edit.text = /*****************
//aardio 导入 .NET 名字空间示例
import dotNet;
//导入 System,下级名字如果在同一程序集内,那么在使用时按需自动导入。
dotNet.import("System");
//如果下级名字空间不在同一程序集内,必须用哪个导入哪个,不会覆盖已存在的父名字空间。
dotNet.import("System.Security.Cryptography","mscorlib");
//不会自动导入或替换上级名字空间,例如下面的代码不能替代 dotNet.import("System");
dotNet.import("System.Security.Cryptography.X509Certificates","System");
/*
.NET 很多自带的名字空间在不同的 DLL 实现。
所以我们需要用这个工具,分析一个名字空间在哪个 DLL 里的成员最多。
就用该 DLL 导入该名字空间,可以少写 dotNet.import 语句。
*/
*****************/
winform.show();
win.loopMessage();
Markdown 格式