Domanda

Vorrei chiamare le mie librerie C++ non gestite dal mio codice C#.Quali sono le potenziali insidie ​​e precauzioni da adottare?Grazie per il tuo tempo.

È stato utile?

Soluzione

Questa domanda è troppo ampia.L'unica risposta ragionevole è P/Invoke, ma è un po' come dire che se vuoi programmare per Windows devi conoscere l'API Win32.

Sono stati scritti praticamente interi libri su P/Invoke (http://www.amazon.com/NET-COM-Complete-Interoperability-Guide/dp/067232170X), e ovviamente sono stati realizzati interi siti web: http://www.pinvoke.net/.

Altri suggerimenti

Ci sono un paio di percorsi che puoi seguire: uno, puoi aggiornare le tue librerie C++ non gestite per avere un wrapper di estensioni C++ gestite attorno ad esse e fare in modo che C# utilizzi direttamente quelle classi.Questa operazione richiede un po' di tempo, ma fornisce un valido collegamento al codice legacy non gestito.Ma tieni presente che le estensioni C++ gestite a volte sono un po' difficili da navigare poiché la sintassi è simile a quella del C++ non gestito, ma abbastanza vicina da consentire a un occhio molto allenato di vedere le differenze.

L'altra strada da percorrere è fare in modo che il C++ non gestito implementi le classi COM e che C# lo utilizzi tramite un assembly di interoperabilità generato automaticamente.In questo modo è più semplice se conosci abbastanza bene COM.

Spero che questo ti aiuti.

Stai descrivendo P/Invoke.Ciò significa che la libreria C++ dovrà esporsi tramite un'interfaccia DLL e l'interfaccia dovrà essere sufficientemente semplice da poter essere descritta a P/Invoke tramite gli attributi di chiamata.Quando il codice gestito chiama nel mondo non gestito, i parametri devono essere sottoposti a marshalling, quindi sembra che potrebbe esserci un leggero calo delle prestazioni, ma dovresti fare alcuni test per vedere se il marshalling è significativo o meno.

Il modo più semplice per iniziare è assicurarsi che tutte le funzionalità C++ siano esposte come funzioni di stile "C".Assicurati di dichiarare la funzione come _stdcall.

extern "C" __declspec(dllexport) int _stdcall Foo(int a)

Assicurati di ottenere il marshalling corretto, in particolare cose come puntatori e wchar_t *.Se sbagli, può essere difficile eseguire il debug.

Eseguire il debug da entrambi i lati, ma non da entrambi.Durante il debug misto nativo e gestito, il debugger può diventare molto lento.Il debug di 1 lato alla volta consente di risparmiare molto tempo.

Essere più specifici richiederebbe una domanda più specifica.

Puoi anche richiamare codice non gestito tramite P/Invoke.Questo potrebbe essere più semplice se il tuo codice attualmente non utilizza COM.Immagino che probabilmente dovresti scrivere alcuni punti di esportazione specifici nel tuo codice utilizzando i collegamenti "C" se seguissi questa strada.

Probabilmente la cosa più importante a cui devi prestare attenzione secondo la mia esperienza è che la mancanza di raccolta dei rifiuti deterministica significa che i tuoi distruttori non verranno eseguiti quando avresti pensato che lo avrebbero fatto in precedenza.È necessario tenerlo presente e utilizzare IDisposable o qualche altro metodo per assicurarsi che il codice gestito venga ripulito quando lo si desidera.

Ovviamente c'è sempre anche PInvoke là fuori se hai impacchettato il tuo codice come DLL con punti di ingresso esterni.Nessuna delle opzioni è indolore.Dipendono da a) la tua abilità nello scrivere wrapper COM o C gestito b) cambiare il braccio con PInvoke.

darei un'occhiata sorso, lo usiamo con buoni risultati nel nostro progetto per esporre la nostra API C++ ad altre piattaforme linguistiche.

È un progetto ben gestito che crea in modo efficace un sottile wrapper attorno alla tua libreria C++ che può consentire a linguaggi come C# di comunicare direttamente con il tuo codice nativo, risparmiandoti la fatica di dover implementare (ed eseguire il debug) del codice colla.

Se vuoi un buon esempio di PInvoke puoi guardare PINvoke.net.Contiene esempi di come chiamare la maggior parte delle funzioni API di Win.

Inoltre puoi utilizzare lo strumento di questo articolo Cancella al rovescio:PInvoca che tradurrà il tuo file .h in wrapper C#.

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