我使用工具MapFileStats检查来自delphi的生成的地图文件。我发现匿名方法会生成某种元数据,这些元数据似乎与RTTI无关。它是什么类型的元数据?删除它会很好,因为在我们的生产环境中它总计很大。
示例代码:
program RttiDemo;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
{$WEAKLINKRTTI OFF}
var
AProc: TProc;
begin
try
AProc := procedure()
begin
// ...
end;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;
end.
MapFileStats的屏幕截图:
另一个例子:
program RttiDemo;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils;
{$RTTI EXPLICIT METHODS([]) FIELDS([]) PROPERTIES([])}
{$WEAKLINKRTTI OFF}
type
TDemo = class
procedure Demo();
end;
procedure TDemo.Demo;
var
AProc: TProc;
begin
AProc := procedure()
var
i: Integer;
begin
i := 5;
WriteLn(i);
end;
AProc();
end;
var
Demo: TDemo;
begin
Demo := TDemo.Create();
try
Demo.Demo;
finally
FreeAndNil(Demo);
end;
end.
截图:
答案 0 :(得分:2)
匿名函数由一个类支持,该类实现匿名函数工作所需的接口。此处报告的元数据表示该类所需的信息。我不相信你可以从你的可执行文件中删除它。
以下将发出实现匿名方法的对象的类的名称:
Writeln((IInterface(Pointer(@AProc)^) as TObject).ClassName);
当添加到第二个程序时,输出为:
TDemo.Demo$0$ActRec
这与您在问题中突出显示的名称相同。