Delphi XE6 DLL:不需要的导出:TMethodImplementationIntercept

kar*_*son 12 delphi dll rtti delphi-xe6

在Delphi XE6中编译DLL时,它会自动TMethodImplementationIntercept从中导出函数System.Rtti.pas.我试图找到一种方法来避免这种导出,但没有找到任何可以解决问题的配置或编译器指令.

System.Rtti单元几乎无法避免,因为它几乎被delphi中的所有内容间接使用.

在XE6中构建DLL时,有没有办法避免导出此函数?

Dav*_*nan 7

System.Rtti单元中的代码如下所示:

{ This function has been added to be used from .s .c files in order to avoid use mangled names}
procedure TMethodImplementationIntercept(const obj:TMethodImplementation; AFrame: Pointer); cdecl;
begin
  obj.Intercept(AFrame);
end;
exports TMethodImplementationIntercept;
Run Code Online (Sandbox Code Playgroud)

exports在XE5中添加了此函数和指令.

在XE6中构建DLL时,有没有办法避免导出此函数?

如果您的库包含该System.Rtti单元,则DLL将导出该功能.如果要生成不导出该函数的DLL,我可以看到以下选项:

  1. 使用旧版本的Delphi.
  2. 不要包含System.Rtti在您的图书馆中.
  3. 使用System.Rtti不导出该功能的修改版本.
  4. 生成DLL后修改DLL以从PE导出表中删除该函数.

在我看来,前两个选项并不是很吸引人.第三种选择看起来很有吸引力,但我认为这可能很难成功.似乎这个长期存在的伎俩不再起作用.我还没有能够重新编译RTL单元,并避免使用不同版本的Y错误编译可怕的X.

这样就留下了最后的选择.再一次,没有大量的吸引力.你可能决定只是把它搞砸并接受这种迷失的出口.也许质量控制报告可能会给Embarcadero带来一点压力,要求重新考虑这个决定.

对于它的价值,我认为没有编译器库代码应该无条件地导出函数.它应该是图书馆的消费者,而不是作出决定的图书馆的实施者.

  • @DavidHeffernan自从XE4(我认为)以来,不可能避免使用`System.Rtti`,因为它被`System.Classes`使用. (3认同)