【Rust】插件机制实现
闲着无聊写的,没啥amazing的东西。刚入门时,困扰自己很长一段时间的问题就是: 如何实现一个支持插件机制的程序,尤其是编译型无语言。在知乎上搜索过,但是大家都只讲设计插件系统需要遵循的原则,却缺失了对菜鸟最重要的部分: 如何实现?后来这个问题已经不再困扰自己,但是今天比较无聊,刚考完重修考试,大概又要挂了,啥都不想干,再加上还没在Rust下面实现过,就写个简单的流水账吧。
本文基于DLL,但其实还有其他方法实现,如内嵌一个Lua解释器、使用RPC的形式交互等,各有好处,可自行选择。
TL; DR
[*]配置Cargo.toml,将设为"dylib",用于输出动态链接库(非C接口)
[*]暴露一个函数,使用#修饰,避免动态链接库中输出的函数名被修改
[*]在最终生成可执行文件的crate中使用libloading载入相关动态链接库,进而调用之
TL; DR Plus
[*]使用dynamic_reload 提供的抽象层次更高的API
正文
写到这里不想写了,继续写下去也不过是把文档抄一遍,有兴趣的看下面链接即可。
注意事项
在上面的TL; DR部分,推荐的crate-type是"dylib",即使用Rust自己的ABI,而上面分享的gitbook中推荐的是使用C ABI导出动态链接库。
目前(2018年12月)Rust并没有标准化的ABI,使用C ABI的好处是更加稳定,不同版本Rust编译器在确定平台上编译出的动态链接库一般遵循相同的ABI,但相应的,函数签名中只能出现与C兼容的类型,相对较为受限。
使用Rust自己的ABI,好处是能够支持更为丰富的Rust类型,但当编译可执行文件与动态链接库的编译器版本不同时,可能出现各种问题。 不错,我想明白脚本引擎和动态语言反射 是毕业两年后的事 之前理解这玩意还是因为看了《程序员的自我修养》,虽然没有细读,不过还是学到了很多东西。 我书读少了 原来tldr竟是文章本体 毕竟不是什么严肃论文,而且继续写下去也不过是把文档再抄一遍,没有什么继续的价值,毕竟DRY嘛2333 DC老师太强了查看动图
页:
[1]