[ erkan @ 21.08.2006. 09:37 ] @
Pozdrav svima,

Imam projekat koji je napisan u C++-u, a kao razvojno okruzenje
koristen je BBuilder 6.0.
Projekat je pogolem a jedan dio logike tog projekta bih trebao iskoristiti
u novom projektu koji bih najradije radio u C#-u.
Dio logike o kom govorim je u dll-ovima i LIB-ovima.
Sad se postavlja pitanje kako u .NET-u iskoristiti te bilbioteke (dll, lib)
obzirom da Borlandova rjesenja nisu kompatibilan sa MS-om(mada, iskreno nisam probao
jer je povelik posao, tako da zasad samo istrazujem).
Molio bih za savjet, prijedlog i sl.
Da li je moguce napraviti COM interfejs pa pristupati tim bibliotekama
(naravno, imam kod svih tih biblioteka napisanih u BB-u) iz .NET-a ili je
moguce napraviti neki managed C++ wrapper u C++.NET-u pa tako dobijeno rjesenje koristiti
u C#-u ili... sta vec?!
Da li neko vec ima slicno iskustvo?
Svaki savjet je dobrodosao.
[ erkan @ 23.08.2006. 06:54 ] @
zar je moguce da niko nema nista da kaze...
...
Jel moguca sljedeca varijanta: da se biblioteke wrappiraju u Borlandovom C#-u
a onda takav wrapper koristiti normalno u MS VS .NET-u jer ne bi tad smjelo
biti nekompatibilnosti (ipak se radi o istom framework-u)!?
[ sstanko78 @ 23.08.2006. 13:54 ] @
Vid, u Managed C++-u mozes da napravis wrapper. Koliko se secam te dll-e mozes importovati
pomocu u VS 2005. Mislim da je opcija Add Reference, pa izaberes com tab. Ili tako nesto
[ erkan @ 23.08.2006. 14:11 ] @
Hm, mozda...
Jednom sam imao problem sa DLL-om napisan u C++ VS 6.0.
Ideja je bila ta da koristim sve te mogucnosti koje je taj dll pruzao.
Nakon sto sam se napatio dvije sedmice pokusavajuci da to uradim u C#-u
(a nisam uspio zbog sile uniona i pointera na pointer), konacno
sam to uradio u C++.NET-u. Medjutim, ovdje je problem u borlandovom rjesenju;
Ne mogu tek tako referencirati se na te biblioteke i koristiti ih (AddReference itd.).
Trazio sam po NET-u i vidim da ljudi pitaju slicne stvari, medjutim, ne vidim odgovora.
Naravno, ne mislim da ce neko bas predloziti cjelovito rjesenje ali barem neku uputu.
Jos se nisam 'nafatio' posla, jos uvijek iscitavam i istrazujem, medjutim, prije nego krenem
da radim volio bih da znam sta cu i na kakve probleme mogu 'racunati'.
Zato bih volio da ako neko ima iskustva sa slicnim stvarima da ih podijeli ;).
Poz
[ mmix @ 23.08.2006. 15:35 ] @
Da bi Add reference radio u .NETu, mroa da postoji ili type metadata (za .NET DLLove) ili TypeLibrary (za COM). Standardni C++ DLL-ovi nemaju to, imaju samo spisak "nakicenih" EntryPoint-a (iz tog razloga koristis .h/.hpp fajlove da bi kompajler znao koji su formalni parametri).

Ne mozes wrapovati unmanaged C++ klasu u bilo kom "cistom" .NET jeziku ukljucujuci Borlandov C#

Postoje dva nacina da ubacis C/C++ DLL u .NET.

Prvi je sa Platform invoke ako pozivas samo funkcije iz DLL-a (sto kod tebe izgleda nije slucaj)

Drugi je da u C++.NET napravis managed "single-aggregation" wrapper koji ce imati instancu unamanged C++ klase i koji ce metod po metod preslikati unamanaged C++ klasu u .NET klasu. Iskreno, nisam nikad ovo pokusavao niti me privlaci kao potencijalno resenje. Ovo bih koristio ako i samo ako nemam sors za taj unmanaged C++ DLL, a koliko sam ja shvatio ti posedujes C++ sors code.

Ako hoces da zadrzis svoju C++ logiku, portuj kod sa BBuildera na C++.NET. Da, imaces dosta posla oko "ciscenja" koda i konformisanja CLI-u ali verovatno manje nego sa debagovanjem marshaling gresaka u gore pomenutoj agregaciji. Ovo resenje ce ti cak omoguciti da u .NET jeziku nasledis neke od tih klasa i nastavis tamo gde si stao...


Naravno, postoji resenje i sa COM-om, gde ces u Borland C++-u SVAKU klasu iz projekta publikovati kao COM objekat, ali to je nocna mora a i zahteva da se svi ti objekti instaliraju na klijent masine, a i pride svi metodi koji ne koriste COM-compatibile tipove moraju da se rekodiraju i sve to na kraju ispadne mnogo gadno
[ erkan @ 25.08.2006. 14:58 ] @
Zahvaljujem,
jos malo sam istrazivao...
Posto COM rjesenje podrazumjeva visoki performance penalty,
ponovni prepis koda u C++.NET je vise nego rizican poduhvat (ooogroman je postojeci projekat)
i zbog drugih specificnosti vezanih za projekat,
vjerovatno da cu se opredjeliti za novi dll (BC++) koji ce
sa jedne strane 'komunicirati' sa postojecim bibliotekama a onda
jednostavno ih wrappirati i eksportovati osnovne funkcije koje mi trebaju
u novom projektu.
Ako ima jos sugestija, svakako su dobrodosle.
Pozdrav