![]() |
C# DLL in Delphi nutzen
Hallo Zusammen
(Delphi 10.4) Ich möchte gerne eine function aus einer C# DLL in delphi aufrufen und verwenden. Die C# Dll sieht so aus
Code:
using MessagePack;
using RGiesecke.DllExport; using System; using System.Runtime.InteropServices; namespace MsgPack.Native { public class Exports { [DllExport(CallingConvention = CallingConvention.StdCall)] [return: MarshalAs(UnmanagedType.BStr)] public static string ConvertToJson(IntPtr pBytes, int cBytes) { byte[] data = new byte[cBytes]; Marshal.Copy(pBytes, data, 0, cBytes); string result = MessagePackSerializer.ConvertToJson(data); return result; } } } Die definition in Delphi sieht aktuell so aus.
Delphi-Quellcode:
Der Aufruf
type
TConvertToJson = function(pBytes: Pbyte; cBytes: Integer): string; stdcall;
Delphi-Quellcode:
und so würde der Aufruf selber aussehen.
dllhandle := loadlibrary('MsgPack.Native.dll') ;
if dllhandle <> 0 then @ConverToJson := GetProcAddress(dllhandle, 'ConvertToJson'); if @ConverToJson <> nil then // <<--------------- Ist immer NIL begin
Delphi-Quellcode:
Jedoch gib GetProcAdress gibt immer NIL aus
tmp := ConverToJson(@buf[0], length(Buf));
Was mache ich falsch? Grüße s0n |
AW: C# DLL in Delphi nutzen
Delphi-Quellcode:
aber funktioniert?
LoadLibrary(..)
|
AW: C# DLL in Delphi nutzen
Ja LoadLibrary geht
|
AW: C# DLL in Delphi nutzen
Mein nächster Ansatz wäre: Mit dem DependencyWalker in die dll gucken, ob unter "ConvertToJson" auch was drin steht?
|
AW: C# DLL in Delphi nutzen
Oh, verrückt. Ich hätte erwartet dass man das in .NET noch auf "AnyCPU" oder so hatte (statt x86 oder x64) - Aber wenn LoadLibrary(..) an sich funktioniert dann scheint es daran ja wohl nicht zu liegen...
|
AW: C# DLL in Delphi nutzen
könntest du die DLL mal hier zur Verfügung stellen?
|
AW: C# DLL in Delphi nutzen
Ich wollte damals auch mal eine in C# geschriebene DLL in Delphi nutzen. Dafür musste dann die DLL aber mit einem speziellen Unmanaged Exports Helper kompiliert werden. Ansonsten sind die nicht wirklich sichtbar. Ob sich daran etwas geändert hat (vor allem auch mit den Attributen die ja gesetzt sind) weiß ich nicht. Glücklicherweise hatte ich die DLL damals selbst geschrieben und konnte das dann auch selbst alles machen.
Aber dem Tipp mit dem Dependency Walker solltest du definitiv folgen um zu sehen ob überhaupt etwas exportiert wird. |
AW: C# DLL in Delphi nutzen
Hmmm...
Code:
function ConvertToJson(pBytes: Pbyte; cBytes: Integer): string; stdcall; external 'MsgPack.Native.dll';
|
AW: C# DLL in Delphi nutzen
Bringt nur nix wenn die Methode gar nicht exportiert wird und unterscheidet sich auch nicht wirklich von seiner Version. Oder übersehe ich etwas?
|
AW: C# DLL in Delphi nutzen
Zitat:
Entweder es kommt was zurück beim direkten Aufruf oder nicht. Und sie wird exportiert!
Code:
[DllExport(CallingConvention = CallingConvention.StdCall)]
|
AW: C# DLL in Delphi nutzen
Delphi-Quellcode:
hat den Vorteil des Lazy Loadings. Wenn die DLL also nicht beim Programmstart direkt zur Verfügung stehe muss, dann kann man die auch erst verzögert laden. Macht den Anwendungsstart ggf. auch etwas schneller.
LoadLibrary()
Und nur weil das Attribut darüber steht heißt das bei C# nicht zwangsläufig, dass die Methode auch exportiert wird. Zumindest ist das meine Erfahrung. |
AW: C# DLL in Delphi nutzen
Zitat:
Meine Erfahrung entspricht deinem Gegenteil. aber muß mich nicht streiten. |
AW: C# DLL in Delphi nutzen
Hallo,
unter c++ wird an den Methodennamen immer was drangehangen, vielleicht ist es in c# ja auch so. |
AW: C# DLL in Delphi nutzen
Du musst die Zielplattform im c# Projekt auf x86 setzten.
Die Declaration von
Delphi-Quellcode:
mit Rückgabe String wird auch nicht funktionieren.
function ConvertToJson(pBytes: Pbyte; cBytes: Integer): string; stdcall; external 'MsgPack.Native.dll';
Versuche es mit PWChar |
AW: C# DLL in Delphi nutzen
Müsste es nicht
ConverToJson := GetProcAddress(dllhandle, 'ConvertToJson'); heißen? Und evtl WideString anstatt String in der Deklaration der Funktion. Das mit 32bit und 64bit ist immer etwas schwierig einzustellen in VS finde ich. Nutzt Du DLLExport 1.7.4.? Al Beispiel mal mein Projekt ![]() |
AW: C# DLL in Delphi nutzen
Zitat:
bzgl. x86 und x64 ist so ein Problem. Was bringt es wenn die Bibliothek RGiesecke.DllExport mit AnyCPU kompiliert wurde das beißt sich doch irgendwie. Delphi DLL -> C# über DllImport ist kein Problem. C# DLL über DllExport hingegen schon. (Leider) bsp.
Code:
Delphi.
namespace CalcTest
{ using System.Runtime.InteropServices; using RGiesecke.DllExport; public sealed class CalcTest { [DllExport(CallingConvention = CallingConvention.StdCall)] public static int Sum(int a, int b) { return a + b; } } }
Delphi-Quellcode:
function Sum(a, b: integer): integer; stdcall; external 'Calctest.Net.dll';
Delphi Anwendung stürzt sofort ab.. läßt sich nicht starten! Fehler! Der Fehler 0xc000007b tritt typischerweise auf, wenn die 32-Bit-Version von Windows mit einem 64-Bit-Betriebssystem oder -Anwendungen verwechselt wurde. Projekt ist aber x86 C# DLL ebenso jedoch RGiesecke.DllExport AnyCPU .. EDIT: RGiesecke.DllExport neu kompiliert 32Bit\x86 alle Frameworks 4.8 trotzdem selber Fehler. |
AW: C# DLL in Delphi nutzen
Also mit der Lib von Robert Giesecke war irgend wann Ende im Gelände. Bin dann zu DLLExport gewechselt, was grob auf RGiesecke basiert, aber eine Neuentwicklung ist.
|
AW: C# DLL in Delphi nutzen
Zitat:
|
AW: C# DLL in Delphi nutzen
Damit funktioniert es nun.
Offline Package von DLLExport im Archiv. genug damit gespielt. Wenn er nun das als Beispiel nimmt und sein Projekt entsprechend anpaßt wird es wohl funktionieren. ![]() Danke an @sh17 für die Info. Werde die Anhänge später wieder löschen. |
AW: C# DLL in Delphi nutzen
Zitat:
|
AW: C# DLL in Delphi nutzen
Zitat:
Zitat:
Habe nur gute Erfahrung unter C# -> Delphi gemacht und umgekehrt weil alles soweit selbst geschrieben siehe meinen C# Wrapper für .NET für Bass_vis(Delphi DLL). Du hattest halt schlechte Erfahrung und deshalb will ich nicht mit dir streiten.. Schrieb ich schon. Problem gelöst Anhang gelöscht. |
AW: C# DLL in Delphi nutzen
Ich mach hier mal ganz kurz Werbung für mein NuGet Package was genau für diesen UseCase gebaut wurde.
Es arbeitet im Grunde genau wie UnmanagedExports nur das die Internals auf DNLib anstatt auf ildasm/ilasm basieren. Dadurch spart ihr euch das ab und zu die DLL baut aber keine Exports drin landen, weil euch irgendwelche Windows 10 SDKs fehlen. Und DLLExport ist zwar nett, aber mir passt das extra GUI zum exportieren im Nachhinein gar nicht. ![]() In den Samples ist das alles ganz gut dargestellt. Die Schnittstelle der Attribute ist quasi deckungsgleich mit der von RGiesecke und der Rest passiert automatisch. |
AW: C# DLL in Delphi nutzen
Zitat:
|
AW: C# DLL in Delphi nutzen
Du kannst in C# einen COM Server erstellen. Dessen interface exportierst du und importierst die TLB dann in Delphi.
Damit du den COM-Server nicht Registieren brauchst, nutzt du einfach Side-by-Side Konfiguration. Das erspart viel fehleranfällige Schnittstellendefinitionen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz