找回密码
 立即注册
查看: 344|回复: 6

【Rust】插件机制实现

[复制链接]
发表于 2023-2-15 10:37 | 显示全部楼层 |阅读模式
闲着无聊写的,没啥amazing的东西。
刚入门时,困扰自己很长一段时间的问题就是: 如何实现一个支持插件机制的程序,尤其是编译型无语言。在知乎上搜索过,但是大家都只讲设计插件系统需要遵循的原则,却缺失了对菜鸟最重要的部分: 如何实现?
后来这个问题已经不再困扰自己,但是今天比较无聊,刚考完重修考试,大概又要挂了,啥都不想干,再加上还没在Rust下面实现过,就写个简单的流水账吧。
本文基于DLL,但其实还有其他方法实现,如内嵌一个Lua解释器、使用RPC的形式交互等,各有好处,可自行选择。

TL; DR


  • 配置Cargo.toml,将[lib.crate-type]设为"dylib",用于输出动态链接库(非C接口)
  • 暴露一个函数,使用#[no_mangle]修饰,避免动态链接库中输出的函数名被修改
  • 在最终生成可执行文件的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类型,但当编译可执行文件与动态链接库的编译器版本不同时,可能出现各种问题。
发表于 2023-2-15 10:38 | 显示全部楼层
不错,我想明白脚本引擎和动态语言反射 是毕业两年后的事
发表于 2023-2-15 10:48 | 显示全部楼层
之前理解这玩意还是因为看了《程序员的自我修养》,虽然没有细读,不过还是学到了很多东西。
发表于 2023-2-15 10:58 | 显示全部楼层
我书读少了
发表于 2023-2-15 11:05 | 显示全部楼层
原来tldr竟是文章本体
发表于 2023-2-15 11:11 | 显示全部楼层
毕竟不是什么严肃论文,而且继续写下去也不过是把文档再抄一遍,没有什么继续的价值,毕竟DRY嘛2333
发表于 2023-2-15 11:16 | 显示全部楼层
DC老师太强了  查看动图
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-2 13:48 , Processed in 0.094587 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表