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

idl & marshaling

[es] :: .NET :: idl & marshaling

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
82.117.202.*



+171 Profil

icon idl & marshaling05.06.2008. u 15:13 - pre 193 meseci
Pozdrav

Opet posao :)

Elem, ne znam gde tacno da stavim ovo pitanje, dal' u .NET ili C++ posto ima svega pomalo, pa za sad neka ide ovde.

Radim na projektu koji se sastoji od managed i unmanaged dela (C++ i C#). Dosadasnji deo unmanaged dela je bio uradjen u plain C (ako se tako moze reci, posto sve sto postoji su funkcije). Sada bi trebalo to prebaciti u COM interfejs koji bi se "uvuko" u C# gde bi automatika bila zaduzena za kreiranje "objekata", pod ovim mislim na COM objekte kao i nase strukture koje su definisane u sadasnjem unmanaged (u .h fajlovima) projektu. Posto sve prebacujemo u COM, sve dosadasnje definicije prebacujemo u idl fajlove kako bi izbegli rucno marshalovanje (ovo nam je bar zamisao). Elem, problem nastaje sto imamo strukture koje sadrze nizove nekih nasih struktura (prim. MyStruct** Structures), kako ovo prebaciti a da na kraju dobijemo odgovarajuci tip za C#? Da li je uopste moguce, ili nam ne gine marshaling? Jos konkretnije, kako se predstavljaju nizovi u idl fajlovima a da na kraju ne dobijem u C#-u IntPtr?
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: idl & marshaling05.06.2008. u 16:09 - pre 193 meseci
Nisam siguran 100% da to moze da konvertujes takvu strukturu iz IDL-a u C# .
COM interfejs za takve stvari uglavnom koristi VARIANT (za UDT klase) strukturu .. .
Probaj da napravis ekvivalent za VARIANT strukturu u C# ...
jer ces moci ces da prosledjujes tj. dobijas bilo koji tip podatka ..
E sad opet ostaje pitanje kako raspakovati podatke iz VARIANT-a u C# -u .


Viva lollapalooza
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: idl & marshaling05.06.2008. u 17:42 - pre 193 meseci
Jedno glupo pitanje, sto ne prebacite taj C code u mesoviti CLI/C++ projekat? managed C++ moze da poziva unmanaged code sa jedne strane a eksponira managed metadata sa druge tako da mozete direktno da ga koristite iz C#-a. COM vam je veoma nezgrapno resenje i pored toga sto imate implicitno marshalovanje imate i performance penalty.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: idl & marshaling05.06.2008. u 18:31 - pre 193 meseci
Pogeldaj ovu temu, tu je opisan obrnuti proces kad se managed code poziva iz unmanaged koda. Mislim da si cak i sam ucestvovao u toj raspravi :)

http://www.elitesecurity.org/t312821-Koristenje-openCV

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.eunet.yu.



+171 Profil

icon Re: idl & marshaling05.06.2008. u 19:59 - pre 193 meseci
^ Znam za tu temu ali to nije to, kod nas je zahtev da mora COM, ne bih sada da ulazim u razloge ali nije na meni da odlucujem nego da implementiram

@deerbeer, to smo i mi saznali, doduse na tezi nacin posle gomile experimentisanja, jbg. kad moje znanje o COM-u tezi nuli Uglavnom, u IDL moze da se definise SAFEARRAY za te svrhe mada meni licno se to resenje ne svidja, jer posle deklaracije SAFEARRAY u IDL, MIDL generise header fajl sa definicijom
Code:

SAFEARRAY *p

Sto bi neko rekao da nije lose ali mi imamo slucajeve da imamo i int** p tipove za koje bi recimo bio ekvivalent da napisemo u IDL kao
Code:

SAFEARRAY(SAFEARRA(int))

sto na kraju dobijemo u headeru
Code:

SAFEARRAY* p

tj. isto kada je u pitanju i jedan niz. (a da ne govorim da ima i nesto poput int**** p, mada ovo su mi i kolege iz C++ tima rekli da je lose resenje, jer zaista mislim da ovakve stvari treba izbegavati, ali to je off...)
Znaci problem je sto bi morali da znamo tacno sta drzimo u SAFEARRAY, tako da ode static type checking, znaci error prone, a da ne spominjem da koliko je kilavo raditi u C++ sa SAFEARRAY, mada ima COM wraperi poput CComSafeArray ali on radi sam sa onim VARIANT tipovima, ukoliko je tip VT_RECORD onda otpada koriscenje bilo koje wraper klase i ostaje samo glupi win32, mada video sam i neka resenja preko makroa, ali sve to je...

