Archive for the ‘Softwareentwicklung’ Category

Einschränkungen beim Debuggen mit mixed moded Anwendungen im 64-Bit Modus

Sunday, June 27th, 2010

Hallo,

kürzlich bekam ich vom Visual Studio 2010 Debugger beim Starten einer Anwendung folgende Fehlermeldung:

—————————
Microsoft Visual Studio
—————————
Fehler beim Ausführen des Projekts: Das Programm “…\unittest\bin\Debug\unittest.exe” kann nicht gestartet werden.

Das Debuggen im gemischten Modus für x64-Prozesse wird nur bei Verwendung von Microsoft .NET Framework vor Version 4 unterstützt.
—————————
OK   Hilfe
————————–

Die Konstellation war dabei folgende:

  • Ein reines C#-Programm referenziert eine Assembly, die mit managed C++ erstellt war. Diese Assembly bindet auch native code ein (mixed mode).
  • Als Compiler wurde der vc90 verwendet.
  • Als Targetversion für das .NET-Framework wurde für alle Komponenten 2.0 verwendet.
  • Alle Anwendungen waren als 32-Bit-Anwendungen in Visual Studio 2008 erstellt und wurden von Visual Studio 2010 zur Version 2010 konvertiert.

Für die in C# erstellte (reine .NET) Anwendung war in den Einstellungen als Zielplattform “Any CPU” eingetragen, wie bereits in der Vorgängerversion:

AnyCPU

Nach der Umstellung auf X86 konnte die Anwendung erfolgreich im Debugger gestartet werden.

X86

Die Fehlermeldung ist grundsätzlich ziemlich irreführend. Alle beteiligten Komponenten waren ja explizit für .NET 2.0 konfiguriert.

Oder ist sie gar falsch?

Auf dieser Seite findet man folgendes Zitat:

Debugging im gemischten Modus (Aufrufe von systemeigenem Code bis zu verwalteten Codes, oder umgekehrt) wird für x64-Prozesse unterstützt, wenn der verwaltete Code Microsoft .NET Framework, Version 4 oder höher, verwendet.

Debugging im gemischten Modus wird nicht für IA64-Prozesse oder x64-Prozesse unterstützt, die frühere .NET Framework-Versionen als 4 verwenden.

was ja ein klarer Gegensatz zur oben zitieren Fehlermeldung ist.

Grundsätzlich ist es schon etwas unschön, wenn man für die reine .NET-Komponent nicht mehr “Any CPU” wählen kann, nur weil sie eine mixed mode Assembly nutzt, die im 32-Bit Modus erstellt wurde.

Eine Rolle könnte auch spielen, dass ich inzwischen Windows 7 x64 benutze, während ich zuvor Windows XP X86 verwendet habe.

Viele Grüße,
Andreas

Technorati Tags: , ,


Visual C++ 2010 kann nur für das .NET Framework 4.0 Code erzeugen

Sunday, June 20th, 2010

Hallo,

vor einiger Zeit bin ich zu dem Schluss gekommen, meine Entwicklungsumgebung auf Basis von Windows 7 und Visual Studio 2010 neu aufzusetzen. Nach der Konvertierung der C++ Projekte wurde in einer Solution mit C# und C++ Projekten folgende Warnung ausgegeben:

Warnung    2    Auf das Projekt “xxx” kann nicht verwiesen werden.  Das Projekt, auf das verwiesen wird, hat eine höhere Frameworkversion (”4.0″) als Ziel.

In der ursprünglichen Solution war für alle Projekt das .NET Framework 2.0 als Targetversion eingetragen. Das war aus gutem Grund so, da die erstellte Anwendung für den Download über das Internet bereit gestellt wird und auf möglichst vielen Computern ohne weitere Vorbereitungen eingesetzt werden soll.

Eine Erklärung für die implizite Erhöhung der Targetversion für Managed C++ Projekte finden sich in diesem Blog-Eintrag mit einem “Visual Studio 2010 C++ Project Upgrade Guide”:

After conversion, managed C++ projects will target the 4.0 Framework by default.  The reason behind this design is that the VS2010 compiler cannot target Framework 2.0, 3.0 or 3.5. The VS2008 compiler must be used to target 2.0, 3.0 or 3.5. To make the converted C++ application build out of box, we decided to move the TargetFrameWorkVersion to 4.0 by default for C++ applications.

Oops! Mit Visual Studio 2010 können keine Managed C++ Anwendungen für .NET Framework Versionen < 4.0 erstellt werden!

Dagegen hilft nur eines:

The VS2008 compiler must be used to target 2.0, 3.0 or 3.5.

D.h. man ist gezwungen, Visual C++ 2008 zusätzlich zu installieren, wenn man Managed C++ Komponenten erstellen will, die .NET Frameworks < 4.0 als Target haben. Die Änderung der Zielversion geht noch nicht mal in der IDE sondern nur durch Änderung der Projektdateien in einem Editor.

Ich betrachte das als erhebliche Einschränkung, da man in diesem Fall Visual Studio 2008 zusätzlich installieren (und ggf. kaufen) muss, sondern dann auch die schönen neuen C++ Features des Compilers nicht mehr nutzen kann.

Generell habe ich den Eindruck, dass Microsoft sich mit Visual Studio 2010 etwas übernommen hat, und irgendwann einfach die Produktfreigabe beschlossen hat, obwohl es noch viele Probleme und Einschränkungen gab (z.B. wie im obigen Blog-Eintrag beschrieben, oder das Fehlen von Intellisense für Managed C++ oder die unscharfe Erscheinung der Default-Fonts auf manchen Betriebsystemen oder der erhöhte Speicherbedarf  oder das aus nicht nachvollziehbaren Gründen umgestellte Hilfesystem, das jetzt eigentlich unbrauchbar ist.).

Auf der Haben-Seite steht für mich ganz klar der neu implementierte Support für Intellisense (bei native C++ Projekten). Das funktioniert jetzt viel besser als mit Visual C++ und verbessert die Produktivität spürbar.

Viele Grüße,
Andreas

Technorati Tags:

DoDragDrop und SelectedNode in WinForms TreeViews

Monday, November 30th, 2009

Hallo,

kürzlich fiel mir ein überraschender Effekt im Zusammenhang mit WinForms TreeViews und drag and drop auf. Fall man im MouseDown-Event eine DragDrop-Operation mit der Methode DoDragDrop() startet, wird der selektierte Knoten nicht auf den angeklickten Knoten gesetzt.

In folgendem Beispiel wurde der Knoten “BasicActivities” angeklickt und damit zum selected node. Anschließend wurde der Knoten ActivityFinalNode angeklickt. Der Focus-ähnliche Rahmen um den Knoten “BasicActivities” blieb aber erhalten:

SelektierterKnotenFalsch

Das hat zur Konsequenz, dass der zuvor selektierte Knoten “BasicActivities” nach einer anschließenden Mousebewegung ohne click wieder selektiert wird.

Dieses Verhalten tritt nicht auf, wenn der Aufruf der Methode DoDragDrop() unterbleibt.

Wenn man den Knoten im MouseDown-Event explizit selektiert (wie hier beschrieben), tritt dieser Effekt nicht auf und das TreeView verhält sich wie gewohnt.

theTreeView.SelectedNode = nodeAt;
DoDragDrop(nodeAt.TheClass, DragDropEffects.Copy);

Viele Grüße,
Andreas

Technorati Tags: ,

Bitte aktivieren Sie JavaScript…wofür eigentlich?

Tuesday, June 23rd, 2009

Hallo,

nachdem mich das Finanzamt an die Abgabe der Steuererklärung erinnert hat, habe ich mein Wiso Sparbuch 2009 gestartet und natürlich die schöne Suche nach Aktualisierungen gestartet.
Nach kurzer Zeit erscheint die Meldung:

Sie haben JavaScript deaktiviert. Damit sind wichtige Funktionen dieses Programms nicht verfügbar.
Weitere Informationen zu JavaScript und wie Sie JavaScript aktivieren finden Sie hier.

Bitte aktivieren Sie JavaScript und starten das Programm dann erneut.

Was soll denn bitte diese Meldung? Ich habe eine FAT Client Anwendung zur Abgabe meiner Steuererklärung gestartet. Wo und wie soll ich denn nun JavaScript aktivieren?
(Wer nun denkt, in obiger Meldung wäre “hier” ein Link, den muss ich enttäuschen)

Hallo Ihr Buhl-Programmierer! Schon mal daran gedacht, dass Ihre Software vielleicht von Personen eingesetzt wird, die mit einer solchen Meldung nicht zurechtkommen? Oder von Personen, die keine Lust haben ihren PC in einen Bot voller Malware zu transformieren?

Um dem Ganzen noch die Krone aufzusetzen, startet beim Klick auf den Link “Support” in obigem Dialog der Internet Explorer, obwohl ich den Firefox als Standardbrowser konfiguriert habe. Und die Suche in der Hilfe geht nicht ohne…JavaScript.

Aber als Entwickler einer Software zur Abgabe von optional verschlüsselten Steuererklärungen hat man mit Themen wie Vertraulichkeit und Sicherheit natürlich überhaupt nichts zu tun.

Unnötig zu erwähnen, dass bis zur letztjährigen Ausgabe der Update-Mechanismus von Wiso-Sparbuch auch ohne JavaScript funktioniert hat.

Ach und noch etwas, Windows 7 kommt in Europa ohne Browser auf den Markt…

Viele Grüße,
Andreas

