Tob*_*P64 5 shared-libraries rust rust-crates
我有一个插件系统,我在其中传递&dyn Any给动态加载的 Rust 函数,但向下转换引用失败,因为TypeIds 不同(对于同一类型),尽管我添加rustflags = ["-Cmetadata=12345678"]到了两个板条箱的货物配置中。而且,似乎只有外部板条箱中的类型受到影响(我尝试过(),它在两个板条箱中产生了相同的结果TypeId)。我目前正在转换原始指针 ( unsafe { &*(v as *const dyn Any as *const Type) }) 来解决此问题,但我更喜欢没有不安全代码的解决方案。
例如下面的代码:
println!("CRATE 1: TypeId of `()`: `{:?}`, TypeId of `toml::Value`: `{:?}`",
TypeId::of::<()>(), TypeId::of::<toml::Value>());
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
CRATE 1: TypeId of `()`: `TypeId { t: 7549865886324542212 }`, TypeId of `toml::Value`: `TypeId { t: 9270396907601429078 }`
CRATE 2: TypeId of `()`: `TypeId { t: 7549865886324542212 }`, TypeId of `toml::Value`: `TypeId { t: 5704635987193303200 }`
Run Code Online (Sandbox Code Playgroud)
编辑:这似乎不是不同依赖版本的问题,因为板条箱 2(动态加载)依赖于板条箱 3(也是动态加载),并且问题仍然发生,尽管板条箱 2 和板条箱 3,是本地依赖项(因此只有一个版本)。顺便说一句,板条箱 1 是。装载 crate 2 和 3 的 crate。
编辑:我-Cmetadata从所有 3 个箱子中删除了该选项,现在我得到了相同的TypeIdfor toml::Value,但是TypeId我想在箱子 2 中向下转换的箱子 1 中的类型仍然不同。
经过一些测试后,我发现TypeIds 是不同的,因为加载器板条箱(板条箱 1)在其他 2 个板条箱中用作库,但作为二进制文件执行。
为了解决这个问题,我将我想要在加载的板条箱中使用的所有板条箱 1 的类型提取到一个新的板条箱中,并将其添加到每个板条箱的依赖项中。这个新的板条箱仅用作库而不是二进制文件,因此TypeIds 应该保持一致。
为了让它正常工作我必须做的一切的总结:
-Cmetadata,这不再有效,而且实际上会产生相反的效果TypeId是最新的如果仍然有问题,您可以退回到不安全的 rust(例如unsafe { &*(value as *const dyn Any as *const Type)})。请注意,根本没有检查,因此如果类型不匹配,您可能会遇到分段错误。
特别感谢@trentcl 为我指明了正确的方向。
| 归档时间: |
|
| 查看次数: |
497 次 |
| 最近记录: |