aardio 文档

golang 库模块帮助文档

必读

调用 Go 写的 DLL 请注意:

1、 加载 Go 写的 DLL 然后迅速(几秒以内)退出,Go 程序可能会崩溃。 这不是因为你写的代码有任何问题,而是 Go 需要额外启动运行时,无法应付这种快速退出的情况。 这时在后面加一句 thread.delay(2000) 就可以解决。

实际上除了写测试代码,一般也不会打开一个程序就在几秒内退出。 所以稍加注意一下,避免这个问题并不难。

只有 Go 写的 DLL 有这个问题,其他语言写的 DLL 没这种问题。

2、在同一个进程内, Go 写的同一个 DLL 应当只加载一次。 当然在 DLL 没有卸载前,反复调用 raw.loadDll() 只是增加引用计数,不会重复加载 DLL。

如果多线程内存加载同一个 Go 写的 DLL 就会加载多个不同的副本。 这时候务必在 raw.loadDll("go.dll","共享名称") 的第 2 个参数指定共享名称,以避免重复加载。

3、要注意在 aardio 中 DLL 不应当作为线程参数传递,实际上也没必要这样做。 只要用 raw.loadDll() 加载同名 DLL (或加载相同共享名称的内存 DLL) 是不会重复加载的。

golang 成员列表

调用 Go 编译器。
调用 Go 编译后的执行程序并不需要此扩展库。

此扩展库可自动下载配置 Go 编译器

创建 Go 编译器调用程序

golang("Go项目目录","1.22.3")

创建 Go 编译器调用程序。
参数 @1 如果为 null ,则默认设为应用程序根目录 "/" 。
参数 @2 限定 Go 编译器的版本号,必须是 "数值.数值.数值" 格式。
如果 aardio 未安装指定版本 Go 编译器则先下载安装。
不使用系统安装的其他 Go 编译器

golang("Go项目目录","Go安装目录")

创建 Go 编译器调用程序,所有参数可选。
Go 项目目录默认为 aardio 应用程序根目录的 "/" 。
如果不指定 Go 安装目录,
刚搜索可能的 Go 安装目录或环境变量 GOROOT ,找不到则安装默认版本 Go 编译器。
具体规则请查看 golang 支持库源码。

golang()

返回对象:golangObject

golangObject 成员列表

golangObject.addPath()

添加路径到 PATH 环境变量

golangObject.binPath(filename)

返回 go install 安装的执行文件路径

golangObject.build()

执行 go build 命令生成 EXE 文件。
参数 @1 指定要编译的代码文件,可增加多个参数。
默认按第一个参数指定的 *.go 文件路径输出同名 *.exe 文件

golangObject.build64()

执行 go build 命令生成 64 位 EXE 文件。
注意 aardio 里调用 64 位或 32 位 EXE 没有区别,都支持。
参数@1指定要编译的代码文件,可增加多个参数。
默认按第一个参数指定的 *.go 文件路径输出同名 *.exe 文件

golangObject.buildArchive("源文件文件路径","输出文件路径")

执行 go build -buildmode=c-archive 命令生成 C 静态库

golangObject.buildShared

执行 go build 命令生成DLL动态库。
如果未找 gcc 到则自动安装 Mingw-w64

golangObject.buildShared("源文件文件路径","输出文件路径")

执行 go build 命令生成 DLL 动态库,
参数@1必须指定要编译的代码文件,可选指定输出 DLL 文件路径,
可增加多个参数

编译 DLL 需要依赖 GCC,请先调用 process.gcc.check

注意每个Go导出函数前面都要加上 //export 要导出的函数名

golangObject.buildStrip()

执行 go build 命令生成体积较小的 EXE 文件。
参数@1指定要编译的代码文件,可增加多个参数。
默认按第一个参数指定的 *.go 文件路径输出同名 *.exe 文件。
默认添加编译参数 -ldflags "-s -w" 以移除调试信息

golangObject.buildStrip64()

执行 go build 命令生成体积较小的 64 位 EXE 文件。
注意 aardio 里调用 64 位或 32 位 EXE 没有区别,都支持。
参数@1指定要编译的代码文件,可增加多个参数。
默认按第一个参数指定的 *.go 文件路径输出同名 *.exe 文件。
默认添加编译参数 -ldflags "-s -w" 以移除调试信息

golangObject.cmd()

返回对象:processPopenObject

golangObject.cmd(exe,...)

执行 go install 安装的执行文件命令。
参数 @1 指定 EXE 文件名。
后面可以指定一个或多个参数,
可指定字符串或参数表等任何 string.args.join 支持的参数。

此函数返回 process.popen 对象。

golangObject.command()

执行 go 命令。
可指定一个或多个命令行参数。
可指定字符串或参数表等任何 string.args.join 支持的参数。

golangObject.enableCgo()

启用 32 位 cgo ,依赖 gcc 。
如果未找到 32 位 gcc 到则自动安装 Mingw-w64 32 位编译环境。

golangObject.enableCgo64()

启用 64 位 cgo ,依赖 gcc 。
如果未找到 64 位 gcc 到则自动安装 Mingw-w64 64 位编译环境。

golangObject.env()

执行 go env 命令,显示环境变量

golangObject.generate()

执行 generate 命令,可添加一个或多个命令行参数。

可指定字符串或参数表等任何 string.args.join 支持的参数。

golangObject.get()

执行 go get 命令,安装远程代码包,
可在参数 @1 中使用多行字符串指定多个远程包,
需要先安装 GIT ,如果未安装就自动安装

建议先调用 setProxy 函数设置代理。
并调用 process.git 的 setHttpProxy 函数设置代理

golangObject.goPath()

返回 GOPATH 路径。

golangObject.install()

执行 go install 命令,参数中指定要编译安装的代码。

golangObject.main

golangObject.main = /**********  
package main  

import "C"    
import (  
    "aardio"  
    "fmt"  
)  

/*如果在这里指定了 Go 码,  
则调用 build 前缀的函数将自动覆盖参数 @1 指定的 *.go 文件。*/  
func init() {}  

func main() {}   
**********/

golangObject.mod("init 模块名")

执行 go mod 命令,
参数可以是一个字符串,以空格分隔多个参数。
也可传入多个参数,参数用法请参考 process 启动参数说明

golangObject.run()

执行 go run 命令,参数中指定要编译运行的代码

golangObject.runCode("代码路径","Go代码")

保存 Go 代码并运行文件

golangObject.setGoProxy("字符串参数")

设置 GOPROXY 环境变量指定的 Go 镜像服务器

golangObject.setHttpProxy("代理服务器地址",是否设为GIT代理)

设置代理服务器,
参数 @1 示例: "socks5://127.0.0.1:10801",
设为 null 清除代理

参数 @2 可省略,
设为 true 则同时设置 GIT 的 HTTP / HTTPS 代理

golangObject.updatePeTime(path,tm)

设置 PE 时间戳。
参数 @path 指定文件路径。
参数 @tm 可以是数值或 time 对象。
省略 @tm 参数则设为当前时间。

golangObject.version()

执行 go version 命令,显示版本

golangObject.yaegiExtract(...)

执行 yaegi extract 命令导出模块符号表。
参数可以是一个或多个命令行参数,
这些参数可以是 string.args.join 支持的字符串或表参数。

yaegi 用法可参考 golang.excelize 扩展库的 DLL 源码。
不要看网上过时的文章,这个命令没有重定向,也不需要指定输出文件名。
直接到应用程序根目录找默认输出的文件。

Markdown 格式