Technorati Tags: ,

Prüfen auf Schreibrechte für eine Datei in C#

Saturday, February 28th, 2009

Hallo,

manchmal möchte man wissen, ob ein bestimmter Benutzer bestimmte Rechte (z.B. Schreibrechte) für eine bestimmte Datei besitzt. Wie sich herausstellt, ist diese Anforderung alles andere als leicht umzusetzen, weil dabei viele verschiedene Aspekte eine Rolle spielen. Die Vorgehensweise sieht prinzipiell so aus:

  • Abfragen der Access Control Listen für die Datei
  • Itererieren über alle Einträge und prüfen ob man für die Kennung oder die Gruppe des gewünschten Benutzers Einträge findet
  • Dabei die Präzedenz der Einträge beachten (explizite kommen vor vererbten Regeln, “Deny”-Regeln kommen for “Allow”-Regeln)

Den nicht unerheblichen Code hat dankenswerterweise Bruce Hatt in einem Artikel auf CodeProject.com veröffentlicht.

Man sollte bedenken, dass die Möglichkeit in eine Datei zu schreiben zusätzlich durch das “ReadOnly-flag” und die .NET Code Access Security eingeschränkt sein könnte. Beides wird in dieser Klasse nicht berücksichtigt.

Die Prüfung auf das ReadOnly-flag könnte man so schreiben:

FileAttributes attrs = File.GetAttributes(fileName);
 
if ((attrs &amp; FileAttributes.ReadOnly) != 0)
{
    readOnly = true;
}

Und für die Prüfung im Rahmen der CAS könnte man folgenden Code verwenden:

FileIOPermission fp = new FileIOPermission(FileIOPermissionAccess.Write, fileName);
try
{
    fp.Demand();
}
 
catch (SecurityException)
{
    readOnly = true;
}

Wenn es nur um die Prüfung auf Schreibrechte geht, hört man oft den Vorschlag, einfach den Schreibvorgang auszuführen und ggf. die geworfene Exception zu fangen. Dieser Vorschlag ist aber nicht immer geeignet. In meinem Fall war es so, dass ich an einer Anwendung arbeite, in der Dateien editiert werden können. Falls Dateien nicht geschrieben werden können, soll dies visualisiert werden. Man möchte aber vermeiden, dazu bei jedem Start der Anwendung die zu editierenden Texte zu speichern, da damit der Timestamp verändert wäre, obwohl der Benutzer die Datei gar nicht geändert hat und auch nicht speichern wollte.

Viele Grüße,
Andreas

Technorati Tags: ,

Destruktor nicht gerufen in mixed mode C++ Anwendungen mit Visual C++ 2008

Monday, February 9th, 2009

Hallo,

in C++ gibt es ja das Resource Aquisition Is Initialization (RAII) pattern. Der Kern dieses Patterns besteht darin, dass ein Objekt bereits bei der Konstruktion die Ownership für eine Resource übernimmt und diese Resource bei seiner Zerstörung wieder frei gibt. Man wendet dieses pattern an, um Resourcen wie allokierten Speicher oder file handles sicher freizugeben. Dabei mancht man sich zu nutze, dass in C++ der Destruktor eines Objektes deterministisch aufgerufen wird, z. B. auch im Falle eine exception.

Dieses pattern ist sehr wichtig, um zuverlässige und robuste Software in C++ zu schreiben und ich nutze es regelmäßig. Nun hatte ich vor einiger Zeit in einem der Unittests in der Software, die ich für mein Unternehmen EmPowerTec schreibe, einen seltsamen Fehler in einem Unittest. Nach einer längeren Debugging-Session sah es so aus, als würden die Destruktoren für Objekte die in einer Methode auf dem Stack angelegt waren, beim Verlassen der Methode nicht mehr gerufen. Ein solches Verhalten führt mit Sicherheit zu Fehlern, wenn das RAII Pattern genutzt wird. Zunächst war ich darüber verblüfft, da ich mir nicht vorstellen konnte, dass ein derartig fundamentales Verhalten vom Microsoft C++ Compiler nicht richtig implementiert war. Tatsächlich war das aber der Fall, wie in folgendem Knowledge Base Eintrag beschrieben:

http://social.msdn.microsoft.com/forums/en-US/vclanguage/thread/8324a598-ad05-40e1-a271-6f64ce3b6008

Wie man dem Thread entnehmen kann, tritt das Problem auf, wenn man von einer C++/CLI Library eine native C++ library aufruft und diese mit inkompatiblen Einstellungen für das Exception handling übersetzt hat.

Und die Moral von der Geschicht,
Trau’ keinem Compiler nicht,

Unittests sollst Du machen,
Sonst hast Du nichts zu lachen

Viele Grüße,
Andreas

Technorati Tags: ,

C#/.NET ist populärer als Java

