### TSL编译工具 #### 内容 - 功能简介 - 应用场景 - 特性 - 编译范围 - TSL指令 - 调用效率的测试 - 依赖关系 #### 功能简介 将TSL代码编译成为可执行文件和动态库文件,支持windows与linux环境。 编译成为可执行文件,即开发的程序与应用可作为一个独立运行的小程序,不需要依赖天软客户端或天软解释器。 编译动态库文件,可将天软函数包编译成动态链接库,方便其它开发工具如C++等进行调用,为第三方开发工具提供支撑,如由TSL开发的算法等,让TSL语言程序可被更广泛地应用。 #### 应用场景 ##### 内容 - 编译可执行文件 - 编译动态库 ##### 编译可执行文件 此前,天软语言只支持脚本方式运行,即在.NET平台、本地解释器或.web平台中进行执行。若只作为天软的建模语言,已经满足了一般需求,然而,随着天软语言支持功能的扩展,其应用也越来越广泛,如用来开发编译桌面应用的天软TSL语言桌面开发工具,开发好的应用是需要通过TSL.exe去执行这个桌面应用的,这种方式不利于这些应用的发布,由此,编译成为可执行文件就显的很有必要。 另外,天软还提供了信创版的客户端,该客户端也是基于TSL语言的开发程,支持编译成可执行文件后,就可以将这些已开发的应用直接编译成windows或linux的可执行程序,用起来就会非常方便。 除此之外,还有例如一些管理工具,业务的应用的小程序等,都可生成为一个独立的可执行文件。 ##### 编译动态库 可将天软TSL语言函数包创建成一个动态链接库(即DLL文件),并将该函数包进行输出。如此,在第三方工具如C++中,只需将生成的该动态库进行引入后,就可直接调用,不再需要天软TSSVRAPI等包的支持。 还可以将一些复杂的算法,通过TSL语言进行开发后编译成动态库,放入到其它语言工具中,就可以直接进行调用,不需要重复开发。 #### 特性 TSL编译工具的三特性: 其中, 独立编译:目前,除Linux中编译动态库还需依赖GCC相关功能才能完成外,其它编译工作,如windows中编译可执行文件与动态库,及Linux中编译可执行文件等,都已实现不依赖其它编译工具就可独立完成。 线程安全:输出的动态库可被多线程并发,且线程安全。 接口高效:利用TSL编译出来的动态库,接口调用所花费的时间消耗在亚微秒级别,效率非常高,大概一秒钟可以调用107次,能适用于交易级别的应用。 #### 编译范围 编译工具可将TSL语言的源代码与函数库,以及相关的资源文件,如配置类.ini文件,桌面开发工具中的窗体.dfm文件、窗口资源文件等,都可以通过天软编译工具生成一个单一的目标文件(即单一的可执行文件或.so或.dll),该文件的运行仅依赖天软运行环境的动态库,可方便程序的直接运行与业务应用的安装发布。 #### TSL指令 根据编译目标大致可分为三块指令: 可执行文件(.exe),编译命--buildexe= 可选项一: -buildgui,用来指定编译出来的目标是Windows UI应用程序,默认为控制台应用程序。 可选项二:--buildico=,用来指定Windows icon图标。 以上两个可选项只在Windows下有效,在Linux中不生效。 动态库(.dll/.so),编译命--buildlib=, 可选项一--exports=,可以指定输出的函数。 包文件,编译命令--build= 另外,还新增了对包执行等相关命令 如执行包文件,命令为:--runpkg= 加载包文件,命令为:--pkg= 等等,详情可参考TSL命令集列表。 目前提供的指令功能分布大致如下: 如,将TSLDemo01.tsl程序编译成可执行文件,操作如下: 在文件路径下进入控制台,执行以下命令: tsl --buildexe=TSLDemo01.tsl --output=test01.exe 执行完后在当前路径中会新增一个test01.exe可执行文件,如下所示: 双击test01.exe即可启动运行该程序。 ##### 内容 - TSL命令集列表 - 命令集详细解析 ##### TSL命令集列表 执行命令行的命令为:tsl xxx Windows命令集 | 命令 | 功能说明 | 备注 | | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | tsl.exe /? | 查看命令列表帮助,或TSL /? | 注意/前有一个空格 | | -COMPILE\|-COMPILEC [/S] [-S] tslfiename | 将tsl/tsf文件编译为二进制格式文件。
-COMPILE命令生成的文件后缀为.TSB
- COMPILEC命令生成的文件后缀为.TSC
可选项
/S:递归模式,即加上该可选命令后,会从子目录中查找该函数。默认只在当前目录下查找。
-S:安静模式,不打印执行结果的信息 | 默认生成的文件与原文件同目录,如:
Tsl -COMPILE TsfDemo01.tsf
作用:编译成二进制文件后,函数与脚本照样可以正常调用,可以用于隐藏源代码。 | | 编译指令 | | | | --buildexe=tslfilename | 将指定tsl文件编译成可执行(.exe)文件,默认生成文件名为default.exe,可执行文件默认图标为tsl编译器图标 | | | 其可选项 | -buildgui
指定编译的可执行文件为Windows UI应用程序 | 默认为控制台应用程序 | | | --buildico=xxx.ico
指定可执行文件的图标 | 默认为TSL.exe的图标 | | --buildlib=tsl(tsf)filename | 将指定tsl/tsf文件编译成动态库(.dll)文件 | 默认生成文件名为default.dll | | 其可选项 | `--exports=func1[:exp1][,…]`
将指定函数名输出在动态库中 | 指定多个函数用逗号分割 | | --build=tslfilename | 将指定tsl文件编译成.tsg包文件,默认生成文件名为default.tsg | 可以通过函数获取包中资源内容rs:
getglobalcache("@@tsl-resource@@",rs) | | 编译指令的可选项 | --buildexe\|--buildlib\|--build通用的可选项 | | | --output=filename | 给输出目标指定文件路径与名称 | 默认为
default.exe\|default.dll\|default.tsg
默认生成在当前路径下 | | -strong | 编译所有引用,将所有依赖的引用都进行编译
缺省为仅编译调用的 | 解决调用了某些动态库不能被检测到的函数。 | | --depends=fun1,fun2,… | 指定额外需要编译的函数列表 | 多个函数或路径用,分隔 | | --dependsdir=dir1,dir2,… | 指定额外需要编译的函数路径 | | | --excludes=fun1,fun2,… | 不编译某些函数 | | | --resourcedir=foldername | 指定编译资源文件目录 | | | --resourcepat=pat1,pat2,… | 指定资源文件的匹配串 | 需要搭配--resourcedir=一起使用 | | -resourcekeepdir | 资源名保留相对路径 | | | --extresource=filename1
[:keyname1],filename2… | 指定额外的资源 | | | 运行指令 | | | | --runpkg=packagename | 执行包文件 | 如:tsl --runpkg=runpkg.tsg | | -eval tslstring | 执行TSL脚本串 | 如:tsl -eval “inttostr(100)” | | tslfilename | 执行TSL脚本文件 | 如:tsl test.tsl | | 其可选项 | -LIBPATH | 扩展函数查找路径 | | | -TESTMULTITHREAD N | 线程调用,N为线程数 | | | -NODEBUGSERVER | 不启用调试服务器 | | | -DEBUGSERVER | 开启调试服务器 | | | -DEBUGPORT port | 指定调试监听端口 | | | -DEBUGLISTEN ip | 指定调试监听地址 | | | -DEBUGTHREADS N | 指定调试用于网络通信的线程数 | | | -WAITATTACH | 运行时等待调试程序连接 | | | -DEBUGLOGIN 1\|0 | 是否需要进行用户登陆 | | | --data-dir=datapath | 使用指定文件夹中的配置文件 | | | --pkg=pgk1,pkg2… | 加载指定包中的函数 | | 其它指令 | | | | -ENCODE configstring | 生成加密串 | 用于数据库配置串加密 | | -ENCODEDEBUGPASS | 生成密码串的加密串 | 用于远程调试配置中密码的加密 | Linux命令集 | 命令 | 说明 | 备注 | | ------------------------------------- | ---------------- | ------------------- | | TSL /? | 查看命令列表帮助 | 注意TSL后有一个空格 | | 其它命令参考Windows命令集,注意大小写 | | | ##### 命令集详细解析 提示:以下命令的操作展示都是在windows操作系统中完成的。 ###### 内容 - 查看命令帮助 - 编译成二进制文件 - 编译成可执行文件 - 编译动态库 - 编译包文件 - 编译命令的其它可选项 - 执行包文件(.tsg) - 生成加密串 - 执行TSL代码串 - 加密密码串 - 执行TSL脚本 ###### 查看命令帮助 进入cmd中,执行:tsl /? 展示所有命令及其帮助说明,显示如下: ###### 编译成二进制文件 语法:-COMPILE|-COMPILEC [/S] [-S] tslfilename 功能:将指定脚本文件编译成二进制文件。 场景一:默认方式下将tsf文件生成二进制文件 输入: tsl -COMPILE C:\DoTSL\CompileToExe\TsfDemo01.tsf 输出:在tsf文件同目录下生成.TSB文件。 新增文件如下: ####### 内容 - 可选项:/S 递归模式 - 可选项:-S 安静模式 ####### 可选项:/S 递归模式 功能:编译时,若当前目录下无目标文件,会查找子目录下的目标进行编译 如:被编译的文件TsfFuncB.tsf在C:\DoTSL\CompileToExe\AAA目录下,命令运行当前路径是在C:\DoTSL\CompileToExe\,执行以下操作进行对比: | 执行命令 | 结果说明 | | ------------------------------------------------------------ | -------------------------------------------------------------------- | | 默认情况下进行编译
命令行:tsl -COMPILE TsfFuncB.tsf | 执行结果:编译失败,找不到目标文件,原因是默认只在当前路径下查找。 | | 在递归模式下进行编译
命令行:tsl -COMPILE /S TsfFuncB.tsf | 执行结果:编译成功,递归模式下,还会在当前目录下的子目录下进行查找。 | 执行具体表现如下: ####### 可选项:-S 安静模式 功能:安静模式,不打印执行结果的信息。 如:安静模式命令:tsl -COMPILE -S TsfFuncA.tsf 默认情况下的命令:tsl -COMPILE TsfFuncA.tsf 对比结果如下,安静模式下,不打印执行是否成功的提示信息。 ###### 编译成可执行文件 命令:--buildexe=tslfilename 功能:将指定tsl脚本文件编译成可执行文件,同时会编译该函数的相关依赖。 场景:将目标文件编译成.exe可执行文件,默认文件名为default.exe 输入:tsl --buildexe=TD_TSL_ExePath.tsl 输出:在tsl文件同目录下生成.exe可执行文件。默认是一个控制台应用 运行结果和新增文件如下: 默认图标为天软客户端图标。 ####### 内容 - 可选项:-buildgui 指定为Windows UI应用程序 - 可选项:--buildico= 指定图标 ####### 可选项:-buildgui 指定为Windows UI应用程序 命令:-buildgui 功能:指定编译的可执行文件为Windows UI应用程序。 场景:将创建了界面的脚本编译成带有图形界面的.exe可执行文件,指定文件名为buildgui.exe 输入:tsl --buildexe=Test_GUIexe.tsl --output=buildgui.exe -buildgui 输出:在tsl文件同目录下生成一个带有图形界面的buildgui.exe可执行文件。 新增文件以及buildgui.exe执行结果如下: 以下是上述Test_GUIexe.tsl文件中的代码,仅供参考。执行下述案例中用到了界面tslvcl工具包。 ```tsl uses tslvcl; app := initializeapplication(); app.createform(class(tfm), fm); fm.show(); app.run(); type tfm = class(TVCForm) uses tslvcl; function Create(AOwner); begin inherited; end; end; ``` ####### 可选项:--buildico= 指定图标 命令:--buildico=iconfile 功能:指定输出文件的图标,默认为天软可执行文件的图标。 场景:将输出的可执行文件的图标指定为ts.ico图标,文件名为buildico.exe 输入:tsl --buildexe=TD_TSL_ExePath.tsl --output=buildico.exe --buildico=ts.ico 输出:在tsl文件同目录下生成一个带有自定义图标的buildico.exe可执行文件。 注:自定义图标文件只能为.ico格式图片,否则编译时打印错误信息,但不会影响编译。 如发现编译后的可执行文件图标没有更改,可能是windows存有缓存。 ###### 编译动态库 命令:--buildlib=tsl(tsf)filename 功能:将tsl/tsf文件编译成动态库, 同时会编译该函数或脚本中的相关依赖 场景:将指定的tsl文件及相关依赖编译到一个.dll动态库文件中 输入:tsl --buildlib=TD_TSL_ExePath.tsl 输出:在tsl文件同目录下生成.dll文件。tsl文件及其依赖会编译至单个文件中。 运行结果和新增文件如下: ####### 内容 - 可选项:--exports 输出指定函数名 ####### 可选项:--exports 输出指定函数名 命令:--exports=func1[:exp1],… 功能:将指定函数输出在动态库中,多个函数用逗号分割 场景:将目标文件编译成动态库文件,并在动态库的函数列表中暴露函数TD_TSL_ExePath,别名为 ExePath 输入:tsl --buildlib=TD_TSL_ExePath.tsl --exports=TD_TSL_ExePath:ExePath 输出:在tsl文件同目录下生成.dll文件。 执行上述语句打印信息如下: 可以通过visual studio自带工具可以查看.dll文件暴露出的方法,如下所示: ###### 编译包文件 命令:--build=tslfilename 功能:将tsl/tsf文件编译成.tsg包文件, 同时会编译目标函数或脚本中的相关依赖 场景:将指定的tsl文件编译成.tsg包文件 输入:tsl --build=TD_TSL_ExePath.tsl 输出:在tsl文件同目录下生成.tsg包文件。 运行结果和新增文件如下: ###### 编译命令的其它可选项 在执行--build| --buildexe| --buildlib编译命令时,可添加的可选项的使用样例。 在不添加可选项时,编译默认会包含tsl文件中调用的tsf函数文件。不加额外参数的情况下,默认编译文件名为default.xxx,且文件生成在当前路径下。 ####### 内容 - --output= 输出目标文件的名称与路径 - -strong 编译所有引用 - --depends= 指定函数列表 - --dependsdir= 函数扩展路径 - --excludes= 不编译指定函数 - --resourcedir= 资源扩展路径 - --resourcepat= 指定资源匹配串 - -resourcekeepdir 保留相对路径 - --extresource= 指定额外资源 ####### --output= 输出目标文件的名称与路径 可选命令:--output=filename 功能:给输出目标指定文件路径与名称 场景:将目标文件编译成名为test.tsg的包文件,并且指定输出目录为子目录output 输入:tsl --build=TD_TSL_ExePath.tsl --output=.\output\test.tsg 输出:在当前运行目录下的output子文件夹中生成test.tsg文件。 ####### -strong 编译所有引用 命令:-strong 功能:将所有依赖的引用都进行编译 场景:目标文件中调用了单元方法,单元中其它方法还调用了其它函数,将目标文件编译成.exe可执行文件,且将所有没有被调用到的引用也编译至生成文件中 输入:tsl--buildexe=TestDemo01.tsl -strong 输出:在tsl文件同目录下生成.exe可执行文件。 展示如下(包括不加该选项的对照): 其中,TestDemo01.tsl?的源代码如下: ```tsl uses TSLUnitDemo01; a := 10; t := FuncA(a); echo "TSLUnitDemo01.FuncA", t; sleep(10 * 1000); return t; ``` TSLUnitDemo01单元的源代码如下: ```tsl unit TSLUnitDemo01; interface function FuncA(a); function FuncB(a); implementation function FuncA(a); begin return a + 20; end; function FuncB(a); begin a := TD_Test(a); return a * a; end; Initialization FuncA(2); Finalizationend. ``` ####### --depends= 指定函数列表 命令:--depends=fun1,fun2,… 功能:指定额外的需要一起编译的函数列表,多个函数用,分隔 场景:目标函数不依赖该函数的情况下,将该函数与目标文件一起编译至动态库中 输入:tsl --buildlib=Test_depends.tsl --depends=Test01_TD 输出:在tsl文件同目录下生成.dll文件。 ####### --dependsdir= 函数扩展路径 命令:--dependsdir=dir1,dir2,… 功能:指定其它需要被编译的函数路径 场景:将指定文件夹(子目录\test)中的所有函数一起编译至动态库中 输入:tsl --buildlib=Test_dependsdir.tsl --dependsdir=test 输出:在tsl文件同目录下生成.dll文件,该dll中包含指定路径下的所有文件。 ####### --excludes= 不编译指定函数 命令:--excludes=fun1,fun2,… 功能:不编译指定函数,一般用于在依赖范围内时需要不被编译的场景 场景:将一个调用了Test01_TD函数的脚本文件编译成可执行文件,并且指定Test01_TD函数不被编译。 输入:tsl --buildexe=Test_depends.tsl --excludes=Test01_TD 输出:生成可执行文件,该文件中不包含Test01_TD函数 其生成过程的表及与运行该可执行文件的表现如下:运行会报找不到Test01_TD函数的错,说明打包中没有该模型。 注:编译过程中的打印信息是指分析到的依赖关系或资源文件,像上面Test01_TD这种被依赖但是不需要编译的文件还是会被打印在提示信息中。 ####### --resourcedir= 资源扩展路径 命令:--resourcedir=foldername 功能:指定其它需要被编译的资源路径。 场景:在编译动态库文件时,指定子目录\ resourcedir\下的文件一起编译至动态库中 输入:tsl --buildlib=Test_resourcedir.tsl --resourcedir=resource 执行上述语句,打印信息如下: 资源文件夹中文件如下: ####### --resourcepat= 指定资源匹配串 命令:--resourcepat=pat1,pat2,… 功能:将指定目录下的符合匹配串的文件编译进目标文件中,需要通过--resourcedir=进行指定目录,指定当前目录时,用--resourcedir=.\。 场景01:在编译成可执行文件时,将\ resource \目录下的所有.ini文件编译至生成文件中。 输入:tsl --buildexe=Test_resourcepat.tsl --resourcedir=resource --resourcepat="\*.ini" 输出:在同目录下生成了.exe文件,并一起编译了\ resource \目录下的ini文件 子目录\ resource \文件夹如下:可以看出上面的命令中只编译了两个ini,其它文件没有被编译。 Test_resourcepat.tsl中代码如下: ```tsl echo "\r\n"; echo "Running!!\r\n"; getglobalcache("@@tsl-resource@@", rs); // 获取可执行文件中的所有资源文件信息 echo tostn(rs); sleep(20 * 1000); return 1; ``` 执行目标文件打印如下:可以到符合条件的ini文件信息 场景02:编译可执行文件时,将当前路径及其子路径下的pat.ini文件一起编译。 输入:tsl --buildexe=Test_resourcepat.tsl --resourcedir=.\ --resourcepat="pat.ini" 输出:生成.exe文件,并编译了两个路径下的pat.ini文件 执行命令目录下的pat.ini文件展示如下: ####### -resourcekeepdir 保留相对路径 命令:-resourcekeepdir 功能:资源文件名中保留文件的相对路径 场景:编译可执行文件时,编译pat.ini文件,并保留相对路径,目标源代码中输出当前资源数据。 输入:tsl --buildexe=Test_resourcekeepdir.tsl --resourcedir=.\ --resourcepat=pat.ini -resourcekeepdir 输出:生成可执行文件。 执行可执行文件:资源文件名中加入了相对路径 下面是不加相对路径命令的生成结果:可对比查看差异 ####### --extresource= 指定额外资源 命令:--extresource=filename1[:keyname1],filename2… 功能:将指定资源加入编译,一般用于需要额外加入资源文件时使用,支持相对路径的指定 场景:在编译可执行文件时,将ts.ico图标文件一起编译 输入:tsl--buildexe=Test01_TD.tsl?--extresource=ts.ico 输出:生成.exe文件 执行编译与运行可执行文件展示:资源包中存在ts.ico文件 其中Test01_TD.tsl?的源程序如下: ```tsl echo "\r\n"; echo "Running!!\r\n"; getglobalcache("@@tsl-resource@@", rs); // 获取包中的资源文件信息 echo tostn(rs); sleep(20 * 1000); return 1; ``` ###### 执行包文件(.tsg) 命令:--runpkg=packagename 功能:执行包文件 场景:执行一个写入本地test_runpkg.txt文件中的包文件 输入:tsl --runpkg=runpkg.tsg 输出:运行.tsg包文件,在本地新增test_runpkg.txt文件,并写入内容 其中,包中目标文件的的源代码如下: ```tsl content := "test_runpkg"; writefile(rwraw(), "", "D:\\test\\tslCmdTest\\runpkg\\test_runpkg.txt", 0, 1000, content); return 1; ``` ####### 内容 - 可选项:--pkg= 加载指定资源包 ####### 可选项:--pkg= 加载指定资源包 命令:--pkg=pkg1,pkg2… 功能:执行包文件的同时,加载指定包文件。 场景:执行包文件,加载并调用指定包中的函数 输入:tsl --runpkg=main.tsg --pkg=data.tsg,SumVol.tsg 输出:运行结果如下 注: 包main.tsg对应的TSL代码如下: ```tsl echo evalData(0); function evalData(n) begin data := data(); ret := case n of 0:SumVol(data); 1:AvgVol(data); 2:SumAmount(data); 3:AvgAmount(data); end; return ret; end; ``` 包data.tsg对应的TSL代码如下: ```tsl function data() begin return array( ("StockID":"SZ000002", "收盘价":7.79, "成交量":189366181.0, "成交金额":1482908609.8), ("StockID":"SZ000002", "收盘价":7.64, "成交量":145843421.0, "成交金额":1110094218.41), ("StockID":"SZ000002", "收盘价":7.53, "成交量":136469106.0, "成交金额":1027113710.84), ("StockID":"SZ000002", "收盘价":7.77, "成交量":211713302.0, "成交金额":1624520449.34), ("StockID":"SZ000002", "收盘价":7.53, "成交量":159372804.0, "成交金额":1205270122.69), ("StockID":"SZ000002", "收盘价":7.48, "成交量":97780993.0, "成交金额":732008884.19) ); end; ``` 包SumVol.tsg对应的TSL代码如下: ```tsl function SumVol(data) begin return sum(data[:, "成交量"]); end; ``` ###### 生成加密串 命令:-ENCODE configstring 功能:生成指定字符串的加密串,可用于数据库配置串的加密处理。 场景:对数据库的连接串进行加密处理 输入:tsl -encode "Server=127.0.0.1;Database=tsBase;Uid=TinySoft;Pwd=admin;" 输出:返回加密串 ###### 执行TSL代码串 命令:-eval tslstring 功能:执行TSL语言代码串 场景:执行字符串” datetostr(20231106T)” 输入:tsl -eval "datetostr(20231106T)" 输出:返回串执行的结果 ###### 加密密码串 命令:-ENCODEDEBUGPASS password 功能:生成密码串加密后的串,用于远程调试配置中对密码信息的加密隐藏 场景:生成密码“admin”的加密串 输入:tsl -encodedebugpass admin 输出:得到加密后的密码串 ###### 执行TSL脚本 命令:tsl filename 功能:执行指定tsl程序,若不在当前路径下,需要加上路径信息。 场景:执行TSLDemo01.tsl 输入:tsl TSLDemo01.tsl ####### 内容 - 可选项:-LIBPATH 扩展函数查找路径 - 可选项:-TESTMULTITHREAD多线程执行 - 可选项:--pkg= 加载指定资源包 ####### 可选项:-LIBPATH 扩展函数查找路径 命令:-LIBPATH libpath 功能:设置函数(.tsf)的搜索路径,多个路径用分号分割,当前路径为.场景:执行TSLDemo01.tsl脚本,程序中有调用函数TsfFuncA(),且该函数不在当前目录下 输入:tsl TSLDemo01.tsl -libpath .\aaa\ 输出:如下图所示,成功调用TsfFuncA ()函数 TsfFuncA函数的路径如下: ####### 可选项:-TESTMULTITHREAD多线程执行 命令:-TESTMULTITHREAD N 功能:指定N个线程调用脚本 场景:起用5个线程调用testMultiThread.tsl,该脚本中执行打印当前线程的id号 输入:tsl testMultiThread.tsl -TestMultiThread 5 输出:如下图,打印了5个不同线程的id号,说明函数被调用了5次 其它更多请查看命令列表的介绍。 ####### 可选项:--pkg= 加载指定资源包 命令:--pkg=pkg1,pkg2… 功能:加载包文件。 场景:执行调用包中的函数的脚本 输入:tsl TestAAA.tsl--pkg=TestB.tsg 输出:运行结果如下 注:上述中给出了不加载包时执行的结果,方便功能体现。 #### 调用效率的测试 通过上述测试可以看出:调用TSL编译的动态库1千万次,只花费了1.9秒,属于亚微秒级别的调用,可用于交易级别的开发中。 #### 依赖关系 ##### 内容 - 查找执行文件的依赖关系 - SysGetFuncdepends ##### 查找执行文件的依赖关系 在实现编译成可执行文件以及动态库的过程中,有一个重要的过程,即查找执行文件的依赖关系。 因此,天软提供了SysGetFuncdepends模型,专门获取指定目标的依赖关系。 查找的依赖关系范围包括如下: ##### SysGetFuncdepends 范例 范例01:查找函数的依赖关系 ```tsl obj := Findfunction("stockzf"); v := SysGetFuncdepends(obj, 2 + 4 + 8, v1, v2); return array("依赖的函数信息":v, "二进制函数信息":v1, "二进制类信息":v2); ``` 其中,依赖的函数信息结果截图如下: 二进制函数信息截图如下: 范例02:查找类相关函数的依赖关系 ```tsl obj := Findfunction("getPYStringList"); v := SysGetFuncdepends(obj, 2 + 4 + 8, v1, v2); return array("依赖的函数信息":v, "二进制函数信息":v1, "二进制类信息":v2); ``` 其中,函数getPYStringList调用了天软内置类THashedStringList。 返回: 其中,二进制类信息展开如下: