Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Miksovanje managed i unmanaged koda...

[es] :: .NET :: Miksovanje managed i unmanaged koda...

[ Pregleda: 2458 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Beban
Beograd

Član broj: 6351
Poruke: 39
*.informatika.com



Profil

icon Miksovanje managed i unmanaged koda...17.09.2004. u 11:56 - pre 209 meseci
Ovako...
Radi se o miksovanju managed i unmanaged code-a (C++ je u pitanju).

Znam da u unmanaged klasi mogu da imam managed objekat, ako je njegov tip ne .NET, vecc neka vrsta smart pointer-a generisana sa gcroot template-om. I to funkcionisse, bass kao na naccin opisan u MSDN-u.

Ono ssto mene mucci je sledecce:
imam jednu managed i jednu unmanaged klasu. Potrebno mi je da klase "opametim" tako da vide jedna drugu - znacci svaka od njih da ima pointer na onu drugu.
U obiccnom CPP za takve stvari se koristi forward deklaracija u jednoj od njih. To sam pokussao i ovdje: managed klasa ima pointer na objekat unmanaged klase, a ova druga u heder-u forward deklaraciju managed klase, i pointer na nju.
Npr:

Code:

#include"unmanaged.h"

class __gc CManaged
{
     CManaged() { m_pUnmanaged = new CManaged(this); }
     CUnmanaged* m_pUnmanaged;
}

-----------

UNMANAGED.H:

#include <vcclr.h>

gcroot<class CManaged*>;

class CUnmanaged
{
     gcroot<CManaged*>m_pManaged;
}

UNMANAGED.CPP
#include"unmanaged.h"
#include"managed.h"

CUnmanaged::CUnmanaged(gcroot<CManaged*>managed)
{
     m_pManaged = managed;
}


Problem nastaje kada pokussam da objekat managed klase prosledim objektu u unmanaged klasi - izgleda da ova ssetnja nije dozvoljena (bez obzira koji tip argumenta navedem u konstruktoru CUnmanaged - bilo gcroot, bilo pointer na managed klasu). Gressku javlja u konstruktoru managed klase, u liniji u kojoj kreiram objekat unmanaged i prosledjujem mu parametar this.

Da li neko zna kako ovo da izvedem?
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
66.228.70.*



+6 Profil

icon Re: Miksovanje managed i unmanaged koda...17.09.2004. u 13:43 - pre 209 meseci
Imaš gomilu grešaka. Npr:

Code:

class __gc CManaged


treba da bude

Code:

__gc class CManaged;


a

Code:

gcroot<class CManaged*>;


ne znači ništa - ne znam šta hoćeš time da postigneš.

Uglavnom, ovako nešto lepo radi (strpao sam sve u jedan fajl ali je lako da se raspodeli na više)

Code:

#include <vcclr.h>

__gc class CManaged;

class CUnmanaged
{
     gcroot<CManaged*>m_pManaged;
public:
    CUnmanaged (gcroot<CManaged*> man):m_pManaged(man) {}
};

__gc class CManaged
{
     CUnmanaged* m_pUnmanaged;
public:
     CManaged(CUnmanaged* un) { m_pUnmanaged = un; }
};

 
Odgovor na temu

Beban
Beograd

Član broj: 6351
Poruke: 39
*.informatika.com



Profil

icon Re: Miksovanje managed i unmanaged koda...17.09.2004. u 14:03 - pre 209 meseci
Nemanja, hvala na pokussaju, vidjeccu da li tvoj predlog zavrssava posao.

Inacce, one gresske koje si nassao se zovu (ako nisi znao) lapsus calami.
Jednostavno, nisam siguran da bi bilo svrsishodno da postiram ccitav moj kod, pa sam na brzinu napisao primjer, permutujucci redosled rijecci __gc i class, tako da gresska nije u tome (mada bih ja volio da je to problem, makar i po cijenu da ispadnem glup u drusstvu, a ti pametan). Nadam se da si sada shvatio da time ne zzelim nissta da postignem, kako si se zapitao.

Susstina problema je na drugoj strani (detaljnije je opisana u tekstu poruke), nadam se da je drugi dio tvoga odgovora konstruktivniji od onog prvog, koji je pucanj u prazno.

U svakom sluccaju, hvala na trudu.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
66.228.70.*



+6 Profil

icon Re: Miksovanje managed i unmanaged koda...17.09.2004. u 14:11 - pre 209 meseci
Nisam te pitao šta si hteo da postigneš sa class __gc, nego sa

Code:

gcroot<class CManaged*>;


Možda si hteo typedef, a možda forward deklaraciju.

U svakom slučaju, potrudi se da kod koji postuješ može da se kompajlira, ili bar naglasi da pišeš pseudo-kod. Forum prate i ljudi koji ne znaju baš najbolje MC++ sintaksu i ne želim da je ovde nauče naopako.

Pozdrav.
 
Odgovor na temu

Beban
Beograd

Član broj: 6351
Poruke: 39
*.informatika.com



Profil

icon Re: Miksovanje managed i unmanaged koda...17.09.2004. u 14:34 - pre 209 meseci
OK, sa onim sam zzelio da kazzem da je forward deklaracija u pitanju - shvatio si to i sam. Oni koji tek ucce ove stvari, vjerovatno cce prvo proccitati neku knjigu, pa tek onda ccitati ovakve rasprave, ali ko zna... Dakle, u pitanju jeste bio pseudo-kod, mozzda je i trebalo to da naglasim, a ne da to smatram occiglednim.

Pogledao sam i ssta si ti napisao - ccini mi se da nisi bass u pravu.

Code:

#include <vcclr.h>

__gc class CManaged;

class CUnmanaged
{
     gcroot<CManaged*>m_pManaged;
public:
    CUnmanaged (gcroot<CManaged*> man):m_pManaged(man) {}
};

__gc class CManaged
{
     CUnmanaged* m_pUnmanaged;
public:
     CManaged(CUnmanaged* un) { m_pUnmanaged = un; }
};


Naime, u konstruktore obe klase predajess kao argument pointer na onu drugu. Jedna od njih (u ovom sluccaju je potrebno da to bude unmanaged klasa) dobija taj pointer. Onda druga ne dobija pointer na prvu - mora da ga kreira sa operatorom new. I to je sskolski primjer onoga ssto se zove forward deklaracija - opisano je u veccini (krsstenih) knjiga koje se bave C++; takav kod generissu ccak i UML alati tipa Rational Rose-a. Jednostavno, tako se radi kod forward deklarisanja, a svaki drugi naccin (barem meni) licci na izmissljanje tople vode...

Tako da, na zzalost, ovaj tvoj kod mi nije donio i ressenje problema...

Pozdrav i tebi i joss jednom hvala na trudu.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
66.228.70.*



+6 Profil

icon Re: Miksovanje managed i unmanaged koda...17.09.2004. u 15:25 - pre 209 meseci
Meni u stvari i dalje nije jasno šta hoćeš da uradiš. Ovo (zanemari memory leak)?

Code:

#include <vcclr.h>

__gc class CManaged;

class CUnmanaged
{
     gcroot<CManaged*>m_pManaged;
public:    
    SetManaged (CManaged* man) {m_pManaged = man;}
};

__gc class CManaged
{
     CUnmanaged* m_pUnmanaged;
public:
    void SetUnmanaged (CUnmanaged* un) {m_pUnmanaged = un;}
};


int _tmain()
{
   CManaged* man = new CManaged();
   CUnmanaged* un = new CUnmanaged();
   man->SetUnmanaged(un);
   un->SetManaged (man);
   return 0;
}


Ako je to u pitanju, problem je bio što si prosleđivao this u konstruktoru, dakle pre nego što je objekt potpuno konstruisan.
 
Odgovor na temu

Beban
Beograd

Član broj: 6351
Poruke: 39
*.ptt.yu



Profil

icon Re: Miksovanje managed i unmanaged koda...18.09.2004. u 12:02 - pre 209 meseci
Ne, nije problem u tome; recimo da je objekat konstruisan, i sve uradjeno po PS-u.
Problem nastaje kada preko pointera this pokussam da predam objekat managed klase unmanaged klasi - necce ccak ni da se iskompajlira, vecc javlja da ne mozze da izvrssi konverziju (ccini mi se da kazze da ne mozze da izvrssi konverziju iz tipa gcroot<T> u tip gcroot<T>). I to je ono ssto me zbunjuje.
U unmanaged klasi mogu da koristim managed objekte kreirane template-om gcroot<T> - ali kada pokussam da te objekte dobijem spolja (kao argumente funkcije), onda kompajliranje ne prolazi.

Sada mi nije projekat pri ruci (vikend je), pa ne mogu u ovom trenutku da napissem taccan tekst gresske prilikom kompajliranja, ali kako rekoh, problem je u konverziji.

A sve pokussavam da uradim forward deklarisanjem, da bi objekti bili svjesni jedan drugog...

Pokussao sam ccak da objekat managed klase konvertujem u tip intptr_t (nessto sliccno kako je uradjeno u heder file-u gcroot.h), pa njega da prosledim unmanaged klasi (i to mozze, prosslo je kompajliranje). A onda opet problem - kada on stigne u unmanaged klasu, kako taj intptr_t da vratim u objekat tipa managed klase? To bi mi rijessilo problem, mada nije type safe...

Pomislio sam da se neko mozzda vecc sreo sa sliccnim problemom; mozzda ova "ssetnja" nije dozvoljena u miksovanom kodu, a tako se radi u obiccnom C++? Mozzda zbog garbage kolektora postoji problem da objekat managed klase predam onoj drugoj? Mozzda managed objekti korisscceni u unmanaged klasama moraju biti tamo i kreirani (koristecci gcroot<T>), a ne mogu biti jednostavno prosledjeni?
Mnogo je tih pitanja, a ni na MSDN-u, ni na Google-u nisam mogao da pronadjem odgovor, a ne bih da i dalje gubim vrijeme pokussavajucci da uradim nessto na naccin na koji (mozzda) ne mozze da se uradi...
Mozzda jednostavno treba napraviti drugacciji dizajn aplikacije, i pokussati da se izbjegne takva vrsta akrobacija...

 
Odgovor na temu

Beban
Beograd

Član broj: 6351
Poruke: 39
*.informatika.com



Profil

icon Re: Miksovanje managed i unmanaged koda...20.09.2004. u 06:47 - pre 209 meseci
Problem rijessen konverzijom handle-a gc-a managed objekta u IntPtr, pa IntPtr-a u intptr_t koji se prosledjuje kao argument. Tamo gdje je on doccekan ide konverzija u obrnutom smjeru - i to je profunkcionisalo.
Joss samo da to istestiram ima li nekih memory leak-ova i sl.
 
Odgovor na temu

[es] :: .NET :: Miksovanje managed i unmanaged koda...

[ Pregleda: 2458 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.