Io utilizzo una vecchia API e devo passare il puntatore di una struct al codice non gestito che viene eseguito in modo asincrono.Bloccare una struttura aggiornabile prima di passare al codice non gestito?
In altre parole, dopo aver passato il puntatore della struct al codice non gestito, il codice non gestito copia il puntatore e restituisce immediatamente. Il codice non gestito può accedere a quella struttura in background, in un'altra discussione. Non ho il controllo sul codice non gestito eseguito in un altro thread né sul thread stesso.
L'istruzione {} fissa non può essere utilizzata per il blocco perché non progettata per il blocco non gestito asincrono.
GCHandle può bloccare solo i riferimenti, pertanto la struttura deve essere racchiusa in un riquadro per utilizzare GCHandle. Ho provato e funziona. Il problema principale è che non è possibile aggiornare la struct dal codice gestito. Per aggiornare una struttura, prima di tutto abbiamo bisogno di unbox, quindi aggiornare, quindi box di nuovo, ma ... oops ... box di nuovo?!? questo significa che il puntatore precedente nella memoria punta ancora alla vecchia struct non aggiornata, e la nuova struct ha un altro puntatore, e questo significa che ho bisogno di passare il nuovo puntatore al codice non gestito ... inapplicabile nel mio Astuccio.
Come posso bloccare una struttura nella memoria senza l'istruzione {} fissa e in modo che possa aggiornarlo dal codice gestito senza cambiare è il puntatore?
Grazie.
Edit:
solo pensato ... c'è un modo per appuntare l'oggetto padre che contiene la struct, e quindi ottenere il puntatore del struct piuttosto che l'oggetto contenitore?
Mi sarei aspettato che GCHandle fosse la soluzione qui. Se tutto fallisce, è possibile allocare la memoria nel codice non gestito, quindi non è soggetto a essere spostato dal GC. – dtb
Buona domanda. Penso di averlo fatto in CLI/C++, dovrò rivedere le mie note di lavoro su di esso. Non sono sicuro se c'è un meccanismo equivalente C#, tuttavia. –
Forse è possibile effettuare la chiamata in un thread in background, utilizzare fixed {} e non lasciare mai il blocco {} fisso (almeno finché il codice non gestito potrebbe accedere alla struttura)? –