Probleme mit OpenTK und .NET 4

Bei OpenTK handelt es sich um eine freie Toolkit Bilbiothek. Allerdings gibt es mit dieser ein Problem unter .NET 4. Dort stürzt das Control beim initialisieren eines OpenGL Kontextes ab. In diesem Fall liegt es wohl an den veränderten Sicherheitseinstellungen unter .NET 4.

Sobald man die „AssemblyInfo.cs“ um die Zeile:

[assembly: System.Security.SecurityRules(System.Security.SecurityRuleSet.Level1)]

ergänzt, funktioniert das ganze wieder. In neueren Versionen von OpenTK kann man dies über das Projekt aktivieren, indem man das Flag „NET40“ setzt.

Danach funktioniert das Anlegen des Kontextes wieder ohne Probleme.

Weitere Informationen gibt es unter:
http://www.opentk.com/node/1662
http://nl.wikipedia.org/wiki/OpenTK

Probleme beim Debuggen im Visual Studio / MonoDevelop

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

Probleme beim Einbinden einer Bibliothek unter .NET

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.

Visual Studio ignoriert die Haltepunkte beim Debuggen

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

UAC in .NET Anwendungen

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/