Kann ich eine Konstante in der RTL-Klasse System.Classes.TStream ändern und zur Laufzeit in Delphi XE6 neu erstellen?

Ich versuche, eine bekannte hässliche Leistungsbeschränkung in System.Classes.pas zu umgehen, die ein konstantes Pufferlimit der 80er Jahre ($ F000) aufweist, das wie folgt aussieht:

function TStream.CopyFrom(const Source: TStream; Count: Int64): Int64;
const
  MaxBufSize = $F000;
....

Dies führt zu erheblichen Leistungseinbußen in unserer Delphi-Anwendung. In Delphi XE2 bis XE5 konnten wir dies ändern und einen der folgenden Ansätze verwenden:

Ich könnte die Delphi-Quellen ändern und dann durch Aufrufen von dcc32.exe aus einer Batch-Datei die Datei System.Classes.dcu im Delphi-Bibliotheksordner neu erstellen. Mir ist klar, dass dies hässlich ist und ich es nicht gern getan habe, aber ich mag dieses hässliche Leistungsproblem in der RTL auch nicht, und unsere Benutzer können mit den Leistungsproblemen, die es verursacht, nicht leben.

Ich könnte versuchen, eine geänderte Datei system.classes.pas irgendwo in meinen Projekt-Suchpfad aufzunehmen.

Keiner der oben genannten Ansätze funktioniert jetzt in Delphi XE6, wahrscheinlich dank einiger interner Compiler-Änderungen. Der Fehler, den ich in einer minimalen Befehlszeilenanwendung erhalte, in deren uses-Klausel System.Contnrs enthalten ist, ist folgender:

[dcc32 Fatal Error] System.Classes.pas(19600): F2051 Unit System.Contnrs was compiled with a different version of System.Classes.TComponent

Das Beispielprogramm zum Reproduzieren dieses Problems (vorausgesetzt, Sie haben System.Classes.pas geändert und die MaxBufSize-Konstante geändert) wird hier gezeigt:

program consoletestproject;

{$APPTYPE CONSOLE}

{$R *.res}

uses
   System.Contnrs,
   System.SysUtils;

var
  List:System.Contnrs.TObjectList;
begin
   WriteLn('Hello world');
end.

Auch dieses Problem lässt sich in Delphi XE6 problemlos reproduzieren, ist jedoch in XE5 oder früheren Versionen kein Problem.

Was ist die empfohlene Vorgehensweise, wenn Sie eine grundlegende RTL- oder VCL-Einschränkung unbedingt umgehen MÜSSEN, indem Sie eine geänderte Kopie von System.Classes.pas oder System.SysUtils.pas oder eine andere sehr niedrige Einheit verwenden? (Ja, ich weiß, dass Sie das NICHT tun sollten, wenn Sie es nicht müssen. Machen Sie sich keine Mühe mit einem Vortrag.)

Gibt es einen magischen Satz von Befehlszeilenparametern, die Sie über "dcc32.exe" in der Befehlszeile verwenden können, um eine modifizierte DCU zu erstellen, die ordnungsgemäß mit dem obigen Anwendungsbeispiel verknüpft wird?

Als sekundäre Frage gibt es .dcu-Dateien, für die es keine Quelle gibt, die kaputt geht, wenn man dies versucht. In diesem Fall lautet die Antwort auf alle oben genannten Fragen: "Sie können das nicht beheben, und wenn es einen Fehler gibt in der RTL hast du Pech "?

Eine mögliche Problemumgehung besteht darin, "$ (BDS) \ source \ rtl \ common" in Ihren Projektsuchpfad (oder Bibliothekspfad) aufzunehmen, wodurch jede fehlerhafte (neu zu kompilierende) DCU gezwungen wird, JEDE Zeit neu zu erstellen. Dies scheint jedoch hässlich und falsch.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage