Als nächstes schreibe ich eine kleine Konsolenanwendung, mit deren Hilfe ich die DLL testen kann. Als Projekttyp nutze ich daher “Konsolenanwendung”. Im Projektmappenexplorer wird unter Verweisen ein neuer Verweis auf die DLL angelegt, dann folgt die Eingabe des Quellcodes:
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingde.uweziegenhagen;namespace Levenshtein_Test
{class Program
{staticvoid Main(string[] args){
Console.WriteLine(TextCompare.levenshtein("uwe", "andreas"));
Console.ReadLine();}}}
Hier eine kruze Anleitung, wie man mit C# eigene DLLs erstellt und diese von Powershell aus benutzt. Ich nutze die kostenlose Version von Visual Studio, Visual C# Express 2008. Als umzusetzender Algorithmus kommt Levenshtein zum Einsatz, über den ich öfter schon geschrieben habe, die Funktion stammt aus der englischen Wikipedia.
In VS lege ich ein neues Projekt vom Typ Klassenbibliothek an, als Namespace wähle ich “de.uweziegenhagen”. Das Projekt habe ich unter dem Namen “simpledll” abgespeichert, die “Class1″ Datei in TextCompare.cs umbenannt. Hier der Quelltext für die statische Klasse, wichtig ist, dass die Levenshtein Funktion “public static” ist, nicht “private” wie in der Wikiedia.
usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespace de.uweziegenhagen{publicstaticclass TextCompare
{publicstatic Int32 levenshtein(String a, String b){// http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#C.23if(string.IsNullOrEmpty(a)){if(!string.IsNullOrEmpty(b)){return b.Length;}return0;}if(string.IsNullOrEmpty(b)){if(!string.IsNullOrEmpty(a)){return a.Length;}return0;}
Int32 cost;
Int32[,] d =newint[a.Length+1, b.Length+1];
Int32 min1;
Int32 min2;
Int32 min3;for(Int32 i =0; i <= d.GetUpperBound(0); i +=1){
d[i, 0]= i;}for(Int32 i =0; i <= d.GetUpperBound(1); i +=1){
d[0, i]= i;}for(Int32 i =1; i <= d.GetUpperBound(0); i +=1){for(Int32 j =1; j <= d.GetUpperBound(1); j +=1){
cost = Convert.ToInt32(!(a[i -1]== b[j -1]));
min1 = d[i -1, j]+1;
min2 = d[i, j -1]+1;
min3 = d[i -1, j -1]+ cost;
d[i, j]= Math.Min(Math.Min(min1, min2), min3);}}return d[d.GetUpperBound(0), d.GetUpperBound(1)];}}}
Das Übersetzen der DLL sollte problemlos funktionieren, die fertige DLL sollte im PRojektverzeichnis unter /bin/release liegen.
Unter http://snippets.dzone.com/posts/show/3861 liegt eine kleine Anleitung, wie man mit C# DLLs erstellt und einbindet. Eine angepasste übersetzte Version des Artikels für C# Express 2008 werde ich in den nächsten Tagen mal fertigstellen.
Für die Troisdorfer Linux Usergroup bereite ich momentan einen Vortrag vor, der ein paar Grundzüge von LaTeX vorstellen soll. Ist noch lange nicht fertig, in unregelmäßigen Abständen lege ich aber eine PDF-Version unter folgender URL ab: http://uweziegenhagen.de/troisdorf/Intro.pdf.