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 user profile iconMartok: Topic aus Dateizugriff verschoben am Do 14.10.2010 um 17:32
Moderiert von user profile iconMartok: 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);
  // hier gehe ich von aus, daß in den ResultBuffer geschrieben wird
  // (daher StringBuilder anstatt string)
}


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