Konsolenfenster unter Mono schließen

Möchte man unter .NET/Mono das Schließen einer Konsolenanwendung abfangen so kann man dies mit einigen Methoden lösen, wie zum Beispiel die Anwendung bestimmten pInvoke Techniken unter Windows. Allgemeiner kann man das ganze mit dem „CancelKeyPress“ Event gestalten was dann so aussieht:

Console.CancelKeyPress+=new ConsoleCancelEventHandler(Console_CancelKeyPress);
...
static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
  WriteErrorToConsole("Programm wird abgebrochen...");
  e.Cancel=true; // Event abbrechen
}

C++ nach C# Portierungen

Portierungen sind eine schöne Sache wenn man sich die Zeit vertreiben möchte ;) Bei der Portionierungen von C/C++ nach C# wird dabei immer wieder Dinge sehen die Schema F betreffen wie z.B. bestimmte Datentypen:

unsigned int -> uint
unsigned -> uint
unsigned char -> byte
std:string -> string
size_t -> Int64

Andere sehr beliebte Sachen sind Kollektionen wie Listen oder die Vektorklasse. Aus Dingen wie:

std::vector Things;
std::list Things();

wird dann meist immer ein:

List<Thing> Things;

Die Map:

std::map<unsigned short, unsigned> nodes;

wird dabei durch ein Dictionary ersetzt:

Dictonary<unsigned short, unsigned> nodes;

Immer wieder schön sind die Typedefs wie z.B.

typedef std::vector<Account> Accounts;

welche bei mir dann auch in eine Liste umgewandelt werden, an den Stellen an denen sie benutzt werden:

List<Account> Accounts;

Beim portieren von Klassen werden Header und C Datei in eine gemeinsame Datei geworfen und die Doppelungen entfernt. Aus den Klassenfunktionen aller:

void Thing::MakeFoo(int value)

wird dabei ein:

void MakeFoo(int value)

Bei While Schleifen wird aus einem:

while (message.getUnreadLength())

ein

while (message.getUnreadLength()!=0)

Aus einem Vergleich:

if(!receiver)

wird ein

if (receiver!=null)

Iteratoren sind auch immer wieder schöne Sachen. Aus

for (ChatChannels::const_iterator i = mChatChannels.begin(), i_end = mChatChannels.end());

wird ein:

foreach(ChatChannel channel in mChatChannels)

Sicherlich gibt es auch noch andere Schema F Konstrukte, dies sind allerdings die bei mir am häufigsten vorkommenden.

Weitere Informationen gibt es unter:
http://stackoverflow.com/questions/3659044/comparison-of-c-stl-collections-and-c-sharp-collections
http://stackoverflow.com/questions/6274878/what-is-c-time-t-equivalent-for-c-sharp

Rebuild of Invertika

Nach einigen Monaten ist es Zeit den Zwischenstand für den neuen Invertika Server und den Client vorzustellen. Invertika soll somit auf einer neuen technischen Basis stehen. Diese neue technische Basis sieht so aus, das der Server in C# geschrieben wird und somit unter Mono und .NET läuft. Für den Client ist eine Implementation als Webapplikation angedacht. Das ganze hatte dabei mehrere Gründe:

  • die Produktivität ist in C# höher als in C/C++
  • es können keine Speicherlöcher entstehen
  • durch die automatische Speicherverwaltung wird der Entwickler entlastet
  • modernes und konsistentes Framework
  • Anpassung auf eigene Bedürfnisse
  • schnellere Entwicklung
  • IPv6 Unterstützung ist problemlos möglich
  • bessere Unterstützung von mobilen Geräten

Neben diesen Gründen sind es auch einige Dinge wie „typedefs“ welche nicht unbedingt zum Verständnis beitrugen oder mehrere Klassen und Strukturen in einer Datei, welche das ganze ziemlich unübersichtlich machen. Auch die Abhängigkeit von zu vielen Bibliotheken wurde verringert.

Der Invertika Code in der Entwicklung

Nach einer kurzen Planungphase ging es dann am 3. Januar los mit der Entwicklung. Zuerst wurde damit begonnen den Accountserver zu portierten. Dabei wurden im Gegensatz zum Original einige Dinge verändern:

  • das Netzwerk setzt nun statt auf der Bibliothek „enet“ direkt auf TCP auf
  • PhysFS wurde wegrationalisiert

Am 13. Januar (einem Freitag ;)) waren die größten Portierungprobleme beim Accountserver gelöst und es wurde begonnen den Gameserver zu portieren. Am Gameserver ist die einzige größere Änderung die Anpassung der Skriptschnittstelle, damit diese mit den CLR Sprachen kompatibel ist. Die Roadmap für die Portierung sah dabei so aus:

  • Januar 2012: Implementation des Invertika Server
  • Februar 2012 Implementation des Invertika Clients
  • März 2012: Test der Software

Wie sich das für eine ordentliche Roadmap gehört wurde sie nicht eingehalten. So ist einiges noch nicht fertig und auch am Client muss noch viel getan werden. Der Client sollte ursprünglich auch in C# geschrieben werden und es wurde damit auch begonnen. Theoretisch ließe sich diese Clientvariante auf die Plattformen Windows, Linux, Mac OS X, iOS und Android bringen, praktisch ist es mit kleineren und größeren Problemen verbunden.

Ein generelles Problem an einem solchen Client ist, das er auf der jeweiligen Zielplattform erst installiert (oder auch kompiliert) werden und außerdem vom Nutzer aktuell gehalten werden muss. Schöner wäre es, wenn man diese Hürde aus dem Weg geschafft wird. Mittlerweile ist es dank Techniken wie Websockets, Webworkern und Canvas möglich, den Client komplett als Webapplikation zu schreiben.

Die Anfänge des neuen Clients basieren dabei auf der Techdemo „mana.js“ welche unter https://github.com/bjorn/mana.js zu finden ist. Der Vorteil der webbasierten Lösung ist dabei die große Kompatibilität mit unterschiedlichsten Geräten solange sie über einen aktuellen Browser verfügen.

Die Techdemo des Clients auf einem iPad

Während der Entwicklung bekamen die einzelnen Teile auch Namen die wie folgt lauten:

  • invertika (Client)
  • invertika-account (Accountserver)
  • invertika-game (Gameserver)

Der Quelltext sollte in den nächsten Tagen im Repository (http://source.invertika.org) erscheinen und zur Mitarbeit einladen ;)

Weitere Informationen gibt es unter:
http://invertika.org

GWEN.NET

Wenn man ein Spiel in OpenGL realisiert, hat man meist irgendwann das Problem das man auch Bedienelemente wie Menüs, Checkboxen, Textfelder etc. im Spiel haben möchte. Diese sollen dann natürlich auch noch Events erhalten und möglichst auch in OpenGL gezeichnet werden (da niemand z.B. GDI Objekte im OpenGL haben möchte).

Die GWEN.NET Beispielanwendung

Für .NET/Mono gibt es hierfür eine Portierung von GWEN welche GWEN.NET heist und unter http://code.google.com/p/gwen-dotnet/ zu finden ist. Diese arbeitet z.B. mit OpenTK zusammen. Das ganze ist dabei unter der MIT Lizenz verfügbar.

Weitere Informationen gibt es unter:
http://omeg.pl/blog/2011/07/the-quest-for-c-opengl-gui/

Prototypische Quelltextkonvertierung (C -> C#)

Bei der Portierung von C Quelltext ist man manchmal am überlegen wie man eine bestimmte Stelle wohl syntaktisch nach C# bringt. Möchte man eine automatische prototypische Quelltextkonvertierung für solche Sachen so sollte man sich mal die Webseite http://code2code.net/ anschauen.

Dort kann man C Quellcode eingeben und bekommt ihn in C# oder Visual Basic.NET zurück. Je nach Eingabedaten kann die Konvertierung dabei allerdings unterschiedlichster Qualität sein. Um das Nachdenken kommt man also nicht herum ;)