.[ ČeskéHry.cz ].
Rozdil mezi .NET C++ a .NET C#
Jdi na stránku 1, 2  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
opice



Založen: 29. 07. 2007
Příspěvky: 39

PříspěvekZaslal: 11. srpen 2008, 10:01:04    Předmět: Rozdil mezi .NET C++ a .NET C# Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
MD



Založen: 29. 07. 2007
Příspěvky: 437
Bydliště: Praha

PříspěvekZaslal: 11. srpen 2008, 10:17:31    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 781
Bydliště: Čerčany

PříspěvekZaslal: 11. srpen 2008, 10:24:14    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
andris11



Založen: 29. 07. 2008
Příspěvky: 22

PříspěvekZaslal: 21. září 2008, 20:57:17    Předmět: Odpovědět s citátem

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 Wink 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
Zobrazit informace o autorovi Odeslat soukromou zprávu
andris11



Založen: 29. 07. 2008
Příspěvky: 22

PříspěvekZaslal: 22. září 2008, 13:09:25    Předmět: Odpovědět s citátem

Otazka vlastne znela proc pouzivat C++/CLI, kdyz existuje jednodussi C# Smile 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 Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
SUK



Založen: 14. 11. 2007
Příspěvky: 93
Bydliště: /dev/null

PříspěvekZaslal: 22. září 2008, 16:16:59    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky Yahoo Messenger MSN Messenger
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 22. září 2008, 16:30:37    Předmět: Odpovědět s citátem

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 Wink), pro ktere C# nema ekvivalent
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Augi



Založen: 28. 07. 2007
Příspěvky: 781
Bydliště: Čerčany

PříspěvekZaslal: 22. září 2008, 17:51:17    Předmět: Odpovědět s citátem

Kromě With třeba právě ty indexovatelné properties Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
SUK



Založen: 14. 11. 2007
Příspěvky: 93
Bydliště: /dev/null

PříspěvekZaslal: 22. září 2008, 17:53:44    Předmět: Odpovědět s citátem

kdyz uz jste tak u toho, co to je? Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky Yahoo Messenger MSN Messenger
Augi



Založen: 28. 07. 2007
Příspěvky: 781
Bydliště: Čerčany

PříspěvekZaslal: 22. září 2008, 18:46:41    Předmět: Odpovědět s citátem

OMG, UTFG: http://www.google.com/search?q=VB.NET%20indexed%20properties&ie=UTF-8&oe=UTF-8
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
SUK



Založen: 14. 11. 2007
Příspěvky: 93
Bydliště: /dev/null

PříspěvekZaslal: 22. září 2008, 20:01:07    Předmět: Odpovědět s citátem

v tom pripade priste lip utfg ty Wink protoze tohle teda umi i C# (ve verzi 2)
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky Yahoo Messenger MSN Messenger
Augi



Založen: 28. 07. 2007
Příspěvky: 781
Bydliště: Čerčany

PříspěvekZaslal: 22. září 2008, 20:25:33    Předmět: Odpovědět s citátem

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í Wink
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
SUK



Založen: 14. 11. 2007
Příspěvky: 93
Bydliště: /dev/null

PříspěvekZaslal: 22. září 2008, 20:31:42    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky Yahoo Messenger MSN Messenger
andris11



Založen: 29. 07. 2008
Příspěvky: 22

PříspěvekZaslal: 22. září 2008, 20:55:46    Předmět: Odpovědět s citátem

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
Zobrazit informace o autorovi Odeslat soukromou zprávu
posila



Založen: 29. 07. 2007
Příspěvky: 201

PříspěvekZaslal: 22. září 2008, 22:19:06    Předmět: Odpovědět s citátem

Augi napsal:
Podpora přímo v jazyce pro indexed properties fakt není Wink


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
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> .NET Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2  Další
Strana 1 z 2

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna