Montag, 20. Juli 2009

C Funktionen aus C# rufen

Für mich ist es immer wichtig das Sprachen nicht isoliert dastehen. Ich möchte von jeder Sprache oder Laufzeitumgebung ungehindert mit dem System kommunizieren. Da ich mich meistens auf diversen UNIX Systemen herumtreibe ist das größtenteils C. Gerade im Moment hat es mir C# ein wenig angetan und auch hier kann man ohne weiteres mit dem System schnacken. Darum hier mal ein kleines Beispiel das eventuell dem ein oder anderen weiterhilft. Das ganze wurde auf MacOSX mit Mono getestet läuft aber genauso gut unter *BSD und Linux.

Als erstes legen wir eine kleine Library an die die Funktion enthält die wir später aufrufen wollen.

//compile with gcc -dynamiclib test.c -o test.dylib
#include

int test(const char* s) {
printf("Printing from C: %s\n",s);
return 666;
}

Nichts dramatisches, unser Programm soll lediglich etwas Text übernehmen ausgeben und einen Integer an unser C# Programm zurück liefern. Nach dem kompilieren erhalten wir eine dynamische Bibliothek mit Namen test.dylib.

Unser C# Code ist ähnlich spektakulär aufgebaut:

using System;
using System.Runtime.InteropServices;

class PTest {
[DllImport("test.dylib")]
public static extern int test(string s);

public static void Main() {
Console.WriteLine(test("this is a test"));
}
}

Eine interessante Anmerkung nebenbei: test.dylib muss zum Zeitpunkt der Übersetzung nicht existieren.

Jetzt ist man also ohne weiteres in der Lage mit Libs wie z.B. libzfs oder libdtrace von C# aus zu kommunizieren um stark integrierte (aber logischerweise nicht mehr plattformunabhängige) Applikationen zu schreiben.

Kommentare:

Guido Luetke Woestmann hat gesagt…

Hm, mal sehen was meine Glaskugel dazu sacht: "...ZFS-Treiber für Windows ...". Aha, das Mistding ist schon wieder beschlagen ;-) Aber schön wärs ja, ein bisschen Interoperabilität wäre für die Popularität von ZFS und (Open)solaris vielleicht nicht schlecht (für die Stabilität vielleicht schon eher, aber das ist ein anderes Thema).

xRaich[o]²x hat gesagt…

ZFS auf Windows wäre sicherlich DAS Ding. Aber ich würde mir schon wünschen das Apple mal langsam damit aus dem Quark kommen würde ;)