Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Funktionen aus .NET4-DLL in Delphi 5 aufrufen (https://www.delphipraxis.net/162858-funktionen-aus-net4-dll-delphi-5-aufrufen.html)

storfi 7. Sep 2011 18:32

Funktionen aus .NET4-DLL in Delphi 5 aufrufen
 
Hallo zusammen,

ich habe ein großes Projekt in Delphi 5 und muss über eine .NET-Klasse auf eine andere Anwendung zugreifen. Da ich das Projekt unmöglich auf eine höhere Delphi-Version hochziehen kann, war meine Idee, mit Visual Studio eine Klassenbibliothek auf .NET4 zu erstellen und die Funktionen in Delphi aus der DLL zu starten.

Für einen ersten Test habe ich eine neue Klassenbibliothek mit C# erstellt und den Aufruf einer einfachen Prozedur in Visual Studio erfolgreich getestet.
Dann habe ich den Aufruf der DLL in Delphi 5 so versucht:

Delphi-Quellcode:
procedure ...
var t_dllhandle: THandle;
    t_dllfunction: TFarProc;
    t_procedure: TdoHelloMsg;
begin
...
    t_dllhandle:=LoadLibrary(PChar(g_testdll));
    t_dllfunction:=GetProcAddress(t_dllhandle, 'doHelloMsg');
...
Das Handle bekomme ich noch ordnungsgemäß, aber dann ist t_dllfunction nach dem GetProcAddress() immer "nil".

Nun meine Frage:
Kann ich eine .NET-DLL überhaupt einfach so in Delphi 5 ansprechen?
Hat jemand evtl. eine andere Idee, ein Stück .NET4 in Delphi 5 ohne dieses COM-Interop zu starten?
Ich muss hier keine Daten austauschen, es geht nur um den Prozeduraufruf, um irgendwelche Aktionen in der .NET-Klasse auszulösen.

Vielen Dank,
Christian

Phoenix 7. Sep 2011 19:13

AW: Funktionen aus .NET4-DLL in Delphi 5 aufrufen
 
Du hast mehrere Möglichkeiten, die aber immer auf eines dieser beiden herauslaufen: COM oder Reverse P/Invoke.

COM ist definitiv zu bevorzugen, da es die Sache ungeheuer einfach macht.

Reverse P/Invoke ist nicht wirklich schön. Die nötigen Informationen sollten hier drin stehen - die müsstest Du dann aber ggf. noch von .NET 2.0 auf 4.0 heben.

Elvis 7. Sep 2011 20:34

AW: Funktionen aus .NET4-DLL in Delphi 5 aufrufen
 
Zitat:

Zitat von Phoenix (Beitrag 1122479)
COM ist definitiv zu bevorzugen, da es die Sache ungeheuer einfach macht.
Reverse P/Invoke ist nicht wirklich schön.

COM braucht aber entweder globale Registration, oder man muss sich mit SxS auskennen.
Vor allem muss man mit SxS zusammen mit .Net aufpassen. (Bis vor XP SP2 gab das sogar reproduzierbar einen Bluescreen!)

Wenn man aber Funktionen aus .Net Assemblies exportiert, und dabei COM-kompatible Interfaces nutzt, kann man weiterhin schön OO programmieren und (s)eine native App ohne viel Setup und Abhängigkeit mit .Net features versehen.

Zitat:

Die nötigen Informationen sollten hier drin stehen - die müsstest Du dann aber ggf. noch von .NET 2.0 auf 4.0 heben.
Ist nicht mehr ganz aktuell.
Ich habe ein Projekttemplate, welches das Aufsetzen des Projektes so einfach macht, als würde man ein DLL-Projekt in Delphi anlegen.

storfi 8. Sep 2011 08:43

AW: Funktionen aus .NET4-DLL in Delphi 5 aufrufen
 
Guten Morgen,

vielen Dank für das Template, habe ich gleich ausprobiert. Allerdings funktioniert der Build nicht, weil die LIB.EXE nicht gefunden wird. Kann es sein, dass das Template unter Visual C# 2010 EXPRESS nicht funktioniert? Welche Version würde ich denn benötigen?

Vielen Dank,
Christian

Elvis 8. Sep 2011 10:05

AW: Funktionen aus .NET4-DLL in Delphi 5 aufrufen
 
Lib.exe ist ein Tool, welches .lib files für C++ erzeugt. (Das wollten einige User haben)
Ich breche meinen Task dummerweise ab, wenn ich aus VisualStudio gestartet werde, aber es kein Lib.exe gibt.
Eine einfache Lösung ist es vorerst eine leere Consolen App als Lib.exe an den Platz zu packen, über den er meckert. (Sollte dein VS Express Ordner sein und darin VC\bin\Lib.exe)

Kurzversion:
- Das tritt nur bei Express-Editionen auf, bzw wenn kein C++ da ist.
- Du kannst in deinem VS Order eine leere Consoleapp namens Lib.exe in den Ordner VC\bin packen

Mit leere Console app meine ich sowas:
Delphi-Quellcode:
program Lib;

{$APPTYPE CONSOLE}

begin

end.

Heute abend schaue ich es mir an und muss dann wohl eine neue Version veröffentlichen. (Mal schauen, ob die angestaubte Windows VM zu Hause noch funktioniert *g*)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz