Domanda

Quindi, un commento comunemente ascoltato quando si parla di prestazioni è che si scrive il codice con qualsiasi lingua per ottenere il lavoro più velocemente. Se le prestazioni in aree specifiche sono un problema, riscrivi quei bit in C / C ++.

Ma cosa succede se inizi con un'app C ++ nativa? Quali opzioni hai se vuoi scrivere i bit facili o riformattare i bit vecchi, in un linguaggio come Python, Ruby, C # o altro? Tieni presente che il trasferimento di dati tra nativo e altri lati è un must. Essere in grado di chiamare semplicemente una funzione scritta in un "facile" il linguaggio, passando le classi C ++ come dati, sarebbe bello.

Abbiamo un'app Win32 crostosa che trarrebbe grandi benefici se potessimo produrre nuovo codice, o refactment vecchio codice, in C # o qualcosa del genere. Molto poco richiede la complessità del C ++, e gestire i piccoli bit complicati sta trascinando verso il basso il processo di programmazione.

È stato utile?

Soluzione

Come Aaron Fischer suggerisce, prova a ricompilare l'applicazione C ++ con l'opzione / clr attivata e quindi inizia a sfruttare la piattaforma .Net.

CLI / C ++ è abbastanza facile da imparare se conosci già C # e C ++ e fornisce il ponte tra il mondo .Net e il C ++ nativo.

Se il tuo attuale codice C ++ non può essere compilato in modo pulito con / clr attivato, ti suggerirei di provare a compilare la tua applicazione come lib statica (senza / clr abilitato) e quindi avere main () in una CLI / Progetto C ++ che chiama il punto di ingresso dell'app legacy. In questo modo puoi almeno iniziare a sfruttare .Net per nuove funzionalità.

Per esempi di " legacy " App C / C ++ che sono state "portate" " su .Net CLI / C ++ controlla le porte .Net di Quake 2 e Quake 3: Arena .

Altri suggerimenti

Beh, dipende davvero dalla lingua. L'interfaccia di Python, ad esempio, viene eseguita più facilmente con Boost Python e molte altre lingue richiedono di interfacciarli come faresti con C, usando la loro libreria C e dichiarando che i tuoi callback sono esterni "C " (peccato che di solito non si possano usare le definizioni di classe C ++ in altre lingue).

Ma vorrei anche chiederti per cosa intendi usarlo, dato che C ++ è un linguaggio complesso, ma una volta che lo conosci, è molto potente e non molto più difficile da codificare rispetto ad altre lingue. L'unica eccezione davvero buona che mi viene in mente è se hai intenzione di utilizzare una potente libreria che esiste solo in una lingua e non esiste un'alternativa C ++ decente (le librerie grafiche sono probabilmente il miglior esempio di questo perché devi essere molto familiare con loro per usarli in modo efficace).

Vale anche la pena sottolineare che se si interfaccia il codice C ++ in un'altra lingua, si perde la compatibilità interpiattaforma concessa da quella lingua.

Se vuoi lavorare tra C ++ e Python, allora Boost Python è quello che stai cercando. Puoi scrivere a mano i collegamenti C Python per Cython, ma questo limita in molti modi il modo in cui scriverai il tuo codice. Questo è il modo più semplice, come si vede in alcuni frammenti di questo tutorial :

Una semplice funzione che esegue un ciao mondo:

char const* greet()
{
   return "hello, world";
}

Il codice Python Boost necessario per esporlo a Python:

#include <boost/python.hpp>

BOOST_PYTHON_MODULE(hello_ext)
{
    using namespace boost::python;
    def("greet", greet);
}

Come usare questo codice da Python:

>>> import hello_ext
>>> print hello.greet()
hello, world

Andare nella direzione opposta è un po 'più difficile, poiché python non si compila in codice nativo. Devi incorporare l'interprete Python nella tua applicazione C ++, ma il lavoro necessario per farlo è documentato qui . Questo è un esempio di chiamata all'interprete Python ed estrazione del risultato (l'interprete Python definisce la classe di oggetti da usare in C ++):

object result = eval("5 ** 2");
int five_squared = extract<int>(result);

È possibile modificare il supporto del runtime della lingua comune nel progetto c ++ in / clr. Da questo punto puoi utilizzare qualsiasi funzionalità .net direttamente nel tuo codice c ++. Ciò include anche la creazione di winform nel tuo progetto. Puoi anche aggiungere una libreria c # che gestisce l'interfaccia utente e altre funzionalità.

Nel mondo .NET hai sempre la possibilità di creare un livello di interoperabilità COM / ActiveX per il tuo assieme C # / VB.NET.

È quindi possibile utilizzare l'API COM normale dall'applicazione C ++ per creare un'istanza di questo server COM che avvolge effettivamente l'assembly .NET.

La cosa positiva è che parametri semplici come int, bool, string, float ecc. sono mappati sul loro equivalente COM per te. Tuttavia, per quanto ne sappia, non è possibile passare facilmente oggetti .NET completi (istanze di classi create).

Inoltre, tenere presente che le chiamate di interoperabilità COM sono relativamente lente. Non dovresti chiamare continuamente un metodo di interoperabilità COM dal tuo codice C ++ in un ciclo stretto.

COM / ActiveX si sono basati tradizionalmente sul registro di Windows, non l'ideale in quanto è una grande dipendenza. Tuttavia è anche possibile usare senza registrazione interoperabilità COM evitare questa dipendenza.

Questo articolo illustra i passaggi necessari per registrare un assembly .NET per Interoperabilità COM.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top