Bei einem C# Projekt von mir, welches ich in Visual Studio und MonoDevelop bearbeite, gab es einige Probleme mit dem debuggen. Unter MonoDevelop reichte es die Hauptklasse anzugeben, so das er in diese springen konnte.
Bei Visual Studio fruchtete dies leider nicht. Dort stellt sich die Frage ob es eventuell eine Inkompatibilität zwischen den Projektdateien gibt. Hier ist wohl weitere Forschung nötig.
Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/MonoDevelop
http://de.wikipedia.org/wiki/Visual_Studio
Man nehme eine .NET/Mono Bibliothek welche als Zielframework .NET 4 benutzt. Nun erstelle man noch eine neue Anwendung und binde in diese Anwendung besagte Bibliothek ein. Nun kann es vorkommen das man beim kompilieren der Anwendung folgende Fehlermeldung bekommt:
The type or namespace name 'FooBar' could not be found (are you missing a using directive or an assembly reference?)
Augenscheinlich hat man eine Referenz vergessen. Zumindest könnte man genau dies bei der entsprechenden Meldung denken. Allerdings ist das ganze in diesem Fall ein Stück gemeiner. Die neu erstellte .NET Anwendung hat als „Target Framework“ nicht „.NET 4 Framework“ eingestellt, sondern „.NET 4 Framework Client Profile“.
Und diesem Profil fehlen ein paar Assemblyreferenzen und wenn man Pech hat benötigt eine Bibliothek genau diese. Hier hilft es dann einfach das „Target Framework“ auf „.NET 4 Framework“ zu stellen. Danach sollte es dann ohne Probleme funktionieren.
Manchmal kann einen die Softwareentwicklung schon in den Wahnsinn treiben, vor allem wenn es um triviale Dinge geht. So sollte es ja eigentlich selbstverständlich sein, das der Debugger an einem Haltepunkt hält. Mein erster Gedanke war, das es daran liegt das ich das Projekt im Debugmodus auf „Any CPU“ eingestellt habe. Sobald ich es auf „x86“ oder „x64“ gestellt habe, hielt der Debugger an der gewünschten Stelle. Allerdings hatte ich ein ähnliches Projekt mit fast den selben Einstellungen (auch „Any CPU“), doch dort funktionierte es mit dem Debugger. Also sollte es ein Vergleich der Projektdateien richten. Nach einiger Zeit war hier auch kein Erfolg zu melden.
Beim Starten des Projektes fiel mir allerdings auf das die Haltepunkte ausgeblendet wurden:
Im Tooltip zu den Haltepunkten stand dann:
No symbols have been loaded for this document
Dies brachte mich dazu in das „bin/Debug“ Verzeichnis zu schauen und siehe da, es gab keine pdb Dateien für das Projekt. Um die pdb Dateien für das Projekt anzulegen, geht man in die Projekteinstellungen, dort auf „Build“ und dann auf „Advanced“.
In dem sich darauf öffnenden Dialog stellt man die „Debug info“ auf „full“. Damit sollten die PDB Dateien erzeugt werden und das debuggen wieder funktionieren.
Weitere Informationen gibt es unter:
http://en.wikipedia.org/wiki/Program_database
http://msdn.microsoft.com/en-us/library/yd4f8bd1%28v=vs.71%29.aspx
http://geekswithblogs.net/dbutscher/archive/2007/06/26/113472.aspx
http://www.wintellect.com/CS/blogs/jrobbins/archive/2009/05/11/pdb-files-what-every-developer-must-know.aspx
Eine gewöhnliche .NET Anwendung benötigt keine Administratorrechte und bekommt diese meist auch nicht. Doch was wenn man doch mal solche Rechte benötigt um z.B. die Zuordnungen zu einem Dateiformat in der Registry vornehmen zu können? Unter XP ist dies kein Problem da der Nutzer dort meist mit Administratorrechten unterwegs ist. Unter Windows Vista und höher muss man diese Rechte allerdings anfordern.
Leider ist es nicht möglich, sich diese Rechte nur für eine bestimmte Funktion anzufordern. Entweder man holt sie sich die Rechte (per Manifest Datei) für die ganze Anwendung oder gar nicht. Bei der Anforderung der Rechte für die ganze Anwendung wird man von Windows jedesmal gefragt ob man die entsprechende Anwendung mit Administratorrechten starten möchte, was natürlich unschön ist.
Eine weitere Möglichkeit ist es für die Fälle welche administrative Rechte benötigen eine extra Anwendung zu schreiben, welche dann z.B. die Dateierweiterungen registriert. Der Vorteil dieser Variante ist es, das man nur nach den entsprechenden Rechten gefragt wird, wenn es nötig ist. Diese Variante kann man nun auch ausbauen, indem man keine Fremdanwendung aufruft, sondern sich selber mit ein paar Kommandozeilenparametern:
ProcessStartInfo processInfo=new ProcessStartInfo(); processInfo.Verb="runas"; processInfo.FileName=FileSystem.ApplicationPathWithFilename; processInfo.Arguments="-reg:.bat;.xml"; Process.Start(processInfo);
In der Program.cs wertet man diese Argumente dann in der
static void Main(string[] args)
aus und führt die entsprechende Aktion aus. Danach beendet man die Anwendung gleich wieder. Somit kann man die Teile welche solche Rechte benötigen in der eigenen Anwendung „auslagern“.
Weitere Informationen gibt es unter:
http://www.vbarchiv.net/workshop/workshop_115.html
http://victorhurdugaci.com/using-uac-with-c-part-1/
http://victorhurdugaci.com/using-uac-with-c-part-2/
http://victorhurdugaci.com/using-uac-with-c-part-3/
Wenn man in MonoDevelop eine GTK# Anwendung schreibt und sie zwingt auf „jeder CPU“ zu laufen so wird diese Anwendung beim Start abstürzten. Meist sieht das dann so aus:
Unbehandelte Ausnahme: System.TypeInitializationException: Der Typeninitialisierer für "Gtk.Application" hat eine Ausnahme verursacht. System.BadImageFormatException: Es wurde versucht, eine Datei mit einem falschen Format zu laden. (Ausnahme von HRESULT: 0x8007000B) bei GLib.Thread.glibsharp_g_thread_supported() bei GLib.Thread.get_Supported() bei Gtk.Application..cctor() --- Ende der internen Ausnahmestapelüberwachung --- bei Gtk.Application.Init() bei testapp.MainClass.Main(String[] args) in d:\testapp\Main.cs:Zeile 10.
Das Problem ist wohl das es noch keine x64 GTK# Bibliothek für Windows gibt. Aus diesem Grund sollte man seine Assemblys auf x86 stellen, dann klappt es auch mit Windows 7.
Weitere Informationen gibt es unter:
http://mono.1490590.n4.nabble.com/windows-7-x64-and-gtk-app-td1516626.html
Auf Sourceforge gibt es das Projekt Midi Sheet Music (http://sourceforge.net/projects/midisheetmusic/, http://midisheetmusic.sourceforge.net/). Dabei handelt es sich um eine Software in welche man eine MIDI Datei einladen kann und anschließend eine Notenansicht bekommt. Beim Abspielen zeigt die Software dann an welche Tasten(kombinationen) für welche Noten gespielt werden müssen. Die Software läuft dabei auf Windows, Linux und MacOS, ist in C# geschrieben und steht unter der GPL.
Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/MIDI
Wenn man größere Anwendungen schreibt, so haben diese meist eine Undo & Redofunktion. Damit man das Rad nicht neu erfinden muss, gibt es sogenannte Undo Frameworks. Ein schönes Framework für .NET ist das Undo Framework welches unter http://undo.codeplex.com/ zu finden ist. Es basiert dabei auf dem Entwürfsmuster Kommando (http://de.wikipedia.org/wiki/Kommando_%28Entwurfsmuster%29) und ist relativ einfach zu benutzen.
Weitere Informationen gibt es unter:
http://blogs.msdn.com/b/kirillosenkov/archive/2009/06/29/new-codeplex-project-a-simple-undo-redo-framework.aspx
http://blogs.msdn.com/b/kirillosenkov/archive/2009/07/02/samples-for-the-undo-framework.aspx
Man nehme folgendes Stück C# Quelltext:
HashSet test=new HashSet();
Das Problem an einem solchen HashSet ist, das man nicht mittels eines Indicies auf dieses zugreifen können. Die Zeile:
string tmp=test[5];
würde also nicht funktionieren. Abhilfe schafft hier die Klasse SortedSet:
SortedSettest=new SortedSet();
Nun kann man mittels ElementAt über einen Indice selektiert werden:
string tmp=test.ElementAt(5);
Wichtig ist dabei das der Namesspace System.Linq eingebunden ist da diese Funktionalität über eine Extension implementiert wird.
In .NET/Mono kann man ja eine Variable nach ihrem Typ fragen:
bool test=true; test.GetType().FullName;
Die FullName Eigenschaft gibt dabei einen String mit der Bezeichnung des Datentypes zurück. Da ich ab und an eine Liste dieser „Fullnames“ benötigt, gibt es das ganze nun hier:
- bool -> Boolean-> System.Boolean
- byte -> Byte -> System.Byte
- DateTime -> DateTime -> System.DateTime
- double -> Double -> System.Double
- int -> Int32 -> System.Int32
- long -> Int64 -> System.Int64
- short -> Int16 -> System.Int16
- string -> String -> System.String
- uint -> UInt32 -> System.UInt32
- ulong -> UInt64 -> System.UInt64
- ushort -> UInt16 -> System.UInt16
Es handelt sich dabei jeweils um den C# Alias, die .NET Bezeichnung und den Fullname.
Obfuscatoren für .NET gibt es einige, die teuersten kosten bis zu 4000 $, die günstigeren so um die 300 - 700 $. Es gibt aber auch die Preisklasse Null. In der Open Source Liga gibt es dabei zwei (soweit ich das entdeckt habe) Anwendungen:
- Confuser (http://confuser.codeplex.com)
- obfuscar (http://code.google.com/p/obfuscar/)
Das Problem an diesen beiden Programmen ist das sie mit meinem .NET 4 Assemblies nicht funktionieren. Also schaute ich mich nach einer Alternative um und bin auf EazFuscator.net gestoßen. Diese Software ist Freeware, einfach zu bedienen, exzellent dokumentiert und sie funktioniert einfach. Zu finden ist die Software dabei unter http://www.foss.kharkov.ua/g1/projects/eazfuscator/dotnet/Default.aspx. Sie lässt sich auch in Visual Studio Projekt integrieren.
Weitere Informationen gibt es unter:
http://de.wikipedia.org/wiki/Obfuscator
http://stackoverflow.com/questions/805549/free-obfuscation-tools-for-net
Ich stelle vor ein paar Tagen ein .NET Projekt von .NET 2 auf .NET 4 um. An dem Projekt hingen einige Bibliotheken welche weiterhin auf .NET 2 basierten (und dies auch weiterhin tun sollen). Nach der Umstellung ergab sich nun das Problem, das ich die Anwendung nicht mehr mit dem Debugger starten konnte.
Das Problem hängt dabei damit zusammen das das Visual Studio für .NET 1 bis .NET 3.5 sowie für .NET 4 jeweils eine eigene Debugengine benutzt. Um das Problem zu umgehen schaltete ich in den Projekteigenschaften unter Debug den Eintrag Enable the Visual Studio hosting process aus. Danach konnte ich auch mit dem gemischten Projekt wieder debuggen.
Weitere Informationen gibt es unter:
http://blogs.msdn.com/b/debugger/archive/2010/04/30/can-t-hit-breakpoints-in-a-plug-in-or-can-t-debug-net-2-0-3-0-3-5-from-a-mixed-mode-exe-project-with-visual-studio-2010.aspx
Wenn man ein Zahl unter .NET speichern (bzw. mit ihr arbeiten) möchte kann man einen Int benutzen. Sollte die Zahl größer werden könnte man einen Int64 nehmen. Doch was wenn die Zahlen noch größer werden? Für diesen Fall gibt es seid .NET 4 eine Klasse namens BigInteger welche sich im Namespace System.Numerics befindet:
BigInteger bigNumber=BigInteger.Parse("998877665544332211");
bigNumber+=1001;
bigNumber*=2;
MessageBox.Show(bigNumber.ToString());
Damit sind dann auch sehr große Zahlen kein Problem
Für ein Windows Forms Menü wollte ich einen Shortcut key (für die MFC kundigen auch Accelerator genannt) setzen. Das funktioniert im Normalfall auch immer ohne Probleme. Nur bei den Tasten Keys.NumPad0 - Keys.NumPad9 funktioniert das nicht.
Auch eine manuelle Zuweisung:
topToolStripMenuItem.ShortcutKeys = Keys.NumPad5;
schlägt mit einer Exception fehl. Der Trick hier ist es die nummerischen Tasten des Numpad immer mit Strg oder Alt zu benutzen. So ist es ohne Probleme möglich dem Menüpunkt den Shortcut key Alt + Numpad 5 zuzuweisen. Ich tippe mal das hängt bei diesen Tasten mit der Doppelbelegung (Num aus/an) zusammen.
Der freie Passwortmanager KeePass ist vor kurzem in der neuen Version 2.16 erschienen. Im Gegensatz zu 1er Serie ist die 2er Serie komplett neugeschrieben worden und basiert auf .NET bzw. Mono. Sie läuft somit ohne Probleme auch unter Linux. Damit kann der Manager auch plattformübergreifend eingesetzt werden. Die Software steht dabei unter GPLv2 und kann unter http://keepass.info/download.html bezogen werden.
Es gibt unter http://code.google.com/p/lib3ds/ ein Google Code Projekt welches eine Bibliothek zum lesen und schreiben von 3DS implementiert. Leider gab es bis vor kurzem keine freie 3DS Bibliothek für .NET respektive Mono. Nun gibt es unter http://code.google.com/p/lib3dsnet/ eine Portierung der lib3ds, welche wie das Original unter LGPL steht.
Die Bibliothek unterstützt dabei nicht nur das lesen und schreiben, sondern auch alle möglichen Arten von 3DS Nodes wie Kameras oder Meshes. Auch die Transformation der Objekte zueinander wird in dieser Bibliothek vorgenommen. In Grenzen kommt lib3ds.Net auch mit defekten 3DS Dateien zurecht. Nach den ersten Tests funktioniert die Bibliothek tadellos
Weitere Informationen gibt es unter:
http://en.wikipedia.org/wiki/.3ds


