Entwickler-Ecke
Basistechnologien - Funktion aus einer Delphi-DLL in C# verwenden
Tastaro - Do 14.10.10 17:29
Titel: Funktion aus einer Delphi-DLL in C# verwenden
Grüße,
ich habe in Delphi eine wundervolle DLL (dudeldu.dll) geschrieben, die geradezu fantastische Funktionen exportiert. :)
Nun möchte ein Kunde diese DLL unter C# verwenden und fragt mich, wie er da die Funktionen deklarieren muss.
Leider habe ich so gar keine Ahnung von C#. Es wäre nett, wenn mir jemand verraten könnte, was man in C# hinschreiben muss, dass man die Funktionen dort dann aufrufen kann. Und mich persönlich würde interessieren wie ein Aufruf (inbesondere mit Übergabe von Strings) in C# dann aussehen würde.
Drei exemplarische Delphi-Funktionen in der DLL sind:
Delphi-Quelltext
1: 2: 3: 4: 5:
| procedure init_dll(pcFilename: pchar); stdcall;
function open_project(pcProject: pchar; boSilent: boolean): boolean; stdcall;
function functioncall_finished(pcResultBuffer: pchar; iResultBufferSize: integer): integer; stdcall; |
Moderiert von
Martok: Topic aus Dateizugriff verschoben am Do 14.10.2010 um 17:32
Moderiert von
Martok: Delphi-Tags gesetzt
Ralf Jansen - Do 14.10.10 17:55
Im einfachsten Fall sehe der der Aufruf per PInvoke in etwa so aus wie im folgenden.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| [DllImport("dudeldu.dll"] static extern void init_dll(string pcFilename);
[DllImport("dudeldu.dll")] static extern bool open_project(string pcProject, bool boSilent);
[DllImport("dudeldu.dll")] static extern Int32 functioncall_finished(string pcProject, integer iResultBufferSize); |
| Zitat: |
| Und mich persönlich würde interessieren wie ein Aufruf (inbesondere mit Übergabe von Strings) in C# dann aussehen würde. |
Das solltest du nicht fragen sondern definitiv selbst ausprobieren. Obige DLLImport Aufrufe sind nur auf Verdacht und sicherlich nicht dazu geeignet sie einfach an einen Kunden weiter zureichen.
Th69 - Do 14.10.10 18:14
Dafür wird das sog. P/Invoke verwendet, d.h. mittels DllImportAttribute.
Dein Code müsste dann etwa so aussehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| public static class DudelDu { [DllImport("dudeldu.dll")] public static extern void init_dll(string Filename);
[DllImport("dudeldu.dll")] public static extern bool open_project(string Project, bool Silent);
[DllImport("dudeldu.dll")] public static extern int functioncall_finished(StringBuilder ResultBuffer, int ResultBufferSize); } |
Und der Aufruf von C# aus, dann einfach:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| DudelDu.init_dll("MyFile");
bool bOpen = DudelDu.open_project("project", true);
StringBuilder buffer = new StringBuilder(100); int result = DudelDu.functioncall_finished(buffer, 100); string sBuffer = buffer.ToString(); |
Aber wie Ralf Jansen schon schrieb, du müßtest es erst testen...
Tastaro - Mo 18.10.10 08:58
Herzlichen Dank für die Antworten.
Der Kunde hat mit inzwischen seinen Code zugeschickt. Der sieht nun aber ganz anders aus als eure Vorschläge.
Selbst Testen kann ich nicht, da ich kein C# habe. Wir schreiben unsere Software in Delphi. Die DLL ist eigentlich eine kostenlose Zugabe zu unserem Produkt. Sie beinhaltet so etwas wie eine API mit der man auf einige Funktionen der eigentlichen Software zugreifen kann.
Aber vielleicht helfen eure Zeilen nun, dass ich unserem Kunden einen Tipp geben kann wie er mit C# weiter kommt.
Beste Grüße
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!