仅对某些类启用Delphi XE RTTI

仅对某些类启用Delphi XE RTTI,delphi,rtti,Delphi,Rtti,我试图只为我的一部分类启用RTTI 原因是对于那些我想要RTTI的类,我也想要公共方法上的RTTI,但是如果在项目范围内启用了RTTI,那么来自所有类的所有公共方法都将进入最终的可执行文件。 这基本上关闭了智能链接,因为编译器认为每个公共方法都可以在运行时调用,因此最终编译几乎所有内容,并将厨房水槽放入可执行文件中 我试过几种方法: 使用{$RTTI EXPLICIT METHODS([])PROPERTIES([])FIELDS([])}在项目级别关闭RTTI,然后为相关单元重新启用它,会导

我试图只为我的一部分类启用RTTI

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

我试过几种方法:

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

还有其他想法吗?

编译器bug作为QC 98261提交给Embarcadero考虑

运行时AV与属性相关,因此解决方法是确保(手动,没有编译器错误或警告)公开类中使用的属性都具有RTTI,否则您将获得不合格的运行时AV


只要在单元的“unit”语句之前使用$RTTI指令,编译器AV就会发生,如果您将它放在AV没有发生并且它可以工作的话。

据我所知,可以接受的方法是使用一个TMyCustomClass(完全没有发布项)然后是一个TMyClass,其中只有一个已发布的部分列出了要显示的项。VCL经常这样做(TCustomForm/TForm等)。我的情况有所不同,f.I.您可以在DWScript的单元测试中看到这一点:我希望为暴露测试中使用的类公开RTTI,但不是为其他所有类公开RTTI。如果没有这样一个过滤器,基于RTTI的类的公开就成了问题,因为它变成了一个二进制选择,要么公开所有内容,要么根本不使用RTTI来避免公开所有内容……我觉得您正在尝试的操作和尝试的方法都很好。听起来像是一个编译器或“RTTI设计”错误。@Brian:您所描述的只是一种改变属性可见性的方法,以便TMyClass在对象检查器中显示其属性,而TMyCustomClass可以用来派生您自己的类,而不必承担发布属性的“负担”。(在旧的RTTI样式中,只有已发布的属性具有RTTI)。QC最终响应,添加为98261