Uglavnom, verovatno bi neko rekao zasto koristimo SAFEARRAY, pa upravo zato sto preko njega bi navodno mogli da dobijemo "ispravan" tlb, sto bi na kraju rezultovalo da interop servis sam odradi marshaling, ali pored testova koje sam probao, sve govori da je to nemoguce, bar ne kada ima nesto poput SAFEARRAY(SAFEARRA(MyStruct)).

Doduse ceo ovaj "interoperability" mi je malo nejasan, pa me zato interesuje da li postoji nacin da se sve odradi preko idl (pogotovo mislim na UDT i nizove)a da na kraju interop automatski generise ispravan marshaling.
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.adsl-3.sezampro.yu.



+395 Profil

icon Re: idl & marshaling05.06.2008. u 20:55 - pre 193 meseci
Citat:

Znaci problem je sto bi morali da znamo tacno sta drzimo u SAFEARRAY, tako da ode static type checking, znaci error prone, a da ne spominjem da koliko je kilavo raditi u C++ sa SAFEARRAY, mada ima COM wraperi poput CComSafeArray ali on radi sam sa onim VARIANT tipovima, ukoliko je tip VT_RECORD onda otpada koriscenje bilo koje wraper klase i ostaje samo glupi win32, mada video sam i neka resenja preko makroa, ali sve to je...

VARIANT* tip i ne moras da stavljas u IDL deklaraciju jer je on sastavni deo IDL-a
i ne moras da stavljas SAFEARRAY u IDL pa da ga iz .NET-a koristis ..
a i imas ga definisanog i u .NET-u i to sve dobro zvuci dok ne videh ovo :
http://support.microsoft.com/kb/309329
http://www.tech-archive.net/Ar...work.interop/2004-09/0482.html

Citat:

Uglavnom, verovatno bi neko rekao zasto koristimo SAFEARRAY, pa upravo zato sto preko njega bi navodno mogli da dobijemo "ispravan" tlb, sto bi na kraju rezultovalo da interop servis sam odradi marshaling, ali pored testova koje sam probao, sve govori da je to nemoguce, bar ne kada ima nesto poput SAFEARRAY(SAFEARRA(MyStruct)).

Naravno jer mu i za MyStruc treba definicija u IDL fajlu :) i jos ako MyStruct ima u sebi neki klasni tip kao promenljivu (npr COleDateTime)
sto te opet dovodi u situaciju da pravis parelenu definiciju i sa pozivajuce strane tj. NET-a (marshaling) za svaki tip posebno

a sa druge strane ako sve stavljas u kontejner klasu (npr. VARIANT da u sebi sadrzi SAFEARRAY ili slicno )
onda ces se polomiti od muke u pozivajucem .NET kodu da kastujes u tvoje odredjene tipove koje si definisao u COM-u (C++-u) ...
...
COM objekti i nisu bas zamisljeni da se koriste za export tipova tj. ili nizova UDT struktura
nego za export novih funkcija i novih interfejsa koje tvoja COM komponenta nudi .

EDIT :
Citat:
@mmix
Pogeldaj ovu temu, tu je opisan obrnuti proces kad se managed code poziva iz unmanaged koda. Mislim da si cak i sam ucestvovao u toj raspravi :)
http://www.elitesecurity.org/t312821-Koristenje-openCV

Managed C++ bi bilo najbolje resenje ..ali mora ceo kod da portuje u CLI/C++
sa obzirom da im je sada najisplatljivije u ovom slucaju da bude "quick & dirty" varijanta sa postojecim COM-om ..










[Ovu poruku je menjao deerbeer dana 05.06.2008. u 22:30 GMT+1]
Viva lollapalooza
 
Odgovor na temu

deerbeer
Beograd

Član broj: 174418
Poruke: 1189
*.ptt.yu.



+395 Profil

icon Re: idl & marshaling06.06.2008. u 09:05 - pre 193 meseci
Pogledaj na ovom linku : http://www.codeproject.com/KB/COM/cominterop.aspx
u sekciji COM collection based object i kako da prosiris tvoju komponentu da
mozes da je koristis kao kolekciju tvojih UDT struktura
i time bi izbegao prosledjivanje nizova struktura kao parametar funkcije
a iz .NET-a pozivas kako da je obicna kolekcija (sa foreach for itd ...)
Kljucna rec : IEnumVARIANT interfejs koji treba da implementira tvoj COM objekat ...

Viva lollapalooza
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
82.117.202.*



+171 Profil

icon Re: idl & marshaling06.06.2008. u 11:56 - pre 193 meseci
Hvala na linkovima, mada na vecinu sam vec naleteo, sem ovog zadnjeg :)

Uglavnom, za sada radimo preko SAFEARRAY pa sta bude...
 
Odgovor na temu

[es] :: .NET :: idl & marshaling

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

Postavi temu Odgovori

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