2009-04-03 18 views
7

Estoy llamando a un método a través de interoperabilidad que devuelve un parámetro out IntPtr. ¿Cómo puedo obtener un byte* para este IntPtr para que pueda operarlo? Intenté lo siguiente:Cómo convertir IntPtr en byte *

fixed(byte* ptr = (byte)myIntPtr) 

pero no funcionó. ¡Cualquier ayuda sería apreciada!

+1

Hola Dmitri, ¿podrías solicitar más información o aceptar una respuesta? –

Respuesta

13

Simplemente puede escribir:

byte* ptr = (byte*)int_ptr; 

Usted no tiene que utilizar la palabra clave fijo. No quieres fijar el IntPtr, ¿verdad?

+0

Esto también funciona bien, aunque personalmente me gusta el método ToPointer, especialmente si no necesita convertirlo inmediatamente a un puntero de tipo específico (por ejemplo, de vacío * a byte *). – Noldorin

5

myIntPtr.ToPointer()

+0

Tenga en cuenta que la palabra clave fija no es realmente adecuada en este caso, ya que se usa para evitar la reubicación de variables. Como IntPtr ya es un puntero (administrado), básicamente solo desea una conversión directa entre los dos tipos. Consulte también http://msdn.microsoft.com/en-us/library/f58wzh21(VS.71).aspx – Noldorin

+2

IntPtr en este caso es * no * un puntero administrado, ¡más bien un puntero no administrado! –

+1

Sí, lo que realmente quise decir es que IntPtr es un puntero administrado en el sentido de que es parte de las bibliotecas administradas, mientras que byte * es un puntero de estilo C inseguro. Quizás "seguro" sería una mejor palabra, aunque es importante notar la diferencia entre IntPtr y SafeHandle. – Noldorin

1

Si no desea un código inseguro en su aplicación, tendrá que usar los métodos en System.Runtime.InteropServices.Marshal, o (aún mejor) declarar los tipos de parámetros de sus funciones de interoperabilidad para que la clasificación se realice automáticamente.

1

No quería "código inseguro" en mi aplicación, así que hice lo siguiente para convertir un IntPtr en un byte []. Dado un IntPtr llamado "unsafeDataBlock":

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

Esto parecía funcionar para mí, no estaba usando interoperabilidad pero todavía estaba llamando a una función de C++ administrado de C Sharp. Sin embargo, la función administrada de C++ llamó código no administrado, por lo que logró lo mismo que Interop.

De todos modos, en la función de C++ que se llamó desde c-agudo, he utilizado este código:

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

+1

Solo para aclarar lo que quise decir: " No estaba usando Interop, pero todavía llamaba a una función C++ administrada desde C Sharp. Sin embargo, la función administrada de C++ llamó código no administrado para que lograra lo mismo que Interop. " código de llamada unmanged mediante interoperabilidad: C-Sharp - (utiliza la interoperabilidad llama)> código no administrado tiene el mismo resultado que llamando a la función de c-sharp de C++ que llama a código no administrado: C-Sharp - (Llamadas)> Función de C++ administrada - (Llamadas)> código no administrado y este último procedimiento suele ser mucho más fácil –