È possibile utilizzare C ++ con il framework .NET?


18

Ho letto molti commenti sulla programmazione della GUI, sia in C # che in C ++. E ho notato che il framework .NET di Microsoft è potente per la programmazione della GUI. Quindi è possibile utilizzare il framework C ++ e .NET?

Penso che sarà una grande combinazione poiché C ++ è un linguaggio potente e .NET framework è preferito per la programmazione della GUI su Windows, come ho letto. È possibile scrivere la GUI in C # e la funzionalità in C ++?


7
C # è anche un linguaggio molto potente.
Adam Crossland,

2
@Ramhound: non è affatto vero che C ++ / CLI sia potente come C #. Il codice C ++ / CLI contiene tutte le ottimizzazioni dal compilatore C ++ e può essere eseguito più velocemente e contiene ancora molte tecniche di metaprogrammazione e preprocessore che non sono in C #.
DeadMG

2
Inoltre, non dovrebbe essere una sfida raccogliere C # se uno è bravo in C ++. Non sto dicendo ma sto dicendo.
Rig

4
Dato che conosci C ++, avresti una scelta tra l'apprendimento di C ++ / CLI o C #. Né è C ++ reale. Suggerirei di imparare C # piuttosto che tentare di lavorare con C ++ / CLI; C ++ / CLI non è una lingua nativa da nessuna parte, quindi troverai molti libri e supporto per C #.
David Thornley,

6
@ddacot no, C ++ non è pensato per lo sviluppo di giochi. È pensato per lo sviluppo di software, proprio come tutti gli altri linguaggi di programmazione. I giochi sono solo un tipo di software.
MattDavey,

Risposte:


21

Sì, in precedenza era noto come Man ++ C ++ e ora C ++ / CLI . Puoi accedere a .NET Framework (GUI: WinForms, GDI +, ecc.) Come faresti dagli altri tre linguaggi gestiti raggruppati, C #, F # e VB.NET.


+1 alla risposta di Jesse. Se non sbaglio, C ++ / CLI non supporta l'ereditarietà multipla. Quindi, preparati ad alcune funzionalità inaspettate. Alcune di queste funzionalità derivano dalle limitazioni della CLI. Ti consiglio di provare a trovare la differenza tra C ++ / CLI e C ++ "classico" prima di iniziare a usarlo.
Igor Soloydenko,

Questo è menzionato in dettaglio nel primo link. Il riassunto è quindi: "Il C ++ si è evoluto molto nel tempo e la maggior parte dei software scritti nel linguaggio è orientata agli oggetti. Il C ++ gestito e l'uso di classi e oggetti basati su classi rimangono prevalenti come in Visual C ++. L'unica grande modifica a questo in Managed C ++ è che le funzionalità di ereditarietà multipla non sono supportate. Ciò è dovuto a una limitazione del CLR. Una classe gestita sotto il garbage collector del CLR non può ereditare più di una classe. "
Jesse C. Slicer,

Va bene. In realtà, non sono bravo in C ++. Ho solo pensato che ci possono essere altre importanti differenze che possono creare problemi.
Igor Soloydenko,

L'ultima volta che ho scritto del C ++ è stato letteralmente nel corso dell'ultimo secolo :)
Jesse C. Slicer,

1
@keykeeper, un uso tipico di C ++ / CLI è quello di essere un ponte sottile tra una libreria C ++ non gestita e il mondo gestito. È sufficiente per un tale uso. Naturalmente non ha senso codificare qualcosa di considerevole in esso.
Logica SK

6

Non dimenticare l'opzione più flessibile e semplice, tipica del mondo Unix ma, per qualche motivo, non così comune in Windows: suddividere la GUI e la logica in diversi processi, comunicare tramite qualsiasi forma ragionevole di RPC (ad esempio, anche una pipe dovrebbe opera). Preferibilmente con un protocollo di testo semplice e leggibile dall'uomo.

In questo modo puoi implementare la tua GUI (o varie GUI) con qualsiasi tecnologia tu voglia, e costruire componenti logici da qualunque cosa si adatti meglio al bisogno - C ++, script, qualunque altra cosa.

Non sono a conoscenza di alcun ragionevole vantaggio di un approccio progettuale monolitico dal mondo Windows.


4

L'ho fatto una volta qualche anno fa, ai tempi di Managed C ++. Avevamo una logica di business in una DLL umanizzata che volevamo incorporare in una GUI in stile procedura guidata scritta in C #. Per fare ciò, ho creato un assembly C ++ gestito per sedersi tra l'app GUI gestita e la DLL non gestita e ho usato System :: Runtime :: InteropServices :: Marshal all'interno di quell'assembly per convertire i valori da tipi gestiti (System :: Int32) a non gestiti tipi (int) e viceversa.

Mentre il C ++ gestito sembra deprecato, lo stesso principio potrebbe essere applicato al C ++ / CLI.


3

Non proprio. Esiste un linguaggio ibrido C ++ / CLI, ma è utile solo per l'interoperabilità (politica ufficiale di Microsoft). A causa del modo in cui è progettato .NET framework, ci sono molte semantiche di linguaggio che non si adattano perfettamente al CLR e C ++ ne mostra molte.


7
Non sono d'accordo con questa affermazione. C ++ / CLI è perfettamente adatto per molte implementazioni.
Ramhound,

3
@Ramhound: Microsoft stessa lo consiglia solo per l'interoperabilità. Questa è la loro politica ufficiale.
DeadMG

2
@DeadMG puoi fornire una fonte per questo?
sq33G,

1
@DeadMG, ti sbagli. Esistono così tante opzioni per eseguire .NET GUI con una logica nativa.
Logica SK

2
@DeadMG - A meno che tu non fornisca la prova che è la politica ufficiale di Microsoft (non ci credo per un minuto), allora
stai

3

Finora l'angolo C ++ / CLI è stato coperto da molte risposte, ma un altro modo per farlo è usare PInvoke. Ciò consente ai programmi C # di chiamare le funzioni contenute nelle DLL che sono state scritte in C ++. Il vantaggio di PInvoke è che la tua dll è totalmente agnostica riguardo al fatto che verrà chiamata da .Net. Questo significa che puoi chiamare le DLL per le quali non hai un codice sorgente e anche se hai creato il codice sorgente non dovresti ricompilarlo usando l'opzione / clr. Ciò significa che è possibile utilizzare questa dll con altri programmi C ++, nonché con i programmi C #. Ci sono alcune fantastiche librerie C / C ++ là fuori: PInvoke ti consente di trarne vantaggio. A volte le librerie Win32 forniscono funzioni che non sono disponibili in .Net: PInvoke consente di utilizzarle.

Una delle parti più difficili dell'utilizzo di PInvoke è sapere come convertire la firma non gestita in una firma gestita. Ma c'è un cheatheet che ti aiuta a farlo.


Ma quando P / Invocare C ++ direttamente, sii consapevole delle alterazioni o meglio fornisci un involucro C sottile nel mezzo.
Logica SK

0

Puoi anche lavorare con un aneto C # tramite COM (Component Object Model). Per me COM era meglio quindi usare Managed C ++ poiché Visual Studio 2010 non ha intellisense per Managed C ++. Nel mio caso abbiamo già un'applicazione C ++ di grandi dimensioni, ma volevamo provare a passare da MFC a WinForms o WPF.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.