C++/CLI è un linguaggio molto potente. È l'unico linguaggio CLR in cui è possibile combinare perfettamente il codice gestito e non gestito. Quanti sviluppatori di software (su questo sito) stanno usando questo linguaggio? In che tipo di progetti lo usi? È un adattamento del codice legacy o la creazione di un software originale? Puoi confrontare il vecchio C++ gestito con il nuovo C++/CLI? Cosa ne pensi della qualità attuale e del futuro di C++/CLI?Per favore, descrivi la tua esperienza nell'uso di Microsoft C++/CLI
risposta
Ho usato C++/CLI per un progetto di simulazione. Il mio motore di simulazione che esegue il calcolo reale era una base di codice esistente scritta in C++. Avevo bisogno di avere un front-end per la GUI, che ho codificato con successo in C++/CLI.
Dal mio punto di vista, la lingua è altrettanto facile da codificare come C# anche se con un leggero imbarazzo sintattico. Detto questo, la sintassi è molto più semplice di quella cosa gestita dalle estensioni gestite da Microsoft in precedenza.
Una delle funzionalità più potenti di C++/CLI deve essere la possibilità di ricompilare semplicemente il codice C++ nativo esistente in MSIL. Naturalmente ci possono essere singhiozzi, ma per la maggior parte delle applicazioni dovrebbe essere un esercizio senza problemi.
Per quanto riguarda l'idoneità di C++/CLI, penso che rimarrà strettamente un linguaggio per l'interoperabilità con C++. Se stai scrivendo un'app completamente nuova, non c'è assolutamente alcun motivo per scegliere C++/CLI su, ad esempio, C#. Come ho detto, lo è un po 'più scomodo da usare rispetto al secondo.
C++/CLI era straordinariamente semplice per portare il CLR into FreeSWITCH. Molto più semplice rispetto all'API di hosting o all'utilizzo di Mono.
L'ultima volta che ho utilizzato C++ gestito era nel 2003 o giù di lì. Ricordo che è un po 'un dolore e non funziona perfettamente.
L'ho usato per scrivere strati sottili di integrazione tra codice gestito e nativo. Questo è tutto però.
La caratteristica unica più noto di esso è la capacità di approfondire perfettamente in codice non gestito e modificare (o accidentalmente danneggiato) qualsiasi po 'di memoria scrivibile in tutto il processo - che non è un vantaggio nella programmazione generale, ma quando serve , è ottimo. Ma penso che ne avrò bisogno sempre meno. Puoi compilare C++/CLI con un flag/pure, ma poi diventa davvero una lingua completamente nuova.
Ci sono altre due grandi caratteristiche uniche però:
distruttori che fare qualcosa di utile. In C# un distruttore è un finalizzatore. In C++ è un distruttore definito deterministicamente corretto. Ciò significa che C++/CLI ha l'infrastruttura più completa per lavorare con
IDisposable
. C# aiuta solo i clienti (attraverso lo usando la dichiarazione), ma solo C++/CLI aiuta anche gli implementatori. Sono fiducioso che forse un giorno C# assorbirà questa funzionalità.Modelli di duck-typing, che possono essere utilizzati insieme ai generici CLI. Un'altra cosa che sarebbe molto utile in C#, anche se potrebbe essere fatta molto più facilmente senza il bagaglio storico.
Ma C# è abbastanza buono senza le ultime due cose che non sono tentato di usare C++/CLI in generale.
Vuoi dire che C++ ha più controllo su GC ed è possibile liberare la memoria immediatamente? – macropas
In C++/CLI, è possibile allocare e liberare memoria proprio come nel C++ tradizionale e un distruttore C++ viene automaticamente esposto a CLR come Dispose(), cioè si può fare vero C++ RAII con oggetti .NET. Ma non hai più controllo sul GC - puoi solo specificare dove è usato e dove no. – OregonGhost
@macropas - OregonGhost è corretto; se per GC si intende il GC del CLR, quindi il C++/CLI non ha più o meno il controllo su di esso rispetto a qualsiasi altra lingua. –
Usiamo ampiamente C++/CLI.Lo abbiamo usato per trascinare una vecchia applicazione MFC nell'era .Net, così ora possiamo scrivere la maggior parte delle nuove funzionalità in C# e integrarlo con il codice MFC legacy usando C++/CLI, sia eseguendo il wrapping delle classi native sia scrivendo nuovi oggetti business gestiti . Nei nostri vecchi assembly, stiamo ancora scrivendo nuove funzionalità anche in C++/CLI.
Non ho esperienza con "managed C++" ma C++/CLI è una gioia da usare rispetto a MFC e Visual C++. . Ha una sintassi molto più pulita rispetto a C++ o Visual C++ gestiti e non abbiamo avuto alcun problema nel far sì che anche gli sviluppatori junior potessero accelerare.
Ci sono pochi comportamenti interessanti in C++/CLI come quando si passa un oggetto nativo in un metodo su una classe gestita, si mette un sottile involucro gestito attorno all'oggetto nativo (invisibile allo sviluppatore) solo per lo scopo di fare la chiamata, ma quello shim è privato in modo così assertivo da non poter essere chiamato dall'esterno. Ci sono modi per aggirare questo, come sempre, ma ci ha colto un paio di volte all'inizio.
Utilizziamo Visual Assist X per il supporto del refactoring (accettabile), MbUnit/Gallio per il test dell'unità delle classi gestite e NMock o RhinoMocks per il nostro framework di simulazione.
Nel complesso, direi che il linguaggio ha salvato il nostro prodotto e ci consente di sfruttare tutte le novità eccitanti che accadono nel mondo dello sviluppo. Se stessimo ancora utilizzando solo Visual C++/MFC, avremmo difficoltà a reclutare sviluppatori e ad essere molto più limitati nella scelta di COT di quanto non stiamo usando .Net.
- 1. La tua esperienza con Scala + Wicket
- 2. La tua esperienza di lancio di un'applicazione su BlackBerry AppWorld?
- 3. Qual è la tua esperienza con Nitrogen su Erlang?
- 4. Combinare Knockout.js + KendoUI - Qual è stata la tua esperienza?
- 5. Oracle funziona meglio con Windows o Linux? dare la tua risposta in base alla tua esperienza
- 6. Qual è la vostra esperienza con i blocchi applicativi Microsoft
- 7. Esperienza con la protezione del codice PHP
- 8. Spiegare la limitazione del monomorfismo per me per favore?
- 9. Domande di avviamento Haskell ... per favore spiegatelo
- 10. Sposta la tua copia di lavoro
- 11. Una buona introduzione alla teoria dell'informazione, per favore?
- 12. Per favore spiegami la classe Context in Android
- 13. Descrivi il processo di rendering della pagina in un browser?
- 14. Librerie grafiche per 2D (nessuna XNA per favore)
- 15. Esperienza nell'uso della libreria di registrazione Boost.Log?
- 16. RSpec NoMethodError: "metodo non definito` descrivi 'per oggetto principale "
- 17. Qualcuno potrebbe spiegare __declspec (nudo) per favore?
- 18. C++ LOBYTE. Per favore, spiegane altro?
- 19. Per favore, spiegate l'hash del mormorio?
- 20. Esperienza con rotazione MKMapView
- 21. Qualcuno spiega perché l'ambiguità qui, per favore?
- 22. ottima esperienza di prima esecuzione
- 23. Storyboarding iOS - esperienza pratica ri: più sviluppatori?
- 24. x86 Guida all'installazione dell'assieme gcc per favore
- 25. GWT/Cometa: qualche esperienza?
- 26. Qualcuno ha qualche esperienza con Hobo?
- 27. Dovresti programmare per proteggere la tua applicazione da programmatori sbagliati?
- 28. Come si traduce la tua app per Android?
- 29. "La tua applicazione viene caricata" per sempre su iTunes Connect
- 30. In che modo la tua app per rails include javascript?
Mi chiedo, è possibile utilizzare le funzionalità C++/CLI sulla combinazione di codice gestito e non gestito in applicazioni crossplatform? O è possibile solo nella versione di Windows? – macropas
Ultimo controllo, Mono non lo supporta. – MichaelGG