Wednesday, November 19th, 2008

zumindest wenn man den tags auf stackoverflow.com glaubt.

Erstaunt hat mich auch die Popularität von Python im Vergleich zu Perl.

Viele Grüße,
Andreas

stackoverflow.com: die beste online-Resource für Softwareentwickler?

Wednesday, September 24th, 2008

Hallo,

wer wie ich seinen Berufseinstieg in der Softwareentwicklung noch ohne Internet + Google gemacht hat, ist vielleicht immer noch dankbar wenn er nach 15 Minuten “googeln” eine Antwort auf ein Problem gefunden hat, das ihn früher vielleicht Tage gekostet hätte. Die meisten relevanten Treffer finden sich in Foren oder speziellen “Experten-sites” wie etwa Experts Exchange.

Nun tritt einen neue website an, um das teilen von Wissen zur Softwareentwicklung noch effizienter zu machen: stackoverflow.com.

Hinter der Seite steht unter anderem Joel Spolky, einer der einflussreichsten Köpfe in der IT-Szene.  Auf seiner Website erklärt er, warum stackoverflow.com die beste derartige Resource  sein soll.

In der Tat hat die site einige Alleinstellungsmerkmale, die sie zu einem Erfolg machen könnten:

  • Durch die Möglichkeit Antworten zu bewerten werden die Antworten nach Qualität sortiert
  • Durch die Möglichkeit antworten zu editieren, werden die Antworten immer besser
  • Die Möglichkeit “Reputation” zu gewinnen, fördert die Bereitschaft zu der site beizutragen
  • Antworten können kommentiert werden, ähnlich wie in einem blog
  • Last but not least: es ist keine Registrierung erforderlich!

Das Konzept scheint aufzugehen wie man etwa an enthusiastischen Diskussionen in Foren und an der bereits nach kurzer Zeit sehr hohen Zahl von Fragen sieht.

Es lohnt sich auf jeden Fall mal einen Blick auf stackoverflow.com zu werfen. In den FAQs kann man sich am schnellsten einen Überblick verschaffen.

Viele Grüße,
Andreas

Nette Silverlight Demo

Thursday, September 4th, 2008

Hallo,

Microsofts Silverlight stellt eine Plattform dar, mit der man “Rich Internet Applications” (RIAs) mit Schwerpunkt auf grafische Darstellung erstellen kann.

Wer sich für Silverlight interessiert findet unter http://foidoschess.tv/ eine nette Demonstration der Möglichkeiten von Silverlight. Dummerweise ist eine Registrierung erforderlich, ich habe hierfür eine Email-Adresse @mailinator.com verwendet.

Ausserdem muss man noch die Silverlight Runtime installieren, was aber schnell und unkompliziert geht.

Da ich öfter das Internet nutze um Schachpartien live zu verfolgen (z.B. soweit möglich bei dem im Oktober anstehenden Weltmeisterschaftskampf) kann ich den Mehrwert der Foidos-Plattform durchaus erkennen.

Viele Grüße,
Andreas

Technorati Tags: ,

Popularität des Microsoft Ribbon controls

Monday, August 18th, 2008

Hallo,

die aktuell in Entwicklung befindliche Software meines Unternehmens EmPowerTec verwendet das Microsoft Ribbon zur Steuerung der Anwendung. Während ich persönlich von der höheren Produktivität (und auch der optischen Attraktivität – “eye candy”) schon immer überzeugt war, gab es Anfangs doch viel Skepsis ob das Ribbon der richtige Ansatz ist. Teilweise bezog sich diese Kritik auch auf Microsoft’s Vorgehen, ein bereits vorhandenes GUI (in den Microsoft Office Anwendungen) zu ersetzen und auf den Versuch die Ideen als “intellectual property” zu patentieren um potentielle Wettbewerber zu behindern.

Inzwischen ist mein Eindruck dass für Neuentwicklungen das Ribbon-Konzept zum Standard geworden ist und eine breite Akzeptanz gefunden hat. Als Beispiel kann man sich diese Diskussion in dem Business Of Software forum auf joelonsoftware.com anschauen.

Hier gibt es weitere Beispiele für Anwendungen mit Ribbon controls.

Und hier noch ein Beispiel aus der erwähnten Anwendung:

Example for Ribbon control

Den eigentlichen Witz des Ribbons kann man so nicht ohne weiteres erkennen: je nach Kontext wird das passende “ribbon tab” automatisch aktiviert und macht so genau die relevante Funktionalität verfügbar.

Im obigen Beispiel wurde in ein editor window geklickt woraufhin das “Edit”-tab des Ribbons aktiviert wurde. Würde man in das treeview “Project files” im linken Bereich klicken, würde automatisch das “Project”-tab aktiviert werden.

Viele Grüße,
Andreas

Technorati Tags: