|
Probleme mit Konstanten in einer Library
Frage: Ich habe mit Delphi 8 eine Library erstellt, die eine Unit mit Konstantendeklarationen enthält. Das kann man auch alles wunderbar kompilieren und in den Metadaten steht auch das Richtige drin. Wenn ich nun diese erste Library in einer zweiten Library einbinden und die Konstanten dort nutzen will, erzählt mir Delphi etwas von einem "undeclared identifier". Ich hab schon alles mögliche probiert, allerdings wird das einfach nichts. Hat dazu jemand eine Idee?
Antwort: Die Typprüfung der CLR (Command Language Runtime) von .NET ist viel strenger als das bisher bei Delphi der Fall war. Da einige "lässige" Delphi-Regeln nicht mehr zulässig sind, muss der Delphi-Kompiler an einigen Stellen eine Umverpackung vornehmen. Dies äußert sich darin, dass "merkwürdige" Klassen mit den Bezeichnungen "Unit" auftauchen, die man selbst gar nicht deklariert hat. Die am Ende angehängte Abbildung verdeutlich dies.
Das folgende Beispiel demonstriert, wie von einer Library-Assembly heraus auf die Konstanten einer anderen Assembly zugegriffen wird. Dabei bindet eine Windows Forms-Anwendung die zweite Assembly ein, um das Endergebnis testen zu können. Alle drei Module binden die RTL von Delphi 8 über den Verweis auf die Borland-Assembly Borland.Delphi.dll ein, damit es nicht zu Typkollisionen kommt.
a) Library 1 deklariert die Konstante
library Library1;
{%DelphiDotNetAssemblyCompiler 'c:\programme\gemeinsame dateien\borland shared\bds\shared assemblies\2.0\Borland.Delphi.dll'}
uses
System.Reflection;
[assembly: AssemblyVersion('1.0.0.0')]
const
cDATA : String = 'Testdaten';
begin
end.
b) Library 2 greift auf die Konstante aus der Library 1 zu
library Library2;
{%DelphiDotNetAssemblyCompiler 'c:\programme\gemeinsame dateien\borland shared\bds\shared assemblies\2.0\Borland.Delphi.dll'}
{%DelphiDotNetAssemblyCompiler '..\library1\Library1.dll'}
uses
System.Reflection, Library1;
[assembly: AssemblyVersion('1.0.0.0')]
function GetData: String;
begin
Result := Library1.Unit.cDATA;
end;
begin
end.
c) Die Anwendung greift auf Library 2 zu, um über die Funktion die Konstante aus der Library 1 auszulesen (beide Assembly-DLLs müssen im gleichen Verzeichnis wie die EXE der Windows Forms-Anwendung abgelegt werden)
procedure TWinForm2.Button1_Click(sender: System.Object; e: System.EventArgs);
begin
MessageBox.Show(Library2.Unit.GetData);
end;
|