Skip to content

zh_CN_秋之盒开放框架API

Shunhong Zhang edited this page Apr 25, 2018 · 14 revisions

本文档依照SDKV7版本进行编写

目录

3.1 选择窗口
3.2 消息窗口
3.3 加载窗口
3.4 在界面线程运行代码
3.5 获取秋之盒主界面窗口
3.6 获取秋之盒公共资源
3.7 获取主界面语言代码
3.8 显示调试窗口
3.9 重启秋之盒
3.10 关闭APP
3.11 刷新拓展模块列表
3.12 判断当前程序是否以管理员模式运行

5.1 获取Context所属的临时目录
5.2 清理临时目录

6.0 将资源内嵌在DLL中
6.1 实例化
6.2 提取文件到临时目录
6.3 提取文件到指定目录

9.1 安装驱动
9.2 判断当前是否是WIN10系统

1、主要命名空间说明

A.O指代AutumnBox.OpenFramework

命名空间 简要说明 代表
A.O 存放开放框架共用的东西 Context抽象类,BuildInfo静态信息类
A.O.Extension 秋之盒标准拓展相关的接口和抽象类 AutumnBoxExtension
A.O.Internal 整个A.O的管理层,普通模块无法对其进行操作 FrameworkManager
A.O.Open 提供给拓展的所有API都在此处 OpenApi.Log,OpenApi.Gui
A.O.Script 秋之盒脚本拓展相关的借口和管理类 ABEScript

2、Context上下文

开放框架的所有API都需要传入Context作为首个参数,这个参数的主要作用在于验证API调用者身份 不过,所有秋之盒标准拓展都继承自Context抽象类,也就是说,你可以传this进去
示例:

//获取秋之盒主窗口,调用者是本模块
OpenApi.Gui.GetMainWindow(this);

3、界面接口

其实我更建议去阅读IGuiApi接口定义 以下所有静态函数均位于A.O.Open.OpenApi.Gui下 以下用O.G代称OpenApi.Gui

3.1 选择窗口

显示一个选择窗口 调用此API将堵塞至用户做出选择

var result = O.G.ShowChoiceBox(this,"标题","内容","左按钮文本(可选,默认取消)","右按钮文本(可选,默认确定)");

3.2 消息窗口

这个很好理解吧? 调用此API将堵塞至用户关闭消息窗口

O.G.ShowMessageBox(this,"标题","内容");

3.3 加载窗口

住:此处的ICompletable参数请自行阅读AutumnBox.Basic.FlowFramework源代码

O.G.ShowLoadingBox(this,可完成的对象);

3.4 在界面线程运行代码

拓展模块运行在非界面线程中,也就是说,在进行与界面相关操作时,会因线程不安全抛出异常,因此可以使用此API来实现在UI线程运行代码

O.G.RunOnUIThread(this,()=>{
    new Window().Show();
});

另外,你也可以使用标准拓展模块的保护方法,这样就无需传入Context
(其内部仍然是调用上面的API,只不过会自动传入this作为Context)

RunOnUIThread(()=>{
    new Window().Show();
});

3.5 获取秋之盒主界面窗口

var window = O.G.GetMainWindow(this);

3.6 获取秋之盒公共资源

此处获取的"公共资源"也就是秋之盒的资源词典中的资源
语言资源键值可查看中文语言资源

var appName = (string)O.G.GetPublicResouce(this,"AppName");
//appName: 秋之盒

如果你不想进行丑陋的显示转换,也可以使用同名的泛型方法

var appName = O.G.GetPublicResource<string>(this,"AppName");

3.7 获取主界面语言代码

var strCode = O.G.CurrentLanguageCode;
//中文环境下,strCode为zh-CN
//其它环境可自行搜索语言地区代码

3.8 显示调试窗口

O.G.ShowDebugWindow(this);

3.9 重启秋之盒

调用此函数,将会询问用户是否同意,如果用户不同意,则抛出UserDeniedException

O.G.RestartApp(this);

另外,你还可以尝试以管理员模式重启秋之盒

O.G.RestartAppAsAdmin(this);

3.10 关闭APP

同样的,会询问用户,用户不同意就抛出异常

O.G.ShutdownApp(this);

3.11 刷新拓展模块列表

此API效果不用我说了

O.G.RefreshExtensionList(this);

3.12 判断当前程序是否以管理员模式运行

var bl = O.G.IsRunAsAdmin(this);
//bl 如果为true,则说明当前程序正在以管理员模式运行

4、调试API

更多调试接口请看ILogApi接口定义

OpenApi.Log.Info(this,"message");

5、临时文件

源代码 在某些情况下,可能需要将文件先存放在硬盘上然后再进行操作
为了防止开发者将临时文件乱放导致文件目录混乱,因此我提供了统一的临时目录API
AutumnBox.OpenFramework.Open.Space静态类中提供了一些静态方法

5.1 获取Context所属的临时目录

为Context分配一个临时目录,并返回其完整路径

string GetTmpDir(this);

5.1 清理临时目录

void ClearTmpDir(this);
  • 注意:秋之盒不会主动清理临时目录,请开发者自行根据需求控制

6、内嵌资源提取器

当你的拓展需要将文件放在硬盘上时,你有两个解决方案:

  • 从网络下载到指定位置
  • 将资源预先嵌入到DLL中,需要使用时就释放出来

AutumnBox.OpenFramework.Open.Extractor正是为第二个方案所生 Extractor源代码

6.0 将资源内嵌在DLL中

很简单,你他喵直接把文件扔到项目里,然后再属性中将其改为嵌入的资源即可

6.1 实例化

此API是一个对象,因此你需要进行实例化

//此处传入的Context ctx一定要是嵌入资源所在的程序集的对象
var extractor = new Extracor(ctx);

6.2 提取文件到临时目录

第一个参数为内嵌资源的位置,下面的例子里,我在项目的Files文件夹下放了x.txt文件
打算提取到临时目录的FilesLocal/x.txt位置

//内嵌资源的位置不是用斜杠分隔的,而是想代码那样用.进行分隔,同时.仍然有作为拓展名分隔的功能
extractor.ExtractToTmp("Files.x.txt","FilesLocal\w.txt");
//上一条代码执行完成后,在context所属的临时目录下会有FilesLocal文件夹,里面有w.txt

6.3 提取文件到指定目录

与上个方法用法相同,只不过路径将由你自由指定

extractor.Extract("Files.x.txt","D:\FilesLocal\w.txt");

7、拓展模块管理器

请自行阅读源代码注释,我觉得这里的API很简单易懂(懒得写文档了) ExtsManager源代码
在此静态类中,你可以简单的进行一些拓展模块/脚本的操作

8、兼容性处理

某一天,小红基于SDKV5开发了一个拓展模块.为了便捷,其中用到了SDKV5才有的新API,小红编译并发布了这个拓展模块 后来,小明使用着基于SDKV4版本的秋之盒下载了这个模块,他点击了运行,哦,不!这个模块报错了!日志显示模块抛出了MissingMethodException 毕竟SDKV4中并没有SDKV5的特性...
怎么办呢? 在安卓中,我们可以通过以下方式解决

//如果当前运行时SDK版本为安卓4.4及以上   
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//Do something
}  

但经过我的测试,C#中似乎无法使用这样的代码
假设Fuck.Test()是SDKV5中加入的函数,开发者使用,编译并进行了发布

public void Fuck(){
   Console.WriteLine("Fuck");
   if(BuildInfo.SDK_VERSION >5)
    {
        Fuck.Test();
    }
}

但如果用户的秋之盒版本仅支持SDKV4,那么整个函数都无法运行
因为.NET似乎会在执行前检测方法的字节码内是否有不存在的函数,如果有则抛出MissingMethodException,而不会像安卓中那样,如果不执行该行代码就不会抛出异常
所以当上述代码被调用时,会直接抛出异常,也就是说,连Console.WriteLine("Fuck");也不会被执行,这将导致严重的兼容性问题 为此,我加入了新的API(此API仅在SDKV6有)

public override void OnStartCommand(StartArgs args){
    Log("Ok");
    if(Comp.SdkVersion >= 5)
    {
       Comp.RunMaybeMissingMethod(()=>
       {
           Test.Fuck();
       })
    }
    Log("Fuck");
}

当以上代码在SDKV5及以上版本中执行时,将会调用Test.Fuck()
在SDKV5以下版本时也不会抛出异常,但不可能调用Test.Fuck()

9、封装的OS API

OS API源代码

9.1 安装驱动

在部分操作系统中,此API需要管理员权限,你可以活学活用之前的以管理员模式重启程序的API

if(OpenApi.Gui.IsRunAsAdmin == false){
   OpenApi.Gui.RestartAppAsAdmin(this);
}
OS.InstallDriver(this,"驱动inf路径");

9.2 判断是否是WIN10系统

bool isWin10 = OS.IsWindows10;
Clone this wiki locally