[ Milos Stojanovic @ 19.12.2004. 18:06 ] @
Može li neko da me uputi na dobar članak o ovome? Dakle potrebno je da funkcije managed objekta pozivam iz unmanaged koda. Našao sam nešto ovde, ali bi bilo lepo kada bi neko priložio još neki link.
Hvala.
[ Dragi Tata @ 19.12.2004. 19:13 ] @
Nažalost ne znam ni jedan link (odavno se nakanjujem da napišem članak na tu temu za Code Project), ali evo kako bi u principu to išlo:

1. U unmanaged projekat dodaš novu klasu (može i preko wizarda - generic C++ class) i kreiraš nov cpp i h fajl za nju - nazovimo je Wrapper
2. U Solution Explorer-u desnim dugmetom klikneš na fajl Wrapper.cpp i startuješ "Properties"
3. Pod "General", nađi opciju "Compile as Managed" i promeni u "Assembly Support(/clr)"
4. Kad probaš da kompajliraš, kompajler će prijaviti neke nekompatibilne opcije, među njima precompiled headers i run-time checks. Isključi ih.
5. U Wrapper.h dodaj #include <vcclr.h>
6. Za svaku managed klasu koju želiš da pozivaš, koristi šablon gcroot, npr:
Code:
gcroot<System::String*> str;
[ Milos Stojanovic @ 19.12.2004. 20:08 ] @
Evo par ispravki koje sma morao da odradim kada sam uključio "/CLR". Možda nekom zatreba:

1° Mora da se isključi "/Gm" (Enable Minimal Rebuild)
2° Umesto Single-Threaded runtime library ("/ML" | "/MLd"), mora da ide multithreaded ("/MT" | "/MTd").
3° Umesto Program Database for Edit & Continue ("/ZI") ide samo Program Database ("/Zi") debugging.

tako da ovakav program radi
Code:
#using <mscorlib.dll>
#include <vcclr.h>
using namespace System;

class CUnManaged
{
public:
    CUnManaged() {};
    gcroot<String*> str;
};

int main() 
{
   CUnManaged *c = new CUnManaged();
   c->str = new String("Hello managed world!");
   Console::WriteLine(c->str);
   return 0;
}


E sad, interesuje me nešto oko /Zi switcha. Dokumentacija govori o "performance implications" kada se koristi zajedno sa "/CLR". Jel to važi samo pri debugovanju, tj. da li kod release verzije treba da isključim /Z* parametar?
[ Dragi Tata @ 19.12.2004. 20:33 ] @
Eh, pa tako ti je sav kod managed. To si mogao da dobiješ mnogo lakše ako u Wizard-u izabereš Console Application (.NET) za tip projekta. Ja sam mislio da već imaš postojeći native projekat pa treba da mu dodaš neku funkcionalnost koja zavisi od .NET-a.
[ Milos Stojanovic @ 19.12.2004. 20:47 ] @
Pa dobro, ovo je samo primer. Razumeo sam ja (valjda). Treba da uključim /CLR (i "#using <mscorlib.dll>") u onim delovima koda gde imam pozive managed objekata. Zar ne? Kako drugačije?
[ Dragi Tata @ 19.12.2004. 21:25 ] @
Da. Poenta je da možeš samo pojedine cpp fajlove u inače native projektu da kompajliraš sa /clr. Znači, ako imaš neku native aplikaciju koju ne želiš da prekompajliraš u IL, a želiš da iz nje pozivaš neke .NET komponente, onda je ovo dobar način. Mada, možeš i preko COM-a, ali lično nisam ljubitelj te tehnologije.

Inače, nema potrebe da pišeš #using <mscorlib.dll> ako već imaš #include <vcclr.h>