Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
opice
Založen: 29. 07. 2007 Příspěvky: 39
|
Zaslal: 11. srpen 2008, 10:01:04 Předmět: Rozdil mezi .NET C++ a .NET C# |
|
|
Rad bych tady hracske obci polozil svoji skromnou otazku. S kolegou vedemem diskuzi jestli existuje nejaky vyznamny rozdil mezi C++ .NET a C# .NET. IMHO C++ .NET je v podstate orezane C++, co neumi o moc vic nez C#.NET, pac to bezi nad stejnou VM a CLR (snad krome poineru v unsafe modu). Zajima mne, jestli ma nejaky vyznam vubec pouzivat C++.NET, kdyz tu mame C#.NET, ktery mne pripada prehlednejsi. Prosim, vyvratte nebo potvrdte muj nazor. Dik.
P.S.: asi snad kazdej pochopil, ze mne nezajima srovnani C++ pro nativni kod, to snad kazdej pochopil.... |
|
Návrat nahoru |
|
|
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 11. srpen 2008, 10:17:31 Předmět: |
|
|
Myslim ze C++.Net se pouziva pouze pro programovani wrapperu mezi nativnim C++ a C# (ci jinym manegeovanym .NET kodem). Vlastne je to jediny jazyk, ktery to takhle umi! Myslim, ze C++.Net umi temer vsechno co C#, ale ma tu podstatnou nevyhodu, ze je to velmi skaredy jazyk. (Proste se v nem programuje nepohodlne.) _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 11. srpen 2008, 10:24:14 Předmět: |
|
|
Předně by to chtělo ujasnit terminologii - C++.NET jsem snad nikdy neslyšel. Prvním pokusem o propojení managed a unmanaged světa bylo Managed C++, které bylo ale docela dost nepřehledné. Soudruzi z MS se ale poučili a vytvořili C++/CLI, které je mnohem lépe čitelné a čistější (viz např. http://en.wikipedia.org/wiki/C%2B%2B/CLI).
Na Tvoji otázku není IMHO jednoznačná odpověď - hlavně záleží na typu projektu a jeho historii.
Pokud jde o klasický IS/CRM psaný from-scratch, tak bych šel určitě do C# (jak jsi psal - přehlednější).
Pokud jde o nějakou nadstavbu nad složitým fungujícím systémem napsaným v C++, který používá hromadu tříd apod., tak je C++/CLI ideální nástroj pro propojení unmanaged a managed světa. Buď můžeš začít přímo vyvíjet v C++/CLI celou aplikaci nebo si v C++/CLI jen napsat .NET wrapper, který pak použiješ ze C# (nebo jiného .NET jazyka).
Tuto mezivrstu v C++/CLI ale můžeš vypustit, pokud je interface stávajícího systému ve stylu čistého C - pak stačí si tyhle funkce naimportit do C# pomocí atributu DllImport.
Takže já vidím C++/CLI jen jako prostředek pro propojení unmanaged a managed světa, který bych použil jen pokud bych musel stavět nad existujícím systémem s C++ rozhraním, příp. pokud by byla kritickým kritériem rychlost (pak by kritické části byly v nativním C++ a zbytek (např. GUI) v managed prostředí; ale i tady bych se pokusil C++/CLI vyhnout a navrhl bych si C-like interface, který by mi stačilo naimportit pomocí DllImport). |
|
Návrat nahoru |
|
|
andris11
Založen: 29. 07. 2008 Příspěvky: 22
|
Zaslal: 21. září 2008, 20:57:17 Předmět: |
|
|
C++/CLI (tj. C++ pro .NET) oproti C# misty generuje odlisny IL kod.
V tomhle threadu nejaky clovek zkousel zkompilovat OGRE3D (nativni C++) do managed prostredi a neco o se tam o tom pise (C++/CLI generuje instrukci 'calli', ktera mimochodem neni podporovana v XBox360 CLR, a nezda se, ze je to jedine omezeni proc managed C++ kod nejde pouzit na xboxu, ale to je jiny topic).
Jinak wrappery se daji psat primo v C#, ukazky jsou ruzne wrappery PhysX.NET, ODE.NET, OGRE.NET pro prislusne nativni knihovny.
EDIT: Funguje to tak, ze CLR je schopne takzvaneho P/Invoke do nativniho kodu, poji se s tim operace jako marshalovaní dat (pripravi predavany objekt na prenos do nativniho prostredi anebo zpet) a pinning dat na heapu garbage collectoru (uzamceni objektu aby GC nepresouval objekt v pameti a nativni kod mel po dobu operace zarucen validni ukazatel). Proto je volani nativni metody mene efektivni nez volani managed metody.
V C# se nativni metody daji volat napr. takto, ukazka tridy, ktera umi otevrit konzolove okno s pouzitim nativnich metod v "kernel32.dll", klicovy atribut pro definici metody je [DllImport], kompiler zajisti vlastni P/Invoke.
kód: |
public static class ConsoleWindow
{
public static int Create()
{
if (AllocConsole())
{
return 0;
}
else
{
return Marshal.GetLastWin32Error();
}
}
public static int Destroy()
{
if (FreeConsole())
{
return 0;
}
else
{
return Marshal.GetLastWin32Error();
}
}
[System. Diagnostics. CodeAnalysis. SuppressMessage( "Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage" ), SuppressUnmanagedCodeSecurity]
[DllImport( "kernel32.dll", SetLastError = true )]
[return: MarshalAs( UnmanagedType. Bool )]
static extern bool AllocConsole();
[System. Diagnostics. CodeAnalysis. SuppressMessage( "Microsoft.Security", "CA2118:ReviewSuppressUnmanagedCodeSecurityUsage" ), SuppressUnmanagedCodeSecurity]
[DllImport( "kernel32.dll", SetLastError = true )]
[return: MarshalAs( UnmanagedType. Bool )]
static extern bool FreeConsole();
}
|
nebo ukazka jak wrapuje nativni PhysX knihovnu jeden wrapper
kód: |
[System.Security.SuppressUnmanagedCodeSecurity()]
[DllImport(NATIVE_LIBRARY, EntryPoint="NxUtilLib_NxComputeBoxPlanes")]
private extern static System.Boolean NxUtilLib_NxComputeBoxPlanes_INVOKE (HandleRef classPointer, System.Boolean call_explicit, HandleRef box, HandleRef planes);
|
EDIT: vypada to hrozne stalo by za to zduraznit, ze default marshalovani je casto intuitivni, ani s ostatnimi atributy to netreba prehanet (na detaily se me neptejte), klicovy je zkratka [DllImport]
kód: |
[DllImport( "Newton.dll" )]
public static extern int NewtonJointGetCollisionState( IntPtr joint );
[DllImport( "Newton.dll" )]
public static extern void NewtonJointSetCollisionState( IntPtr joint, int state );
|
jen pro zajimavost
Naposledy upravil andris11 dne 29. září 2008, 21:33:01, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
andris11
Založen: 29. 07. 2008 Příspěvky: 22
|
Zaslal: 22. září 2008, 13:09:25 Předmět: |
|
|
Otazka vlastne znela proc pouzivat C++/CLI, kdyz existuje jednodussi C# take by me zajimalo, jestli C++/CLI umi neco navic oproti C#, nejsem zrovna C++ man. Neumi to treba indexovane properites? CLR to umi (aspon v .NET1.1 tomu tak bylo), ale treba v syntaxi C# to nikdy zahrnute nebylo.
Je to mozna otazka preference, nekdo je proste dobry v C++, nebo by mohlo byt duvodem mit kod kompilovatelny jak do nativniho tak do managovaneho prostredi, nechce se mi teda moc verit, ze by to slo tak snadno a stale nechapu jak nekdo mohl zkompilovat OGRE do .NETu (viz vyse) musim se na ten thread lepe podivat, je to podezrele |
|
Návrat nahoru |
|
|
SUK
Založen: 14. 11. 2007 Příspěvky: 93 Bydliště: /dev/null
|
Zaslal: 22. září 2008, 16:16:59 Předmět: |
|
|
andris11: sic delam v C# pripadne jsem neco malo napsal v "cistym" (win32) C++ a v managed C++ jsem udelal vcelku nic, mam hodne divnej pocit ze vyhodou managed c++ je to, ze muzes pouzivat jak konstrukce a volani z c++ tak .NET tridy...
jinak moznost kompilovat cokoliv s .NETem do nativu vidim jako chvilema nemozny (jak by to bylo treba s reflexi? ).
Ad index. property - jestli to neni v C# tak to nebude pravdepodobne ani jinde, protoze afaik je C# pro MS takovym "hlavnim" jazykem co se v .NETu vyskytuje.....
(pockej - index. property je kdyz neco beres jako objekt[i] ? to v C# 2 normalne je, public int this[int i]{get{return skrytepole[i];}} - jestli myslis tohle...) |
|
Návrat nahoru |
|
|
Mem
Založen: 28. 07. 2007 Příspěvky: 1959 Bydliště: Olomouc
|
Zaslal: 22. září 2008, 16:30:37 Předmět: |
|
|
SUK napsal: |
jestli to neni v C# tak to nebude pravdepodobne ani jinde, protoze afaik je C# pro MS takovym "hlavnim" jazykem co se v .NETu vyskytuje..... |
To trochu pozor, protoze treba takovy VB.NET obsahuje nektere dost sikovne konstrukce (ok ted me napada jen with ), pro ktere C# nema ekvivalent _________________
|
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 22. září 2008, 17:51:17 Předmět: |
|
|
Kromě With třeba právě ty indexovatelné properties |
|
Návrat nahoru |
|
|
SUK
Založen: 14. 11. 2007 Příspěvky: 93 Bydliště: /dev/null
|
Zaslal: 22. září 2008, 17:53:44 Předmět: |
|
|
kdyz uz jste tak u toho, co to je? |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
|
Návrat nahoru |
|
|
SUK
Založen: 14. 11. 2007 Příspěvky: 93 Bydliště: /dev/null
|
Zaslal: 22. září 2008, 20:01:07 Předmět: |
|
|
v tom pripade priste lip utfg ty protoze tohle teda umi i C# (ve verzi 2) |
|
Návrat nahoru |
|
|
Augi
Založen: 28. 07. 2007 Příspěvky: 782 Bydliště: Čerčany
|
Zaslal: 22. září 2008, 20:25:33 Předmět: |
|
|
No to teda neumí. Samozřejmě si člověk může nakódit pomocnou třídu, která zajistí prakticky tu samou funkcionalitu, ale přímo podpora pro to v jazyce není. Člověk si s tím pěkně užije, když dělá např. s Office objekty (které jsou stavěny primárně pro VB.NET).
Tady máš přímo ukázku od Microsoftu - používají tam přesně to, o čem jsem mluvil (pomocná třída): http://msdn.microsoft.com/en-us/library/aa288464(VS.71).aspx
Podpora přímo v jazyce pro indexed properties fakt není |
|
Návrat nahoru |
|
|
SUK
Založen: 14. 11. 2007 Příspěvky: 93 Bydliště: /dev/null
|
Zaslal: 22. září 2008, 20:31:42 Předmět: |
|
|
ach jo, ja zase neumim cist :-[ tak to se omlouvam, jsem se na to spatne podival (syntaxe VB je mi uz par let temer neznama ac jsem v tom napsal i primitivni 3D engine a par pseudoher) |
|
Návrat nahoru |
|
|
andris11
Založen: 29. 07. 2008 Příspěvky: 22
|
Zaslal: 22. září 2008, 20:55:46 Předmět: |
|
|
SUK napsal: |
...mam hodne divnej pocit ze vyhodou managed c++ je to, ze muzes pouzivat jak konstrukce a volani z c++ tak .NET tridy... |
Ok. P/Invoke tam bude probihat stejne, musi tam byt ten marshalling a data pinning. Jestli to tedy chapu, tak managed C++ ma proste prirozenejsi syntax na volani nativniho kodu...
SUK napsal: |
jinak moznost kompilovat cokoliv s .NETem do nativu vidim jako chvilema nemozny (jak by to bylo treba s reflexi? ). |
no a hlavne Garbage Collector, netvrdim, ze mam v tomhle jasno. .NET -> native nevidim vubec ruzove, opacny smer je asi schudnejsi, viz ten thread o OGRE zkompilovanem do rizeneho kodu, ale nerad bych siril famy. |
|
Návrat nahoru |
|
|
posila
Založen: 29. 07. 2007 Příspěvky: 201
|
Zaslal: 22. září 2008, 22:19:06 Předmět: |
|
|
Augi napsal: |
Podpora přímo v jazyce pro indexed properties fakt není |
Tak s tim nesouhlasim, protoze ta konstrukce public int this[int index] {get; set; } se proste jmenuje indexed property, pod timto nazvem se to da najit v helpu, a daji se s tim udelat stejne veci, jako s tou VB konstrukci. To, ze to da vic prace je uz vec jazyka, ale rozhodne bych na zaklade toho netvrdil, ze C# nema podporu.
Augi: a tohle jsem ti mohl napsat na IRC, kdybys nesel tak rychle spat
PS: Proc to nejde v C# napsat jako ve VB.NET netusim, ale hadal bych, ze chteli donutit programatory, aby opravdu jednotlive kolekce zapozdrovali do vlastnich trid a nedelali jednu tridu pro milion ruznych veci. |
|
Návrat nahoru |
|
|
|