.NET für Umsteiger: VB, VC++ und COM im Blick

Änderungen beim managed Code

Die Dinge ändern sich, wenn man "managed" Code einsetzt: Hier eröffnen sich dem Programmierer die Möglichkeiten der Klassenbibliothek von .NET, deren Methoden und Objekte. Der wesentliche Unterschied ist dabei der, dass man hier auch bei C++ innerhalb des so genannten Garbage Collector von .NET operiert. Im Klartext bedeutet das, dass Objekte nicht länger per eigenem Code freigegeben werden müssen. Das besorgt stattdessen der Garbage Collector.

Das ist praktisch, aber auf bestehende Projekte nicht ohne Weiteres anwendbar. Diese sind natürlich voller Aufrufe von Destruktoren, die die Common Language Runtime nur stören. Das war aber auch den Programmierern bei Microsoft klar, und so bietet .NET die Möglichkeit, "managed" und "unmanaged" Code zu mischen. Man kann also alte Projekte mit neuem Code aufwerten, sofern man einige Punkte beachtet.

Das Wichtigste dabei ist das so genannte "boxing". Dazu muss man die Unterschiede zwischen "managed" und "unmanaged" Code etwas besser verstehen. Bei Ersterem ist praktisch alles ein Objekt, das dynamisch erzeugt und von der Laufzeitumgebung verwaltet wird. Im normalen C++-Code hingegen werden alle Objekte vom Programmierer verwaltet. Außerdem gibt es jede Menge atomarer Typen, die nicht im Heap, sondern auf dem Stack alloziert werden. Für diesen Widerspruch braucht es eine Lösung, um beide Arten von Code zusammenbringen zu können. Diese Lösung trägt den Namen "boxing". Das "boxing" wird mit separaten neuen Schlüsselwörtern vom C++-Compiler unterstützt.

Im Wesentlichen passiert dabei das Folgende: Wird ein Objekt aus der CLR in "unmanaged" Code übergeben, dann wird dazu eine Kopie der Daten des Objekts erzeugt, die nicht von der CLR verwaltet werden. Mit dieser Kopie kann der "unmanaged" Code dann tun, was ihm beliebt. Geht der Weg hingegen in die andere Richtung, so bekommt das Objekt zuvor eine Hülle, die vom "managed" Code aus verwaltet werden kann. Im einen Fall wird also eine "Box" um das Objekt erzeugt, im anderen Fall wird die Hülle zuvor entfernt.