-
ACHTUNG - NEUES BLOG
Ab sofort steht unter http://devtyr.norberteder.com mein neues Blog zur Verfügung. Dieses Blog wird nicht weiter betreut, bleibt aber erhalten. Neue Eintr%auml;ge erfolgen nur mehr im neuen Blog. Kommentare werden ebenfalls nicht mehr behandelt. Wer weiterhin meinen Einträgen und Aktivitäten folgen möchte, möge bitte RSS-Feeds, Verlinkungen etc. an die neue Location anpassen.
|
C#: Entwicklung einer Notiz-Anwendung anhand eines Beispiels
19.07.07 - .NET, Grundlagen, Base Framework, WPF, Datenverwaltung, Visual Studio, Microsoft Office Beitrag von Norbert Eder| | Nachdem ich heute zufällig darüber gestolpert bin, möchte ich diese Artikel-Serie natürlich nicht vorenthalten. Worum geht es konkret:
StickOut ist eine Desktopanwendung für Kurznotizen mit Unterstützung für mehrere Benutzer und Integration in Outlook. Es handelt sich um eine Windows Forms-Anwendung für .NET Framework 2.0, bei der die Kommunikation mit anderen StickOut-Benutzern sowie der Austausch von Kurznotizen über .NET Remoting stattfindet. Der neue IPC-Kanal von .NET Framework 2.0 wird zur Kommunikation zwischen Microsoft Outlook und dem StickOut-Prozess verwendet. Mit dem Outlook-Add-In können Sie von beliebigen Outlook-Objekten Kurznotizen auf dem Desktop erstellen, einschließlich E-Mails, Notizen, Aufgaben, Terminen usw. Es wurde darauf geachtet, den Speicherbedarf einer .NET-Anwendungen maßgeblich zu verringern und einen zügigen und reibungslosen Umgang für den Benutzer zu gewährleisten. Dieser mehrteilige Artikel enthält einen Bericht über die Entstehung, beginnend mit meinem ersten Tag der Anwendungsplanung, hin zu allen nachfolgenden Entwurfs-, Entwicklungs-, Test- und Bereitstellungsphasen. Er zeigt die Fortentwicklung der Anwendung bis hin zu den Komplikationen, die bei den einzelnen Schritten aufgetreten sind. Sie erfahren vieles über .NET-Tricks, Bereitstellungs- und Versionskontrollprobleme, Visual Studio-Tricks und weitere nicht direkt auf die Entwicklung bezogene Tricks, die für Ihre tägliche Entwicklungsarbeit nützlich sein können.
Wer daran Interesse hat, hier die Links zu den einzelnen Teilen dieser Serie:
StickOut: Entstehung einer Kurznotiz-Anwendung in .NET 2.0, Teil 1
StickOut: Entstehung einer Kurznotiz-Anwendung in .NET 2.0, Teil 2
StickOut: Entstehung einer Kurznotiz-Anwendung in .NET 2.0, Teil 3
| | | 10 Kommentare
- 1382 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
C#: Schnell und generisch Objekte erstellen
19.07.07 - .NET, Grundlagen, Base Framework, Allerlei Beitrag von Norbert Eder| | Oft müssen Objekte dynamisch bzw. generisch erzeugt werden. In den meisten Fällen wird zu Activator.CreateInstance oder Activator.CreateInstance<> gegriffen. Die Erzeugung über den Activator ist jedoch nicht die schnellste. Einen wesentlich performantereren Ansatz liefern uns die FormatterServices. Hier eine Objekt-Erzeugungs-Klasse, welche beide Varianten implementiert:
public class ObjectGenerator
{
public T GenerateObject<T>()
{
return (T)FormatterServices.GetUninitializedObject(typeof(T));
}
public T ActivateObject<T>()
{
return (T)Activator.CreateInstance<T>();
}
}
Erzeugen wir und für jede Variante in einer Schleife 10.000 Objekte, sehen wir eine kleine Überraschung. Zuerst der Code:
ObjectGenerator og = new ObjectGenerator();
Stopwatch sw = new Stopwatch();
Console.Write("Generate Object [Formatter]: ");
sw.Start();
for (int i = 0; i < 10000; i++)
{
TestClass tc = og.GenerateObject<TestClass>();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Reset();
Console.Write("Generate Object [Activator]: ");
sw.Start();
for (int i = 0; i < 10000; i++)
{
TestClass tc = og.ActivateObject<TestClass>();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadKey();
Nun die Überraschung:
Generate Object [Formatter]: 3
Generate Object [Activator]: 21
Und jetzt kommt der eigentliche Clou: Mit Hilfe von FormatterServices.GetUninitializedObject ist es möglich Objekte von Klassen mit privaten Konstruktoren (kein öffentlicher Konstruktor vorhanden!!) zu erstellen. Hier eine Beispielklasse:
public class TestClass
{
private TestClass() { }
public string GetMessage()
{
return "This is a message";
}
}
Diese kann mit GetUninitializedObject instantiiert werden, wogegen CreateInstance eine MissingMethodException wirft und uns darauf aufmerksam macht:
Für dieses Objekt wurde kein parameterloser Konstruktor definiert.
Einsatzmöglichkeiten dafür werden sich sicherlich für manche finden.
| | | 6 Kommentare
- 4642 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Tool: XmlExplorer
17.07.07 - Tools, 3rd Party Tools Beitrag von Norbert Eder| | Wer beispielsweise das XML Notepad verwendet, der sollte zusätzlich einen Blick auf den XML Explorer werfen. Vor allem im Vergleich zum XML Notepad kann dieses Tool mit einer wesentlich besseren Performance, als auch mit weniger Speicherverbrauch aufwarten. Allerdings fehlt die Editierfunktion. Es ist jedoch wunderbar geeignet, eine XML Datei in einer Baumstruktur anzeigen zu lassen. Zudem sind einige hilfreiche Funktionen inkludiert. Einfach mal ansehen.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Live Blog online
16.07.07 - Blog-Intern, Tools, Kunterbunt Beitrag von Norbert Eder| | Seit heute steht mein neues Blog zum Thema Windows Live online zur Verfügung. Hierauf wird es viele Informationen rund um alle Windows Live Produkte geben. Dies betrifft nicht nur News, sondern auch Erweiterungsmöglichkeiten, FAQs und sonstige Hilfen.
Einfach ansehen: Live Blog
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Extreme World of Warcraft Spieler
15.07.07 | | Eigentlich passt es ja so nicht ganz in mein Blog, aber das muss ich wohl oder übel mit euch teilen. Selbst hatte ich World of Warcraft gespielt, aber dann doch aus Zeitgründen aufgegeben (schließlich hat man ja mehr als genug zu arbeiten).
Andere Personen bauen ihre Leidenschaft hingegen aber eher aus und leben wohl nur mehr für's Spielen.
World of Warcraft Zocker mit 46 (!!!) Chars.
Schon etwas krank. Gefunden hier
Edit: Ich habe mir das ein wenig durchgerechnet, um ein wenig mehr Informationen über die genauen Kosten zu erhalten. Grundlegend müsste es ja so sein, dass man pro Account zwar mehrere Character verwalten kann. Es kann derselbe Account jedoch immer nur einmal angemeldet sein. Bei 46 Rechnern liegt es hier also nahe, dass es sich um 46 Accounts handelt. Daher auch 46 Mal im Monat dieselbe Gebühr fällig wird.
Anschaffungskosten: 46 * 50 Euro = 2.300 Euro
Monatliche Kosten: 46 * 10,99 Euro = 505, 54 Euro (bei 6 mtl. Zahlung)
Gehen wir nun weiters davon aus, dass ein Rechner eine Mindestleistung erbringen muss, damit darauf WOW gespielt werden kann, dann können wir wohl pro Rechner mit ca. 1.200 Euro rechnen. Das wären dann insgesamt 55.200 Euro. Der restliche Rechner wird wohl ein alter Rechner sein, der vielleicht noch für Emails etc. verwendet wird ;-)
Daraus ergibt sich folgender Schluss: Entweder haben die SEHR viel Geld und ebenso viel Zeit um dieses Geld zu verbrauchen, oder es steht eindeutig ein Sponsor dahinter, um ein wenig durch die Medien zu gehen.
| | | 6 Kommentare
- 803 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
.NET BlogBook Ausgabe 3 veröffentlicht
14.07.07 - .NET, Grundlagen, Base Framework, ASP.NET, Visual Studio, Allerlei, SQL Server, Internet, Community Beitrag von Norbert Eder| | Soeben wurde das .NET BlogBook in der Version 3 (oder auch Ausgabe genannt) veröffentlicht. In dieser Ausgabe wurden zahlreiche Unstimmigkeiten und Fehler bereinigt, als auch die Lesbarkeit weiter erhöht. Durch zahlreiche Rückmeldungen von Lesern konnten wir sie weiter an die Bedürfnisse der Leser anpassen.
Wir hoffen auch dieses Mal auf eine positive Resonanz und würden uns über konstruktive Kritik und Meinungen freuen.
Zu finden gibt es das Buch auf der .NET BlogBook Projektseite.
| | | 4 Kommentare
- 1016 mal angesehen
| 1 Trackbacks
| Permalink | Trackback-URL |
C#: BinaryFormatter, SerializationException und dynamisch geladene Assemblies
12.07.07 - .NET, Grundlagen, Base Framework Beitrag von Norbert Eder| | Zwei Solutions. In der ersten Solution befindet sich eine Windows Forms Anwendung. Diese referenziert eine Assembly aus der zweiten Solution. In der zweiten Solution befindet sich eine Konsolen-Anwendung, welche eben erwähnte Assembly per Assembly.GetAssembly lädt. Zu erwähnen sei ebenfalls, dass folgende Klassen enthalten sind:
- Datenklassen (diese werden serialisiert)
- Commands (siehe Command Pattern)
Nun gut. In der Windows Forms Anwendung werden die einzelnen Commands konfiguriert, und per BinaryFormatter serialisiert. Dabei ergibt sich jedoch ein kleines Problem:
Da die Konfigurationen in der Windows Forms Anwendung serialisiert wurden (hierzu muss angemerkt werden, dass sich die Klasse, welche die Konfigurationen liest und auch wieder schreibt nicht in der besagten Assembly befindet) und in der zweiten Solution (mit der Konsolen-Anwendung) dynamisch geladen werden sollte, wurde eine SerializationException geworfen. Beim Binary-Formatter wird unter anderem die genaue Assembly-Bezeichnung, Versionsnummer etc. hinterlegt, die zwar in diesem Fall zusammenpassen würde, aber dennoch konnten die entsprechenden Typen nicht gefunden werden (Referenz war gesetzt, Assembly wurde in die aktuelle AppDomain geladen).
Ein Ausweg ist hierbei das Setzen der Eigenschaft Binder des BinaryFormatters. Durch eine Ableitung der Klasse SerializationBinder kann das Verhalten, wie Typen geladen bzw. gefunden werden, selbst beeinflusst werden. In meinem Fall habe ich folgendes fabriziert, was dann auch wunderbar funktionierte:
public class Binder : SerializationBinder
{
public override Type
BindToType(string assemblyName, string typeName)
{
Type type = null;
string shortAssem = assemblyName.Split(',')[0];
Assembly[] assemblies =
AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assem in assemblies)
{
if (shortAssem == assem.FullName.Split(',')[0])
{
type = assem.GetType(typeName);
break;
}
}
return type;
}
}
Wer weiterführende Informationen diesbezüglich benötigt wird entweder via Google fündig, oder stellt seine Frage einfach als Kommentar. Ich versuche diese dann zu beantworten.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Hallo HSDPA
12.07.07 - Internet, Kunterbunt Beitrag von Norbert Eder| | Ab sofort kann auch ich behaupten: "Isch haben HSDPA". HSDPA ist kein Begriff? Dann einfach kurz nachschlagen. Funktioniert anscheinend wunderbar, Übertragungsrate beim ersten Test sensationell, so gesehen bin ich derzeit hoch erfreut. Mal sehen wie lange es anhält.
Zwar ist es nicht ganz günstig, aber es hat immerhin einige Vorteile, wenn man unterwegs ist. So kann man dann doch schnell mal eben etwas herzeigen, etwas suchen, oder Gespräche über diverse Messenger führen.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Community: Codegod.de mit .NET Chat
12.07.07 - .NET, Allerlei, Internet, Community Beitrag von Norbert Eder| | Matthias Pieroth hat vor einiger Zeit auf Codegod.de einen .NET Chat gestartet. Darin kann sich jeder unbeschwert über sämtliche .NET Themen unterhalten. Erforderlich ist lediglich ein gültiger Account auf Codegod. Sofern es meine Zeit erlaubt, werde ich auch das eine oder andere Mal online zur Verfügung stehen.
Viel Spaß!
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Die Falle UnauthorizedAccessException
12.07.07 - .NET, Allerlei Beitrag von Norbert Eder| | Wie es mir gerade passiert ist, sollte man sich durch das Unauthorized in der Exception nicht täuschen lassen. Unauthorized sollte mit unbefugt übersetzt werden, anstatt mit unberechtigt. Wie es mir eben ging, war eine Datei, die gelöscht werden sollte, als Read Only gesetzt, wodurch diese Ausnahme geworfen wurde.
Dummes Übersetzungsproblem, lange Suche.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL | Zurück Weiter
|
|
|
|
|
|
|