CLI Mananged C++ mit normale unmamanged C++ mischen?
-
Nabend,
ich möchte eine anwendung coden, welche die features von .NET , also in dem fall .NET Remotiing nutzen kann. Ich möchte eine normale c++ anwendung mit diese funktionalität erweitern, d.h. ich müsste Mananged und unmamanged mischen.
- Ist das mögliche?
- Wenn ja was muss ich beachten?
- Könnte ich .NET Assamblys bspw. con C# einbinden, zu normamen dlls aus C++ bzw. C?- Gibts gute Bücher, Tutorial umd sowas zu implementieren?
Danke schon mal;)
-
Genau dafür wurde doch C++/CLI geschaffen: Um "normalen" C/C++ Code mit Managed Code zu mischen; um eine Interoperabilität zu ermöglichen...
-
Das ist ja perfekt
bspw. sowas:
class UnManagedClass{ ManagedClass *dat; UnManagedClass(){ dat= gcnew ManagedClass(); } }; void foo(){ UnManagedClass *p = new UnManangedClass(); . . . delete p; }
Hier würde ich explitzit UnManangedClass Objekt selber löschen, die ManagedClass member der Klasse wird aber vom GC gehandelt?
-
Du *musst* die unmanaged Class selber löschen!!!
Oder was ist Deine Frage?
-
Die Frage war, ob das Prinzip wie in meinem bspw. so abläuft. Also hier lösch ich das unmanaged Clss objeckt selber bzw. muss. Diese kann aber managed Objekte haben welche evtl. erst später oder auch gleich vom GC gelöscht werden!?
-
Ne Frage: Im Augenblick verwende ich noch VS 2003, bekomme aber bald 2008. Darin kann ich keine CLI Projekte, jededoch Managed C++ Projekte (__gc) erstellen.
Jetzt hab ich Testweise 2 Klassen implementieret
//A class CUnManaged { CAllocObject m_A; ... }; //B __gc class CAllocObject { std::vector<double> m_vDouble; ... }; int _tmain() { CUnManaged *p= new CUnManaged(5); delete p; return 0; }
Das "Mischen" geht wohl dioch net so einfach wie ich gedacht habe. Fehler:
d:\Projekte\VisuSpec\ProgTest\CLI\TestCLI\UnManaged.h(9): error C3265: cannot declare a managed 'm_A' in an unmanaged 'CUnManaged' d:\Projekte\VisuSpec\ProgTest\CLI\TestCLI\AllocObject.h(5): error C3633: cannot define 'm_vDouble' as a member of managed 'CAllocObject'
-
In der FAQ gibts dazu einen Eintrag der helfen könnte:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-156867.htmlJedoch ist das für C++/CLI und nicht für MC++, aber ev. ist es änlich.
Simon
Edit: Auf jeden Fall würde ichs mal mit einem Pointer versuchen.
class CUnManaged { CAllocObject* m_A; // ... };
-
@bingobongo
Du kannst in C++/CLI in einem unmanaged Type keine managed Reference haben. Als "Ausweg" gibt es diverse Helperklassen von MS (z.B. auto_gcroot<T>):http://msdn.microsoft.com/en-us/library/481fa11f(VS.80).aspx
http://msdn.microsoft.com/en-us/library/ms177048.aspx
...EDIT: Der Grund warum das nicht geht ist einfach dass der GC über die Referenz in einem unmanaged Typ nicht wissen kann (der GC kennt unmanaged Typen ja nicht - der weiss nichtmal dass es die gibt), und daher auch nicht wissen könnte wie lange er ein Objekt am Leben lassen müsste wenn es von unmanaged Types referenziert werden dürfte. Also geht man den Umweg dass man dem GC sozusagen "von Hand" mitteilt dass das Objekt noch rerefenziert wird. Und genau das zu automatisieren übernimmt auto_gcroot<T>. /EDIT
Und es gibt in C++/CLI einige nette Sprach-Features die die Arbeit mit Managed Types vereinfachen, bzw. auch das Implementieren von Managed Types. Das alles zu erklären wäre etwas viel, aber lies dir doch einfach mal ein paar MSDN Artikel zu dem Thema durch, das meiste ist eigentlich ganz gut dokumentiert.
-
Hi hustbaer,
Naja wenn ich mananged und unmanaged mischen möche und kann, ist es doch vorraussetzung das bspw. managed objekt in nem unmanaged objekt unterbringen kann ohn so syntaktische spielereien.
wenn ein object mit dem schlüsselwort "__gc new" allocieren, müssste doch der compiler merken das es sich um en GC object handelt oder net? Oder muss ich so die referenz bzw. der Pointer auf als GC Typ deklarieren, damit ihm das klar wird.
Ich msus auch klassen extra als unamanged deklarieren. Ich dachte man könnte ganz elegant Klassen einmal unmanaged und managed aufm speicher haun;)
Die Größe verwirrung gilt dem Destruktor und der Dispose Funktion wenn ich bspw., in C# arbeite.. das ist es echt schlimm. Und auch der Umstand objekte zu kopieren. Auch wenn man sich nicht mehr um die speicherverwaltung kümmern muss, finde ich C++ einfach besser, da hat man kontrolle,übersicht und weis was man tut;)
-
Nun bin ich verwirrt. Was willst du? Verstehen wie es *ist* und vielleicht noch warum, oder darüber sudern dass es nicht so ist wie du es gerne hättest?
Was der Compiler erkennen können müsste/sollte/blah ist vollkommen egal, interessant ist was er wirklich kann und tut.
Und verabschiede dich bitte von managed C++ ("__gc new" etc.), managed C++ ist tot. Verwende C++/CLI ("gcnew" etc.).