【问题标题】:Delphi Compiler optimization removes class from binary file [duplicate]Delphi编译器优化从二进制文件中删除类[重复]
【发布时间】:2021-03-03 20:52:05
【问题描述】:

我已经能够解耦我的代码,以便编译器认为应用程序中没有使用类,即使它们是。 我有一个根据属性注册类的机制。

目前我已经通过使用类定义引用单元中的类来解决这个问题,如下所示:

interface
uses
  uISomeService;

type
  [ServiceName('FooBar')]
  [LicenseKey('LIC42')]
  TSomeService1 = class(TInterfacedObject, ISomeService)
  ...
  end;

  ...
  ...
implementation

 ...
procedure Donothing(AClass: Tclass);
  begin
    // Do nothing
  end;

initialization
 Donothing(TSomeService1);

有没有办法告诉编译器“在二进制文件中包含这个类,即使你认为它没有被使用”类似于{$NoClassOpti + }?我不喜欢在初始化中使用过程调用。

【问题讨论】:

  • this。只有一个global setting,不是每个班级。
  • 谢谢@Olivier,这实际上是我的问题,几乎完全一样。嗯,我确实喜欢 {$STRONGLINKTYPES ON} 指令,但我不喜欢将它添加到 .dpr 中的想法。无论如何,感谢您的链接,非常感谢。
  • 我总是通过在其实现部分中有一个带有单个空函数 procedure IncludeClasses(const Classes: array of TMyBaseClass);(或特定于应用程序的命名约定)的单元和一个 IncludeClasses([TMyClass1, TMyClass2, ...]) 来解决这个问题,每个单元的格式很好行,在initialization 部分。当然,实现部分的uses 子句将包含相关单元。我更喜欢这种方法,因为它感觉语义化; “什么都不做”虽然在技术上是正确的,但感觉不对。
  • @Olivier,似乎无法将您的评论标记为解决方案。也许如果你把它作为一个答案?

标签: delphi compiler-optimization rtti


【解决方案1】:

您已经为您的问题找到了两个合适的解决方案。

还有第三种:在 TSomeService1 中添加一个什么都不做的公共类方法,并从初始化部分调用该类方法。给它起一个名字,解释为什么存在这种方法。

这与您的 DoNothing 过程几乎相同,只要编译器/链接器不够聪明,无法消除对空过程/方法的调用,两者都可以工作。

【讨论】:

  • 是的,这是相同方法的另一个版本。甚至可能会好一点。我不会说这些解决方案是“合适的”,更像是“可用的”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-16
  • 1970-01-01
  • 2013-01-29
  • 2011-02-21
  • 1970-01-01
  • 2017-12-22
相关资源
最近更新 更多