Types de liaison forts (Delphi)

De RAD Studio
Aller à : navigation, rechercher

Remonter à Liste des directives de compilation Delphi - Index

Type

Commutateur

Syntaxe

{$STRONGLINKTYPES ON} ou {$STRONGLINKTYPES OFF}

Par défaut

{$STRONGLINKTYPES OFF}

Portée

Globale



Remarques

Cette directive affecte la façon dont la DLL ou l'EXE final est lié. Pour fonctionner de manière fiable, la directive doit se trouver dans le programme principal ou le source de la bibliothèque (.dpr). Elle affecte seulement les programmes (EXEs) et les bibliothèques (DLLs), pas les packages (BPLs).

{$STRONGLINKTYPES ON} effectue une liaison avec des fixups forts (plutôt que des fixups faibles) de tous les types de la table de types racine de l'EXE ou de la DLL. La table de types racine est l'index qui permet à l'unité RTTI de mapper des noms qualifiés sur des types. Le lieur intelligent élimine les symboles (notamment les informations RTTI associées aux types) qui ont seulement des fixups faibles les référençant. Si un ou plusieurs fixups forts référencent le symbole, ils sont alors inclus dans le binaire final, et les références faibles ne sont pas définies sur @PointerToNil.

Par exemple :

uses Rtti;
var
   c: TRttiContext;
begin
   Writeln(Length(c.GetTypes));
end.

(Sortie : 344)

Ce programme imprime le nombre de types publics disponibles, c'est-à-dire liés dans l'exécutable. Les types publics sont ceux qui ont un nom qualifié, peuvent être recherchés par leur nom avec System.Rtti.TRttiContext.FindType, et pour lesquels IsPublicType renvoie True. Le nombre des types disponibles dépend normalement de la façon dont le code fait référence à ces types, car le lieur intelligent essaie d'éliminer les informations RTTI associées aux types qui ne sont pas utilisés directement par le source du programme.

Mais le lieur ne peut pas détecter les références indirectes aux types, en utilisant par exemple System.Rtti.TRttiContext.FindType pour rechercher un type par son nom.

Dans les scénarios avancés, les types ne peuvent jamais être référencés directement, et à la place être seulement recherchés par leur nom -- comme dans la désérialisation. Dans ces situations, vous pouvez vouloir accéder à tous les types sans avoir à y faire référence manuellement dans le source, les forçant à être liés. {$STRONGLINKTYPES ON} a cet effet :

uses Rtti;
{$STRONGLINKTYPES ON}
var
   c: TRttiContext;
   t: TRttiType;
begin
   Writeln(Length(c.GetTypes));
end.

(Sortie : 2203)

Puisque cette directive fait échouer le lieur intelligent dans une large mesure, elle peut provoquer une hausse de la taille de l'exécutable, étant donné que davantage d'informations RTTI sont inclus dans l'exécutable, notamment le code des méthodes référencées par ces informations RTTI, et le code référencé par ces méthodes, et ainsi de suite.