CLR-Klasse in nicht CLR Klasse hinzufügen
-
Hey Leutz,
kann mir bitte einer ein Beispiel schreiben wie ich eine CLR-Klasse in eine nicht CLR-Klasse hinzufüge.
Das Projekt soll hierbei ein CLR Projekt sein.Also mein Ansatz war:
class oberklasse { public: __gc public class { public: string^ g; } }
Klappt aber nicht. Da ich für __gc den Schalter /clr:oldSyntax benötige.
Wenn ich den Schalter hinzufüge klappt dann der rest mit string^ nicht usw.Hab VS 2005 Express u. XP SP2.
-
Das geht nur über Pointer!
Und verschachtelt gleich gar nicht...
Also:class Unmanaged; { }; __gc public class Managed { Unmanaged *pUnmanaged; };
-
Ich versuch das mal.
-
Ich hab das jetzt Probiert funkt. aber nicht.
__gc public class Managed { public: Managed() { z = 5; } int z; }; class Unmanaged { public: Unmanaged() { pManaged = new Managed(); } Managed* pManaged; }; int main() { return 0; }
Fehlermeldung:
Ein verwalteter 'pManaged' kann nicht in einem nicht verwalteten 'Unmanaged' deklariert werden Zeile 19Dein beispiel war ja anders herum, was ich eigentlich wollte ist Unmanaged in Managed.
-
Meine eigentliches Ziel ist es, eine Managed Klasse in ein CLR-Projekt global zu erstellen, egal wie. Ob wir mit mehreren Projekten arbeiten oder nicht, ist uns überlassen. Ich bin schon am verzweifeln. Ich brauch dringend bitte eure Unterstützung.
-
In C++/CLI-Syntax:
#include <vcclr.h> ref class Foo { }; class Bar { gcroot<Foo^> foo; };
-
hmm, sieht gut aus, aber so gut bin ich nicht das ich das alles verstehe
bis du so nett, mir das Zeile für Zeile zu erklären
Bitte
-
#include <vcclr.h> // bindet den Header vcclr.h ein // ist eine Leerzeile ohne Effekt ref class Foo { // entspricht dem Alten "__gc class Foo" // eine weitere Leerzeile, die andeuten soll, dass hier im Regelfall noch irgendetwas definiert wird }; // .. keinen Bock mehr auf jede Zeile einzugehen class Bar { gcroot<Foo^> foo; // Entspricht dem alten "gcroot<Foo __gc *> foo;" };
gcroot Brauchst du hier um managed Typen in unmanaged Typen unterzubringen. Dabei handelt es sich um ein Template, dass in <vcclr.h> definiert ist. Wie es intern funktioniert muss dich gar nicht interessieren, sondern nur, wie du es verwendest.
Du kannst mit der ganz normalen "->" Syntax arbeiten.
#include <vcclr.h> ref class Foo { public: void methode () { Console::WriteLine(L"Blabla"); } }; class Bar { public: void baz () { foo->methode(); // <- so sieht die Verwendung aus } private: gcroot<Foo^> foo; };
Jetzt noch ein kleinwenig selber rumexperimentieren oder ein wenig googlen und du solltest es verstanden haben.
-
Vielen vielen dank aber auch.
Das ist genau das was ich gesucht habe. Dieses "ref" ist der Ersatz für "__gc", hab ich echt nicht gewusst. Also nochmals Danke.
Eine Frage noch.
Bei deiner Verwendung:void baz () { foo->methode(); // <- so sieht die Verwendung aus }
Muss man nicht erstmal ein Objekt von foo haben, also mit "new" erstellen oder reicht das aus wenn man nicht dynamisches Obejtk macht?
-
Oh, ja klar, musst du erst erzeugen:
class Bar { public: Bar () { foo = gcnew Foo(); // <- Erzeugung } void baz () { foo->methode(); } private: gcroot<Foo^> foo; };
-
Ich glaube bei mir funktioniert das jetzt. Da war echt ne tolle Hilfe. Ich hab zu Danken. Vielen vielen Dank.