只为某些类启用 Delphi XE RTTI

9

我想只为我的一部分类启用RTTI。

原因是,对于那些我想要RTTI的类,我也想在公共方法中使用RTTI,但如果在整个项目范围内启用它,那么所有类的所有公共方法都会进入最终的可执行文件。这基本上关闭了智能链接,因为编译器认为每个公共方法都可能在运行时被调用,因此最终会将几乎所有内容编译到可执行文件中...

我尝试过以下几种方法:

  • 使用{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}在项目级别上关闭RTTI,然后重新为相关单元启用它,结果导致编译时崩溃(编译器某处发生AV)。
  • 在项目级别上关闭RTTI,然后逐个启用它,可以编译通过,但在运行时,当尝试访问公开类的RTII时,会导致“Rtti.pas”中深度不明确的AV错误。
  • 通过嵌入在所有单元使用的“.inc”中的$RTTI指令来控制RTTI会导致随机的编译时AV错误(始终在$RTTI指令的行处,但不总是针对相同的单元)。

还有其他想法吗?


1
据我所知,实现这个的一种可接受方法是拥有一个 TMyCustomClass(没有任何公开的项目),然后再创建一个 TMyClass,仅包含列出要显示的项目的已发布部分。VCL 中经常使用此方法(TCustomForm/TForm 等)。 - Brian Frost
2
我处于一个有些不同的情况下,例如您可以在DWScript的单元测试中看到它正在发生:我希望将RTTI公开为用于公开测试的类,但不是所有其他类。如果没有这样的过滤器,基于RTTI的类公开就会变得棘手,因为它成为公开所有内容或根本不使用RTTI以避免公开所有内容之间的二元选择... - Eric Grange
4
你正在尝试做的事情和你所尝试的方法对我来说看起来很不错。听起来像是编译器或“RTTI设计”中的一个错误。 - Marjan Venema
你是否也在尝试禁用整个RTL上的RTTI?我的初步实验表明,仅在项目级别禁用只会禁用项目单元上的RTTI,除非你修改RTL源代码,否则在.dpr级别的任何更改都不会影响系统RTL单元。 - Warren P
1
QC终于响应了,添加为98261。 - Eric Grange
显示剩余3条评论
1个回答

1

编译器错误已提交为QC 98261,供Embarcadero考虑。

运行时AV与属性有关,因此解决方法是确保(手动进行,没有编译器错误或警告)在公开类中使用的属性都有RTTI,否则会出现未经限定的运行时AV。

如果在单元的“unit”语句之前使用$RTTI指令,则会发生编译器AV,如果将其放在之后,则不会发生AV并且可以正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接