开发者

Enable Delphi XE RTTI only for some classes

I'm trying to have RTTI enabled only for a subset of my classes.

The reason is that for those classes for which I want RTTI, I want RTTI on public methods too, but if that is enabled project-wide, then all public methods from all classes get into the final executable. This basically turns off the smart-linking, as the compiler considers that every public method could be called at runtime, and thus ends up compiling pretty much everything and the kitchen sink into the executable...

I've tried several things:

  • Turning off RTTI at the project level w开发者_运维知识库ith {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} and then re-enabling it for the relevant units results in crashes at compile time (an AV somewhere in the compiler) on the $RTTI directive.
  • Turning off RTTI at the project level and then enabling it class-by-class compiles, but at runtime it results in an unqualified AV deep in "Rtti.pas" when attempting to access the RTII for the exposed classes
  • Controling RTTI via $RTTI directives embedded in the ".inc" all units use results in random AV at compile time (always at the line of the $RTTI directive, but not always for the same unit).

Any other ideas?


Compiler bug submitted as QC 98261 for Embarcadero consideration.

The runtime AV was related to attributes, so a workaround is to make sure (manually, there are no compiler errors or warnings) that the attributes used in the exposed classes all have RTTI for them, otherwise you get the unqualified runtime AV.

The compiler AV happens whenever the $RTTI directive is used before the "unit" statement of a unit, if you place it after the AV doesn't happen and it works.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