Sehr coole Sache für den schnellen Test einer Funktion.
Mit ‘.Net’ getaggte Artikel
Spaß mit Pex
Samstag, 26. Juni 2010.Net 4 und Microsoft Visual C# 2010 Express sind da
Montag, 12. April 2010Kompilieren, Verpacken und Hochladen
Montag, 29. März 2010Mit Hilfe folgenden PowerShell-Skriptes kann ich nun den FBK kompilieren, verpacken und auf den Webspace hochladen. Leider gibt es in PowerShell keine funktionierende ZIP-Klasse, so dass ich hier auf 7-Zip zurückgreife:
msbuild FBK.sln /property:Configuration=Release
Remove-Item Deliverable -Force -Recurse
New-Item -type directory -f DeliverableCopy-Item -Recurse FBK/src/bin/Release/ Deliverable/
& ‘C:/Program Files/7-Zip/7z.exe’ a Deliverable/Release.zip ./Deliverable/Release/
Write-Host "Benutzername: " -NoNewline
$user = Read-Host
Write-Host "Kennwort: " -NoNewline
$password = Read-Host
$currentDirectory = (Get-Item .).ToString()
$File = "$currentDirectory/Deliverable/Release.zip"
$ftp = "ftp://depon.net/htdocs/www.depon.net/downloads/fbk.zip"
$webclient = New-Object System.Net.WebClient
$webclient.Credentials = New-Object System.Net.NetworkCredential($user,$password)$uri = New-Object System.Uri($ftp)
"Uploading $File…"
$webclient.UploadFile($uri, $File)
Das Skript besteht im Prinzip aus vier Teilen:
- Mit Hilfe von msbuild wird die VisualStudio-Solution als Release kompiliert.
- Danach finden ein paar Umkopieraktionen statt
- Über das Kommandozeilen-Interface von 7-Zip wird das Release-Verzeichnis gezippt. Im späteren Schritt werde ich vermutlich auf die Ionic-Zip-Library zurückgreifen.
- Nach Abfrage der Kenndaten wird mit Hilfe der WebClient-Klasse das Zip auf den FTP-Webserver hochgeladen. Hier ist es auch schade, dass es kein PowerShell-Skript für den FTP-Upload gibt.
Mit einem Server-‘Gegenskript’ werde ich in Zukunft eine bestehende FBK-Instanz beenden, das ZIP-Archiv herunterladen, entpacken, an die richtige Stelle legen und das Spiel starten. Damit lassen sich die Deployment-Zeiten auf ein minimales Reduzieren.
Default values bei der Serialisierung
Sonntag, 15. November 2009Man nehme an, dass man folgendes Objekt besitzt:
[Serializable]
class Person
{
string name;
string prename;
}
Dieses Objekt wurde lange Zeit erfolgreich in einem Softwareprodukt genutzt und als Speichermedium wird die eingebaute .Net-Serialisierung genutzt (BinaryFormatter). Das Objekt wird mit den obigen zwei Eigenschaften gespeichert.
Auf Grund neuer Anforderungen erweitert man nun um eine Eigenschaft ‘age’, die den Standardwert ‘-1’ enthalten soll.
[Serializable]
class Person
{
string name;
string prename;
int age = –1;
}
Liest man nun eine schon vorhandene Serialisierung ein, so ist dieser Wert der serialisierten Objekte nicht auf –1 gesetzt worden, sondern auf 0. Der Grund liegt daran, dass die eingebauten Serialisierungsroutinen nicht den Standard-Konstruktur aufrufen.
Um nun einen Standard-Wert schreiben zu können, kann das OnDeserializing-Attribut verwendet werden. Die Klasse sieht nach der Verwendung folgendermaßen aus:
[Serializable]
class Person
{
string name;
string prename;
int age = –1;[OnDeserializing]
internal void OnDeserializing(StreamingContext s)
{
this.age = –1;
}
}
Diese Methode wird nun VOR der Deserialisierung aufgerufen und führt zu einem Setzen des Standard-Wertes.
Klassenbrowser als Kommandozeilenapplikation
Sonntag, 08. November 2009Um mir einen Überblick über die Namespaces, Klassen und Typen des FBK zu verschaffen, habe ich mir ein kleines Hilfsprogramm geschrieben. Dieses inspiziert eine Assembly und gibt das Ergebnis in verschiedenen Formaten aus:
- Als pure Textdatei
- Als Xml-Datei mit dem Schema: (assembly->class->(field|method|property)->Parameter)
- Als baumartige Xml-Datei, bei der jeder Namensraum einen eigenen Xml-Knoten darstellt und die Klassen darunter angezeigt werden.
Das Programm ist unter http://www.depon.net/downloads/classbrowser.zip herunterladbar und über Kommandozeile aufzurufen:
ClassBrowser.exe Input.dll
[-exportformat=xml|csv|xmlclasstree]
[-compilergenerated=yes|no]
[-onlyclasses=yes|no]
Input.dll
Der erste Parameter wird immer als einzulesende Assembly gewertet.-exportformat=xml|csv
Optionaler Parameter, der festlegt in welchem Format die Ausgabe
des Programmes auf Standard-Out durchgeführt werden soll.
Wird kein Format angegeben, so erfolgt die Ausgabe im Xml-Format.-compilergenerated=yes|no
Optionaler Parameter, der festlegt, ob Compilergenerierte Klassen
und Methoden mit dem CompilerGeneratedAttribute ebenfalls angezeigt
werden sollen.
-onlyclasses=yes|no
Optionaler Parameter, der festlegt, ob nur Klassen angezeigt werden
sollen.
Ein kleiner Screenshot der mit ‘xmlclasstree’ erzeugten Xml-Datei.
Debugger anfordern
Samstag, 26. September 2009Hin und wieder gibt es den Bedarf den Ablauf eines Programmes zu stoppen und in den Debugger zu springen. Visual Studio bietet hier die komfortable Möglichkeit der Haltepunkte (neudeutsch Breakpoints). Leider gibt es öfter Situationen, an denen ein einfacher Breakpoint nicht ausreicht. Dies ist insbesondere der Fall wenn die jeweilige Zeile 100fach ausgeführt wird, aber man nur bei einer bestimmten Nebenbedingung den Debugger auslösen möchte.
Diese Funktionalität nutze ich beim FBK. Wenn ich die Ausführung einer bestimmten Rolle testen möchte, trage ich in der Xml-Konfigurationsdatei das Attribut ‘debug’ ein.
<role type="mutateresources" id="BeerMutating" debug="True">
<input>
<resource type="Hop" amount="8" />
<resource type="Brewer" amount="8" />
</input>
<output>
<resource type="Beer" amount="8" />
</output>
<outputresearcheffects>
<researcheffect research="Brewery">
<multiplicator type="exponential"
factor="1"
base="1.1"
exponentoffset="0"
offset="0" />
</researcheffect>
</outputresearcheffects>
</role>
Wird diese Rolle nun ausgeführt, so hält Visual Studio die Ausführung an und ermöglicht ein einfaches Debuggen.
/// <summary>
/// Executes the role
/// </summary>
/// <param name="worldState">Current worldstate</param>
public void Execute(IWorldState worldState)
{
if (this.Role.IsDebug)
{
Debugger.Break();
}this.Role.ExecuteRole(this.RoleStatus, worldState);
}
Nettes Feature…
.Net 4 und dynamisch generierter Code
Mittwoch, 23. September 2009Generating Dynamic Methods with Expression Trees in Visual Studio 2010
Ein schönes Feature, ich freue mich drauf!
Die Existenz eines Objektes
Dienstag, 15. September 2009Wieviel Speicherplatz benötigt ein .Net-Objekt allein durch seine bloße Existenz?
- 32 Bit Systeme: 8 Bytes zzgl. 4 Bytes für die Referenzierung auf das Objekt (ohne die das Objekt vom GC vernichtet wird)
- 64 Bit Systeme: 16 Bytes zzgl. 8 Bytes für die Referenzierung
Aus dem Artikel:
Object Overhead: The Hidden .NET Memory Allocation Cost
For bulk in-memory data storage, swarms of small objects can push the cost up to unacceptable levels, especially on 64 bit systems.
Ein weiteres, schönes Video über die Interna von .Net: