Open Source im professionellen Einsatz

Work in Progress

Unter die "unterschiedlichen Datenquellen" (Abbildung 2), die sich über LINQ ansprechen lassen, fallen natürlich auch Datenbanken. Unter Mono/C# gilt dies aber erst mit Einschränkungen. Arbeiten zur Erweiterung der Backends auf Datenbanken - darunter zuerst für MySQL - laufen bei Mono erst. Der aktuelle Status lässt sich unter anderem unter [3] erfragen.

Abbildung 2: In der Microsoft-Welt gibt es viele Third-Party-Provider für LINQ-Anbindungen. Mono holt erst langsam auf. Einige Datenbank-Backends gibt es jedoch bereits.

Abbildung 2: In der Microsoft-Welt gibt es viele Third-Party-Provider für LINQ-Anbindungen. Mono holt erst langsam auf. Einige Datenbank-Backends gibt es jedoch bereits.

Implizit und von Anwendern von LINQ-Expressions in der Regel unbemerkt, benutzt Listing 3 übrigens eine weitere jüngst hinzugekommen Neuerung von C#, die Lambda-Ausdrücke. Dabei handelt es sich um anonyme Funktionen, die der Entwickler erst an der Aufrufstelle definiert.

Listing 3: LINQ

01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 
05 class Hauptprogramm {
06   public static void Main(string[] args) {
07     List<double> zufallsZahlen = new List<double>();
08     Random rg = new Random();
09     for(int i=0; i<50; i++) zufallsZahlen.Add
(6.0*rg.NextDouble());
10 
11     var highNumbers =
12       from z in zufallsZahlen
13       where z>5.5
14       select z;
15 
16     foreach(var x in highNumbers) Console.WriteLine(x);
17   }
18 }

Hilfe von außen

Obgleich Mono über eine reichhaltige Ausstattung an Bibliotheken verfügt, gibt es Situationen, in denen bestimmte Funktionen fehlen oder die Performance einer reinen C#-Umsetzung nicht ausreicht. Hier hilft der Aufruf externer Bibliotheken, oft aus dem C-Umfeld, mit P/Invoke. Listing 4 zeigt das prinzipielle Vorgehen in Anlehnung an [4].

Listing 4: Libc
einbinden

01 using System;
02 using System.Runtime.InteropServices;
03 
04 class Hauptprogramm {
05   public static void Main(string[] args) {
06     int id = getpid();
07     Console.WriteLine("Die ID des Prozesses ist {0}", id);
08   }
09 
10   [DllImport ("libc.so.6")]
11   private static extern int getpid ();
12 }

Der Beispielcode liest die ID seines eigenen Prozesses mit Hilfe der Libc-Funktion »getpid()« aus. Wie zu sehen ist, reicht es aus, die Bibliothek samt der daraus zu ladenden Funktion anzugeben. Die Laufzeitumgebung erledigt dann den Rest, sie findet und lädt die Bibliothek automatisch. Allerdings entsteht beim Aufruf externer Bibliotheken selten portabler Code - schon die unterschiedlichen Namen von Bibliotheken unter Windows und Linux erschweren dies. C++-Code lässt sich ebenfalls nutzen, der Programmierer sollte ihn jedoch als »extern C« deklarieren.

Auch in der Übergabe von Parametern versteckt sich mancher Fallstrick. Zudem unterliegt externer Code natürlich nicht den Kontroll- und Aufräummechanismen, die C# im Vergleich zu C und C++ zu einer sicheren Sprache machen. Wer externen Code einbindet, sollte also genügend Zeit für Entwicklungs- und Testphasen einplanen. Wegen der besseren Performance von C- und C++-Code kann sich dies aber im Einzelfall durchaus auszahlen.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 3 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook