Einzelnen Beitrag anzeigen

Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: Generische Interface-GUIDs

  Alt 14. Sep 2022, 14:06
Entweder reden wir total aneinander vorbei oder ...
Wenn Du ein Modul in Delphi hast und dort eben TList<TBla> und ein anderes Modul in C# - wie übergibst Du dann sowas? Ich kenne Übergaben nur mit OLE wobei die Typen für die Schnittstelle in einer IDL definiert werden. Ich wüsste nicht ob und wie da Generics überhaupt gehen.
Ich habe eine allgemeine Schnittstelle geschrieben, mit der man Interfaces (inkl. generische Interfaces) direkt zwischen verschiedenen Modulen, konkret zwischen Delphi-Anwendungen, Delphi-DLLs und C#-Assemblys, austauschen kann. Man kann also einfach eine C#-Assembly laden, wobei durch die integrierten Klassen automatisch eine Verbindung etabliert wird. Danach kann man dann einfach über generische Methoden Interfaces anfragen, die in anderen Modulen registriert wurden.

Auf diese Weise kann ich mir einfach z.B. aus einer geladenen C#-DLL ein Interface IExample holen und die Methode Run aufrufen.
Delphi:
Delphi-Quellcode:
if TBlub.TryGet<IExample>(Example) then
  Example.Run(42);
C#:
Code:
if (Blub.TryGet<IExample>(ref Example))
{
  Example.Run(42);
}
Anders als mit anderen Lösungen brauche ich dafür keine Registrierung der Assembly oder ähnliche Voraussetzungen. Es funktioniert komplett portabel, sofern die verwendete .NET Version installiert ist. Man muss bei den Interfaces ein paar Regeln, z.B. für Strings (die Marshalling-Attribute brauchen), beachten, aber ansonsten ist das recht intuitiv nutzbar.

Auf Delphi-Seite klappt das auch mit generischen IList<T> Interfaces problemlos. Auf C#-Seite muss ich dafür wie schon geschrieben eine nicht-generische Klasse ableiten, aber auch da ist es mit wenigen Zeilen erledigt, die ich zudem nur kopieren und mit dem konkreten Typ versehen muss.

Aber ich glaube das führt hier zu weit...

Das Interface ist nur ein Zeiger.
Zum Prüfen und Konvertieren mit einer GUID ... will man nichts prüfen und auch nicht in ein anderes Interface casten, dann ist die GUID egal.
Ja, es wäre schön, wenn das auch bei C# ginge...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat