Come utilizzare il codice C ++ esistente in .NET (C #)
-
22-07-2019 - |
Domanda
Vorrei creare un progetto C # e implementare il codice nativo (C ++) esistente. Qualcuno sa qualche buon tutorial a riguardo?
Grazie!
Altri suggerimenti
Se il tuo codice C ++ è gestito (come dici tu), allora ti suggerisco di lasciarlo come C ++ a meno che tu abbia un'ottima ragione per - futuri assiemi C # (ecc.) dovrebbe essere in grado di fare riferimento solo "così com'è".
Suppongo che implementi il ??codice esistente intendi che vuoi chiamarlo da C #, con modifiche minime al codice C ++.
Sono un fan e un recente acquirente del libro C ++ / CLI in Action che ha un paio di utili capitoli di esempio online.
Questa intro su CodeProject è un buon punto di partenza.
L'autore di C ++ / CLI in Action ha una serie di articoli su CodeProject, scorrere fino alla sezione C ++ / CLI su il suo indice .
L'articolo di Wikipedia su P / Invoke ha una serie di motivi per cui potresti non voler usare questo approccio, con il quale concordo:
- perdita del supporto per la digitazione da parte del compilatore
- possibili tipi di dati o problemi di allineamento poiché è necessario mapparli manualmente
- è necessario aggiungere oggetti raccolti nell'immondizia
Il miglior punto di partenza su MSDN è articolo di riepilogo .
Perché non provi i wrapper gestiti per il tuo codice C ++.
Probabilmente il modo più semplice per farlo è creare un progetto C ++ / CLI, che ti permetterà di mescolare C ++ gestito e non gestito. È quindi possibile racchiudere le classi C ++ non gestite esistenti con un wrapper .Net gestito che il codice C # può chiamare direttamente. La rivista MSDN ha un buon articolo su C ++ / CLI. p>
L'interoperabilità sarà davvero utile solo per chiamare le funzioni in stile C. Non puoi davvero usarlo per interagire con classi C ++ pure.
L'ho imparato facendolo, quindi non ho un buon tutorial, ma ci sono un paio di cose di cui devi essere consapevole: C ++ e C ++ / CLI gestiti si integrano entrambi con codice non gestito con pochissime cuciture brutte. Questo non è il caso di C #. Nel C ++ gestito, è del tutto possibile fare qualcosa del genere:
dotNetForm->Text = S"My Project"; // regular managed code
::SetWindowText(dotNetForm->Handle, "Your Project"); // mixed managed/unmanaged
mentre in C # dovresti P / Invoke in SetWindowText - non che lo faresti davvero: è solo un semplice esempio, ma devi essere consapevole che il compilatore C ++ gestito è una strana combinazione di fare molto interoperabilità per te in modo trasparente e non fare nulla per te allo stesso tempo (cioè, non comporterà il marashalling implicito).