2009-04-03 12 views
7

Sto chiamando un metodo tramite interoperabilità che restituisce un parametro out IntPtr. Come posso ottenere unper questo IntPtr in modo che possa operare su di esso? Ho provato il seguente:Come eseguire il cast di IntPtr su byte *

fixed(byte* ptr = (byte)myIntPtr) 

ma non ha funzionato. Qualsiasi aiuto sarebbe apprezzato!

+1

Ciao Dmitri, potresti richiedere maggiori informazioni o accettare una risposta? –

risposta

13

Si può semplicemente scrivere:

byte* ptr = (byte*)int_ptr; 

Non è necessario utilizzare la parola chiave fisso. Non vuoi appuntare l'IntPtr, vero?

+0

Anche questo funziona bene, anche se personalmente mi piace il metodo ToPointer, specialmente se non hai bisogno di convertirlo immediatamente in un puntatore di tipo specifico (ad esempio da void * a byte *). – Noldorin

5

myIntPtr.ToPointer()

+0

Si noti che la parola chiave fixed non è realmente appropriata in questo caso in quanto viene utilizzata per impedire il riposizionamento delle variabili. Poiché IntPtr è già un puntatore (gestito), in pratica si desidera solo una conversione diretta tra i due tipi. Vedi anche http://msdn.microsoft.com/en-us/library/f58wzh21(VS.71).aspx – Noldorin

+2

IntPtr in questo caso è * non * un puntatore gestito, piuttosto un puntatore non gestito! –

+1

Sì, quello che volevo dire è che IntPtr è un puntatore gestito nel senso che fa parte delle librerie gestite, mentre il byte * è un puntatore in stile C non sicuro. Forse "sicuro" sarebbe una parola migliore, anche se è importante notare la differenza tra IntPtr e SafeHandle. – Noldorin

1

Se non si desidera un codice non sicuro nell'applicazione, sarà necessario utilizzare i metodi in System.Runtime.InteropServices.Marshal o (ancora meglio) dichiarare i tipi di parametri delle proprie funzioni di interoperabilità in modo che il marshalling avvenga automaticamente.

1

Non volevo "codice non sicuro" nella mia applicazione, così ho fatto quanto segue per convertire un IntPtr in un byte []. Dato un IntPtr chiamato "unsafeDataBlock":

var byteArray = new byte[dataBlockSize]; 
System.Runtime.InteropServices.Marshal.Copy(unsafeDataBlock, byteArray, 0, dataBlockSize); 
1

Questo sembrava funzionare per me, io non stavo usando Interop, ma era ancora chiamare una funzione C++ gestito da C Sharp. La funzione C++ gestita, tuttavia, chiamava codice non gestito, quindi eseguiva la stessa operazione di Interop.

Comunque, nella funzione C++ che è stato chiamato da c-tagliente, ho usato questo codice:

(anyPointerType *) = puntatore (anyPointertype *) myIntPtr.ToPointer();

+1

Giusto per chiarire cosa intendevo per: " Non stavo usando Interop ma stavo ancora chiamando una funzione C++ gestita da C Sharp, ma la funzione C++ gestita comunque chiamava codice non gestito, quindi ha realizzato la stessa cosa di Interop. " chiamare il codice unmanged attraverso Interop: C-Sharp - (Utilizzo di Interop chiama)> codice non gestito ha lo stesso risultato di chiamare da funzione C-sharp a C++ gestita che chiama codice non gestito: C-Sharp - (Chiamate)> Funzione C++ gestita - (Chiamate)> codice non gestito e quest'ultima procedura di solito è molto più semplice –

Problemi correlati