Zufällig eine Fritz!Box? Wenn ja, dann häng sie mit an den internen ISDN-Bus der TK-Anlage. Du kannst dann jFritz (mit Klingeling) übers Netzwerk nutzen.
Das hat wahrscheinlich auch eher weniger mit C# zu tun. Er meint wahrscheinlich Citrix WinFrame. Mitlerweile nennt sich das Produkt jedoch Citrix Presentation Server.
Mit C++/CLI (der mit VS2005 eingeführte Nachfolger von managed C++) kannst du sog. mixed-mode assemblies erstellen, in denen unmanaged und managed Code vereint ist. Um die "Details im Hintergrund" kümmert sich der Compiler.
Ich verwende statische ExceptionBuilder-Klassen. Es gibt sowohl globale, als auch lokale ExceptionBuilder. Ein globaler ExceptionBuilder ist in meinem Fall immer im Namespace EpiSource.Common.ExceptionBuilders definiert. Ein lokaler ExceptionBuilder ist eine private Unterklasse des Typs, der die generierten Exceptions benötigt. Die notwendigen Strings sind in Ressourcendateien gespeichert. Die für globale ExceptionBuilder in der Datei CommonExceptionMessages.resx, die für lokale ExceptionBuilder gesammelt in der Ressource ExceptionMessages.resx.
Im Bsp sind Schlüssel und Wert identisch. Die Verwendung eines Dictionary anstelle einer gewöhnlichen Liste ermöglicht jedoch das auffinden von enthaltenen objekten mit einer operation der Größenordnung O(1).
Allerdings zeigt dir Reflector nie den tatsächlichen Quellcode. Die Rückumwandlung ist immer verlustbehaftet. Es fehlen selbstverständlich jegliche Kommentare und außerdem ist Reflector nicht immer in der Lage jedes Sprachkonstrukt korrekt rückzuwandeln. Das beste Beispiel sind compilergenerierte Iteratoren (C#: yield return). Bei denen liefert Reflector zwar logischen IL-Code, aber den C#-Code würde niemand so schreiben. Der Iterator wie er im tatsächlichen Quellcode steht ist nur noch schwer zu erahnen.
Immer noch nicht die Beste Performance, aber deutlich besser als dein Code:
string[] tokens = inputString.Split(' ');
// Hashset wäre besser geeignet, Dictionary geht auch
IDictionary words = new Dictionary<string, string>(tokens.Length);
// Achtung: O(n)
foreach (string token in tokens)
{
if (!words.ContainsKey(token))
words.Add(token, token);
}
// words enthält nun jedes Wort genau einmal
// ein Array lässt sich daraus folgendermaßen erstellen; Achtung: O(n)
string[] wordsArray = new string[words.Count];
words.Values.CopyTo(wordsArray, 0);
// so erstellst du wieder einen string; Annahme, dass ein durschnittliches Wort (einschließlich dem nachfolgenden Leerzeichen) aus sieben Zeichen besteht. Durch schätzen der Länge des fertigen Strings lässt sich die Performance erhöhen. Über die Verwendung eines genaueren Durchschnittswerts sollte nachgedacht werden.
StringBuilder keywordsBuilder = new StringBuilder(inputString.Length - 7 * (tokens.Length - words.Count));
// Achtung O(n)
foreach (string keyword in words.Values)
{
keywordsBuilder.Append(keyword);
keywordsBuilder.Append(" ");
}
// letztes Leerzeichen entfernen
keywordsBuilder.Remove(keywordBuilder.Length - 1, 1);
Visual Studio kann das nicht. Es gibt jedoch Übersetzungstools, die das unterstützen. Kostenlose Tools, die invariante Sprache und Übersetzung gleichzeitig anzeigen, kenne ich bloß zwei. Sehr gut gefallen hat mir GlobalResource. Das Entfernen von Resourcestrings ist jedoch nicht möglich, da durch einen Fehler sonst alle Daten verloren gehen Leider gibt es keinen Sourcecode und die Anwendung wird nicht mehr weiter entwickelt. Schließlich gibt es auch noch eine webbasierte Anwendung für Portale etc., Esperantus.
Selbstverständlich gibt es auch kommerzielle Tools, die Satellite-Assemblies auch nachträglich erstellen können (kein Sourcecode mehr benötigt). Ein solches Tool ist Globalizer.Net.
/edit: Mehrere Ressourcendateien werden verwendet, um das erstellen (auch nachträglich) von Sprachpaketen zu erstellen.
/edit2: Noch ein Nachtrag. Ich bin gerade über ResEx gestolpert, noch ein Tool, das das Übersetzen von Resx-Dateien erleichtern soll. Getestet habe ich es noch nicht. Auch sollte man wohl noch Alchemy Catalyst erwähnen.
So schwer dürfte das ganze nicht zu realisieren sein. Zum einen gibt es für vBulletin ein entsprechendes Addin (deutsche Version). Da nicht unmittelbar in vBulletin integriert, wahrscheinlich jedoch eine nicht besonders elegante Lösung. Da es sich hier um ein .Net Forum handelt, bietet sich eigentlich so oder so eher Community Server an. Dieses System unterstützt Tags von vornherein (siehe auch).
Die größeren Probleme ergäben sich wohl eher in Anbetracht des Aufwands der Umstellung sowie der Lizenzkosten.
Ich selbst habe noch nie länger vor einem MacBook gesessen. Eine ehemalige Klassenkameradin hatte jedoch eines. Ansich ein tolles Gerät, leider nur mit Hochglanz-Spiegeldisplay erhältlich. Diese bieten zwar theoretisch eine höhere Farbbrillanz, aber was nutzt einem das, wenn man bloß das eigene Spiegelbild sieht? Von diesem Problem sind jedoch die meisten Consumerprodukte betroffen - die meisten Kunden scheinen sich auch nicht daran zu stören. Für mich ist es ein KO-Kritierium, deshalb hoffe ich auch, dass der Zwangsdienst ausreicht, um mir vor Studienbeginn ein MacBook Pro mit mattem Display zu leisten (bei diesem Produkt hat man die Wahl).
Was Parallels angeht, möchte ich noch eine Alternative nennen: VMWare Fusion. Das Produkt ist voll kompatibel zu der bekannten Virtualisierungslösung VMWare Workstation, die es für Windows und Linux gibt. Ich selber nutze diese unter Windows (Version 5, neuerdings 6) und hatte bisher noch nie Grund Unzufrieden zu sein.
Vielleicht hast du auch schon von Bootcamp gehört. Damit lässt sich Windows auch nativ auf dem MacBook betreiben. Gerade in Kombination mit Fusion / Prallels sehr nützlich: Man kann das fest installierte Windows direkt booten um volle Direct3D Unterstützung zu haben, aber auch von MacOS darauf zu greifen, ohne neustarten zu müssen (entsprechende Konfiguration der Hardwareprofile vorausgesetzt, Fusion unterstützt angeblich die automatische Einrichtung).
Du kannst direkt auf Winamp zugreifen. Ich bin mir ziemlich sicher, dass Informationen zum gerade laufenden Lied verfügbar sind. Nähere Informationen findest du vermutlich im Winamp SDK.
Gemäß deutschem Urheberrecht kann der / die Urheber Nutzungsrechte vergeben / gewähren. Dabei müsste doch eigentlich auch derartiges ausreichend sein:
Zitat
Das Recht diese Software zu verwenden, kopieren, veröffentlichen und modifizieren wird mit folgenden Einschränkungen kostenlos gewährt:
1) Alle Vermerke auf den / die Urheber in Quell- und Binärcode müssen erhalten bleiben.
2) Ein für den Empfänger wahrnehmbarer Hinweis auf den / die Urheber muss vorhanden sein.
Auf diese Software findet deutsches Recht Anwendung. Haftung und Gewährleistung bleiben auf vorsätzliches Handeln beschränkt.
/Ergänzung:
Die BSD Lizenz verlangt nicht, dass die Software unter der selben Lizenz weitervertrieben werden muss. Auch muss der Quellcode nicht verfügbar gemacht werden.
1) Du exportierst Funktionen oder COM-Klassen, die du mittels P/Invoke bzw. COM-Interop in deiner .Net (C#) Anwendung verwendest.
2) Du verwendest C++/CLI. Damit kannst du mixed mode assemblies erstellen, die du auch unter .Net verfügbar machen kannst. Leider lädt die MSDN-Webpage bei mir gerade sehr langsam, du findest jedoch näheres zu dem Thema, wenn du im Index der offline Hilfe nach cl.exe suchst und dann "Common Language Runtime (Option)" auswählst.
Ergänzung: C++/CLI ist nicht Managed C++ wie es mit .Net 1 eingeführt wurde. C++/CLI gibt es erst seit .Net 2.