2009-06-09 24 views
5

Estoy interactuando con un componente ActiveX que me da una dirección de memoria y el número de bytes.Dirección de memoria de acceso en C#

¿Cómo puedo escribir un programa C# que acceda a los bytes comenzando en una dirección de memoria determinada? ¿Hay alguna manera de hacerlo de forma nativa, o voy a tener que hacer interfaz con C++? ¿El componente ActiveX y mi programa comparten el mismo espacio de memoria/dirección?

Respuesta

7

Le recomiendo que use un IntPtr y Marshal.Copy. Aquí hay un código para comenzar. memAddr es la dirección de memoria que se le ha asignado, y bufSize es el tamaño.

IntPtr bufPtr = new IntPtr(memAddr); 
byte[] data = new byte[bufSize]; 
Marshal.Copy(bufPtr, data, 0, bufSize); 

Esto no requieren el uso de código no seguro que requiere que el la opción de compilador/inseguro y no es verificable por el CLR.

Si necesita una matriz de algo que no sean bytes, simplemente cambie la segunda línea. Marshal.Copy tiene un montón de sobrecargas.

+0

Gracias por el ejemplo de código; esto es lo que terminé usando. – chocojosh

2

Creo que está buscando el tipo IntPtr. Este tipo (cuando se usa dentro de un bloque unsafe) le permitirá usar el controlador de memoria del componente ActiveX.

10

Puede usar Marshal.Copy para copiar los datos de la memoria nativa a una matriz administrada. De esta forma, puede usar los datos en código administrado sin usar el código unsafe.

+0

Esta es probablemente una forma mucho más elegante que usar código inseguro. Mi programa ahora funciona con código inseguro; pero lo volveré a ver más adelante para ver si puedo reemplazarlo con Marshal.Copy – chocojosh

1

C# puede usar punteros. Simplemente use la palabra clave 'inseguro' en frente de su clase, bloque, método o variable miembro (no variables locales). Si una clase está marcada como insegura, todas las variables miembro también son inseguras.

unsafe class Foo 
{ 

} 

unsafe int FooMethod 
{ 

} 

continuación, puede utilizar punteros con * y & al igual que C.

No sé acerca de los componentes de ActiveX en el mismo espacio de direcciones.

+0

Terminé usando esta solución después de publicar la pregunta. _axetRecord1.SourceBufferMemoryPointer almacena la ubicación del comienzo del búfer de memoria. El siguiente código funciona: [código] corto * memPtr; memPtr = (short *) _ axetRecord1.SourceBufferMemoryPointer; [/ code] – chocojosh

+0

¡Sin embargo, tiene que anclar la instancia si va a pasarla al código nativo! –

Cuestiones relacionadas