Geeks With Blogs

News
Step-by-Step into the cloud a blog of Dirk Eisenberg (>)

Eigentlich wollte ich doch nur über eine etwas ältere Win32-Dll ein nettes .NET-Interface bauen. Es sollte Klassen geben zur Verwaltung der Resourcen und Zugriffe usw. Natürlich sollte alles gleich mit dem neusten vom neusten funktionieren und somit habe ich mich für Visual Studio Beta 2 mit dem .NET-Framework 2 entschieden. Nachdem die erste Hürden überwunden waren und ich mich etwas mit dem GC beschäftigt hatte, erschien die nette Warnung C4980: '__gc' : use of this keyword requires /clr:oldSyntax command line option Ich ahnte nicht gutes. Nach einigem Suche habe ich kapiert das im .NET-Framework 2 einiges an der Integration von C++ geändert wurde (oh hätte ich vielleicht am Anfang erwähnen sollen, ja ich nutze dazu C++ und nicht C#). Dankbar war ich dann für folgenden Link

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnvs05/html/VS05Cplus.asp

Ich versuche mal mit zwei Veränderungen zu starten, die aus meiner Sicht von großem Interesse sind:

Nutzung der C++ Pointer-Darstellung zum Zugriff auf Objekte die der Speicherverwaltung des GC unterliegen

In vorherigen Versionen gab es das keyword __gc um deutlich zu machen, das es sich um eine Klasse unter der Aufsicht der GC handelt oder das die Speicherallokation auf dem managed Heap stattfindet. Das Ergebnis war augenscheinlich ein C++-Pointer. Das Problem dabei stellt die automatische Verschiebung der Objekte durch den GC dar. Weiterhin ist es unter Umständen einer Funktion/Methode nicht mehr möglich anzusehen ob diese nun einen managed-Pointer erwartet oder nicht(zumindest nicht sofort). Auch folgender Code war mit unter nicht eindeutig:

CMyClass* pClass  = new CMyClass();

Ist die Klasse durch das keyword __gc als managed markiert kommt dabei was ganz anderes raus als ein nativer C++-Pointer. Da ist folgender Code schon klarer:

CMyClass __gc* pClass = new CMyClass();

Im .NET Framework 2 hat man dem ein Ende gesetzt und einen nen Operator sowie ein neues Schlüsselwort für Klassen  eingeführt. Der Operator '^' markiert jetzt eine Referenz auf ein Objekt im managed Heap des GC. Das Schlüsseltwort 'ref' markiert eine Klasse als managed. Zusätzlich wurde der überladene new-Operator verworfen und dafür der gcnew-Operator eingeführt  (Betrifft wieder nur C++). Jetzt ist eine klare Trennung zwischen Allokationen auf dem managed Heap und dem CRT-Heap möglich.

ref class CMyClass
{
   public:
     CMyClass() {};
};

CMyClass^ refObjectt = gcnew CMyClass();

Implizites Boxing ersetzt __box

Boxing wird benötigt um einen Brücke zwischen den Wert-Typen und richtigen Objekte zu schaffen. Wenn man sich einen int-Wert-Typ mal genau betrachtet ist er gar kein richtiges Objekte, obwohl doch alles in der CLR von System::Object abgeleitet sein sollte. Ein int-Wert stellt einfach nur Daten auf dem Stack dar. Erst durch das Boxing des int-Wertes wird ein richtig Objekt draus.(An dieser Stelle sei auf den oben genannten Link verwiesen). Also was musste man früher als C++-Entwickler machen:

int value_i = 5;
System::Object* pObject = __box(value_i);

Das ist aber garnicht C++-Like also wurde hier aus dem expliziten Boxing mit Hilfe des neu eingeführten Referenz-Operators ein implizites Boxing:

int value_i = 5;
System::Object^ refObject = value_i;
int value_i2 = *(int^)refObject;

Wie bekommt man jetzt aber eine vernünftige Initialisierung einer Referenz hin ? Ganz einfach, man nutzt das neu eingeführte keyword nullptr. Auch das ist wieder eine Veränderung die nur C++ betrifft. C# begnügt sich weiterhin mit null.

System::Object^ refObject = nullptr;

Wie geht es weiter ?

Ich werde in einem der nächsten Posts die Reihe mit folgenden Themen weiterführen:

  • Das IDispose-Interface
  • Property-Handling

Wer darauf nicht warten will, kann do oben aufgeführten Artikel lesen.
Kommentare, Erweiterungen oder Korrekturen sind herzlich willkommen.

Posted on Tuesday, September 6, 2005 6:22 AM .NET Coding | Back to top


Comments on this post: C++/CLI, C4980, __box, __pin

No comments posted yet.
Your comment:
 (will show your gravatar)


Copyright © Dirk Eisenberg | Powered by: GeeksWithBlogs.net