Archive for the ‘C#’ Category

RCON Support erweitert

No Comments »

Die Entwicklung von GameServer für Windows Phone 7 geht sehr gut voran. Für folgende Spiele habe ich mittlerweile den RCON-Support implementiert:

Alien Swarm
Counter-Strike
Counter-Strike Condition Zero
Counter-Strike: Source
Day of Defeat
Day of Defeat: Source
Half-Life
Half-Life 2
Left 4 Dead
Left 4 Dead 2
Dark Messiah of Might and Magic
Natural Selection
Team Fortress 2
Call of Duty
Call of Duty – United Offensive
Call of Duty 2
Call of Duty 4
Call of Duty 5: World at War
Quake 3: Arena
Urban Terror
Wolfenstein: Enemy Territory

Die Version befindet sich derzeit in der Testphase und wird in den nächsten Tagen als Update bereitstehen.


RCON Support für GameServer

No Comments »

Die ersten Gehversuche, um auch Rcon-Support für die Windows Phone 7 Version von GameServer zu realisieren, habe ich erfolgreich abgeschlossen. Meine aktuelle Entwicklungsversion unterstützt Counter Strike: Source, Day of Defeat Source, Halflife 2, Left 4 Dead 1 & 2 und Team Fortress 2. Hierbei die Funktionen um die aktuelle Karte zu wechseln, Spieler zu kicken und Spieler zu bannen. Das Ändern von Cvars steht nun auf der Tagesordnung und sollte innerhalb der nächsten Tage implementiert sein.

Weiterhin sind Counter Strike 1.6 und alle anderen Halflife 1-Spiele sowie die Call of Duty-Reihe in Vorbereitung.

Ihr findet die App im Marketplace unter folgender Adresse: GameServer for Windows Phone 7


GameServer für Windows Phone 7

No Comments »

Nachdem die Version 2.0 von GameServer für Joomla fast fertig gestellt ist, habe ich nun meine erste Windows Phone 7 App programmiert. Ziel der App ist es, Livedaten von GameServern auf dem Phone darzustellen.
Die App befindet sich derzeit im Zertifizierungsprozess bei Microsoft und sollte in den nächsten Tagen im Marketplace verfügbar sein.

Fürs Erste unterstützt die App folgende Spiele:

Alien Swarm
America’s Army
America’s Army 3
Armed Assault
Armed Assault 2
Battlefield 1942
Battlefield Vietnam
Battlefield 2
Battlefield 2142
Battlefield Bad Company 2
Brink
Call of Duty
Call of Duty – United Offensive
Call of Duty 2
Call of Duty 4
Call of Duty 5: World at War
Counter-Strike
Condition Zero
Counter-Strike: Source
Crysis
Crysis Wars
Crysis 2
Day of Defeat
Day of Defeat: Source
Doom 3
Enemy Territory: Quake Wars
F.E.A.R.
Frontline: Fuel of War
Ghost Recon: Advanced Warfighter
Ghost Recon: Advanced Warfighter 2
Half-Life
Half-Life 2
Homefront
Killing Floor
Left 4 Dead
Left 4 Dead 2
Natural Selection
Medal of Honor
Dark Messiah of Might and Magic
OpenTTD
Quake 3: Arena
Quake 4
Orchestra: Ostfront 41-45
Return to Castle Wolfenstein
San Andreas: Multiplayer
Soldier of Fortune 2: Double Helix
Team Fortress 2
Unreal Tournament
Unreal Tournament 2003
Unreal Tournament 2004
Unreal Tournament 3
Urban Terror
Wolfenstein: Enemy Territory


Erweiterung der DevExpress-Templates

No Comments »

CodeRush von DevExpress bietet durch seine Shortcuts die Möglichkeit die Schreibarbeit deutlich zu beschleunigen.

So gibt es zum Beispiel das Kürzel “as” zum Anlegen einer Auto-Property vom Typ String. Das sieht dann so aus:

und ergibt:

Das Ganze funktioniert analog mit “ab” für Booleans, “ai” für Integer usw…

Leider gibt es von Haus aus keine Shortcuts für virtuelle Auto-Properties, die für NHibernate benötigt werden.

CodeRush bietet hierfür eine Möglichkeit eigene Shortcuts hinzuzufügen:

Dieser Shortcut  ermöglicht die Schreibweise “avs” für

Auch dieser Shortcut unterstützt automatisch die von CodeRush gebotenen Kürzel für die verschiedenen Datentypen (avb, avi…).


Fluent NHibernate mit abgeleiteten Klassen

No Comments »

Gestern Abend habe ich mich mal wieder ein wenig mit Fluent NHibernate beschäftigt. Mein Ziel war es, eine Objektstruktur, die aus einer Basisklasse und zwei abgeleiteten Klassen besteht mittels Fluent NHibernate zu speichern.

Nach einigem Fehlversuchen bin ich dann zu folgendem Ergebnis gekommen:

public class KontaktMap : ClassMap<Kontakt>
    {
        public KontaktMap()
        {
            Id(x => x.KontaktId)
                .GeneratedBy
                .GuidComb()
                .WithUnsavedValue("00000000-0000-0000-0000-000000000000");
 
            Map(x => x.KontaktPerson);
 
            JoinedSubClass<Brief>("KontaktId", MapBrief);
            JoinedSubClass<Anruf>("KontaktId", MapAnruf);
        }
 
        private static void MapBrief(JoinedSubClassPart<Brief> part)
        {
            part.Map(x => x.Absender);
            part.Map(x => x.Text);
        }
 
        private static void MapAnruf(JoinedSubClassPart<Anruf> part)
        {
            part.Map(x => x.Telefonnummer);
            part.Map(x => x.Bemerkung);
        }  
    }

Hier das vollständige Beispiel: Download


Fluent NHibernate

No Comments »

Habt ihr Euch auch schon einmal darüber geärgert, wieder diese unschönen XML-Dateien für das Mapping von NHibernate schreiben zu müssen? Seit kurzem gibt es gegen diese Unschönheit eine Lösung. Fluent NHibernate bietet Euch die Möglichkeit Eure Mappings “strongly typed” zu definieren. Anstatt der hbm.xml-Datei gibt es mit Fluent NHibernate eine Mapping-Klasse.

Die Klasse Person mit einer Liste von Adressen

    public class Person
    {
        public virtual Guid PersonId { get; set; }
        public virtual string Vorname { get; set; }
        public virtual string Nachname { get; set; }
        public virtual IList<Adresse> Adressen { get; set; }
    }

kann dann wie folgt gemappt werden.

    public class PersonMap : ClassMap<Person>
    {
        public PersonMap()
        {
            Id(x => x.PersonId)
                .GeneratedBy
                .GuidComb()
                .WithUnsavedValue("00000000-0000-0000-0000-000000000000");
 
            Map(x => x.Vorname).WithLengthOf(50);
            Map(x => x.Nachname).WithLengthOf(50);
 
            HasMany<Adresse>(x => x.Adressen)
                .Access.AsProperty()
                .AsBag().WithKeyColumn("PersonId")
                .Cascade.All();
        }
    }

Aber welche Vorteile biete die Fluent-Variante?

1. Die XML-Mapping-Dateien können nicht vom Compiler geprüft werden. Fehlkonfigurationen fallen erst zu Laufzeit auf (Exception)
2. Mapping-Klassen werden wie alle anderen Klassen vom Compiler geprüft. Fehler fallen zu Entwurfszeit auf.
3. Beim Umbennen von Feldern in Klassen über die Refactoring-Möglichkeiten von Visual Studio bzw. Erweiterungen werden die Felder in den Mapping-Klassen ebenfalls umbenannt. Bei den XML-Mappings müsste das händisch gemacht werden.
4. Fluent-Mappings sind deutlich kürzer bzw. deutlich besser lesbar.

Auch die Konfiguration von NHibernate kann über eine FluentVariante realisiert werden.

    ISessionFactory sessionFactory = Fluently
        .Configure()
        .Database(SQLiteConfiguration.Standard.UsingFile("Beispiel.db"))
        .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Person>())
        .BuildSessionFactory();

Unter http://fluentnhibernate.org/ kann man sich die aktuelle Version der NHibernate-Erweitung laden und mit der neuen XML-freien Variante von Mappings anfreunden.

Das komplette Beispiel gibt es hier.


HudsonTray – A Hudson Tray Application

No Comments »

Unsere Java-Truppe hat uns vor ein paar Tagen ihren Continuous Integretion Server Hudson gezeigt. Wir waren sehr davon angetan, wie einfach dieses System zu bedienen ist. Als sie uns sagten, das Hudson auch .net-Projekte bauen kann, wurden wir hellhörig.
Kurze Zeit später hatten wir auf einer VM ein Testsystem online, welches für erste Vergleichstest herhalten musste. Der erste Eindruck von der einfachen Bedienung bestätigte sich bei jedem neuen Projekt, das wir im System hinterlegten. Auch das Thema Unit-Test mit NUnit wird durch ein Add-In für Hudson unterstützt. Wer mal etwas tiefer in die Konfiguration von Jobs schauen möchte, kann ja mal hier gucken :-)

Das einzige, was mir persönlich nicht so gut gefiel, war die Tatsache, das es keine brauchbare Tray-Anwendung zur Darstellung des Status gab. Ich persönlich bin kein großer Freund von Mail-Benachrichtigungen.

Nach kurzem Durchsuchen der Hudson-Seite wurde ich auf die bereitgestellt API aufmerksam… und ein paar Abende später, war die erste Version meiner Tray-Anwendung fertig.

HudsonTray-Jobs

Wer mehr sehen will, kann sich auch auf CodePlex die aktuelle Version oder auch den Source-Code runterladen.


WpfSimpleChart

No Comments »

Ich arbeitet zur Zeit in der Firma an einem Prototypen für eine neue Softwareversion. Eine Anforderung ist die transparente Darstellung von mehreren Werten in einem Balken-Diagramm. Leider gibt es für Wpf noch keine freien Komponenten, die für meine Aufgabe nutzbar wären.
Abends kam mir dann die Idee, das Problem selbst zu lösen. Gesagt getan… nach einigen kleinen oder auch großen Kämpfen mit Wpf und Xaml habe ich heute endlich eine in meinen Augen vorzeigbar Version fertiggestellt.

WpfSimpleChart – Source
WpfSimpleChart – Demo


Neue AvalonDock Version

2 Comments »

Wer im Netz nach guten Komponenten für Wpf sucht, gibt schnell sehr viel Geld aus. Das es auch anders geht, beweist uns AvalonDock. Von der Docking-Komponente für Wpf ist heute eine neue Version herausgekommen. Diese kann auf Codeplex heruntergeladen werden.
Neben einigen Bugfixes gibt es nun auch eine Dokumentation. Neben der Komponente gibt es auch noch ein sehr schönes Beispiel, welches einem die wesentlichen Funktionen sehr veranschaulicht.

Ich kann nur sagen: Danke und weiter so!!!
AvalonDock


Sortieren der Objekte einer gebunden WPF-ListBox

No Comments »

Und wieder einmal musste ich “recht” lange suchen um eine vermeidlich einfache Problematik zu klären. Diesmal wollte ich per Button die Einträge einer WPF-ListBox aufwärts bzw. abwärts sortieren.
Hier das Formular:
ListBoxBinding
Bei den Items der ListBox handelt es sich um eine ObservableCollection, die ich über die Eigenschaft ItemsSource an die ListBox gebunden habe.
Im Eventhandler der Buttons habe ich folgenden Code hinterlegt:

lbxProjects.Items.SortDescriptions.Clear();
lbxProjects.Items.SortDescriptions.Add(new SortDescription("ProjectName", ListSortDirection.Ascending));
lbxProjects.Items.SortDescriptions.Add(new SortDescription("Count", ListSortDirection.Ascending));

bzw.

lbxProjects.Items.SortDescriptions.Clear();
lbxProjects.Items.SortDescriptions.Add(new SortDescription("ProjectName", ListSortDirection.Descending));
lbxProjects.Items.SortDescriptions.Add(new SortDescription("Count", ListSortDirection.Descending));

Über die Eigenschaft “SortDescriptions” kann man sehr komfortabel festlegen, wie die Liste sortiert werden soll. In meinem Beispiel sortiere ich zuerst nach dem Projektnamen und dann nach der Anzahl, wodurch sich folgendes Bild ergibt:
ListBoxBinding2

Hier der Source für Visual Studio 2008: Download