void * a Object ^ in C ++ / CLI
-
18-09-2019 - |
Domanda
Sto lavorando ad avvolgere un gran numero di .he .lib file da C ++ nativo di Managed C ++ per l'uso eventuale come riferimento DLL in C #.
Alcuni dei nativo C ++ funzioni hanno un tipo di ritorno di void *. Non sono sicuro di come gestire questo quando passo indietro il valore al mio codice chiamante. Per esempio: se un C # app chiama il mio wrapper DLL, cosa posso restituire dalla chiamata nativa:
void* start(ThreadFunc,void *, unsigned *);
Al momento sto cercando di box il ritorno in un sistema generico :: Object ^ senza fortuna. Questa è la chiamata nella confezione:
m_NativeThread->start(cb,
GCHandle::ToIntPtr(GCHandle::Alloc(o)).ToPointer(),
static_cast<unsigned int*>(GCHandle::ToIntPtr(GCHandle::Alloc(u)).ToPointer())));
Chiunque può offrire una soluzione?
Soluzione
Puoi farlo un IntPtr? Cosa si aspetta il cliente a che fare con il vuoto *?
Altri suggerimenti
Se il codice gestito ha bisogno di vedere i dati nel vuoto *:
Non puoi lanciare un void * a non gestito memoria ad un riferimento oggetto gestito. Per trasformare questo in memoria gestita, dovreste usare Marshal.Copy () o Marshal.PtrToStructure (). Quella volontà di Naturalmente funziona solo se si conosce il tipo dei dati che il void * indica. fonte
Se il codice gestito non ha bisogno di vedere i dati nel vuoto *:
Conservarla in un IntPtr se il vostro codice gestito non ha bisogno di vedere che cosa è e solo lo passa di nuovo nel codice non gestito in seguito. fonte