Включить Delphi XE RTTI только для некоторых классов - PullRequest
9 голосов
/ 26 августа 2011

Я пытаюсь включить RTTI только для подмножества моих классов.

Причина в том, что для тех классов, для которых я хочу RTTI, я хочу, чтобы RTTI также использовался для открытых методов, но если он включен для всего проекта, то все открытые методы из всех классов попадают в конечный исполняемый файл. Это в основном отключает умное связывание, так как компилятор считает, что каждый публичный метод может быть вызван во время выполнения, и, таким образом, в итоге компилирует практически все и кухонный приемник в исполняемый файл ...

Я пробовал несколько вещей:

  • Отключение RTTI на уровне проекта с помощью {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])} и последующее повторное включение его для соответствующих модулей приводит к сбоям во время компиляции (AV где-то в компиляторе) в директиве $ RTTI.
  • Отключение RTTI на уровне проекта и последующее включение его компиляции по классам, но во время выполнения это приводит к неквалифицированному AV глубоко в «Rtti.pas» при попытке доступа к RTII для открытых классов
  • Управление RTTI с помощью директив $ RTTI, встроенных в «.inc», во всех блоках используются результаты случайного AV во время компиляции (всегда в строке директивы $ RTTI, но не всегда для одного и того же блока).

Есть еще идеи?

1 Ответ

1 голос
/ 30 августа 2011

Ошибка компилятора, представленная как QC 98261 для рассмотрения Embarcadero.

AV времени выполнения был связан с атрибутами, поэтому обходной путь должен убедиться (вручную, что нет ошибок или предупреждений компилятора), что атрибуты, используемые в представленных классах, имеют RTTI для них, в противном случае вы получите неквалифицированный AV времени выполнения .

Компилятор AV происходит всякий раз, когда директива $ RTTI используется до оператора "unit" модуля, если вы поместите его после того, как AV не произойдет, и оно заработает.

...