problema al llamar a un metodo de una libreria (dll)

27/06/2007 - 13:12 por sourvivor | Informe spam
Buenas,

Cargo una libreria programada en ensamblador de la siguiente manera:
[DllImport("packet.dll", EntryPoint= "XTEA")]
private static extern Int16 XTEA(bool encriptar, Int16 tibiaID, byte[]
key,
byte[] packet, byte[] packetEncriptado, bool safeArray);

y la llamo asi:
byte[] key = ASCIIEncoding.ASCII.GetBytes("0123456789ABCDEF");
byte[] packet = ASCIIEncoding.ASCII.GetBytes("Hello this is a test");
byte[] encriptado = new byte[packet.Length];
XTEA(true, 0, key, packet, encriptado, true);

Cuando llama a la funcion, me devuelve una excepcion
AccessViolationException, con el mensaje de: "Intento de leer o
escribir en
la memoria protegida. A menudo, esto indica que hay otra memoria
dañada."

En la documentacion de la libreria dicen que el prototipo de la
funcion es:
DWORD XTEA(
BOOL Encrypt,
DWORD ProcessID,
POINTER Key,
POINTER Packet,
POINTER XTEApacket,
BOOL SafeArray,
);


A que puede ser debido este problema y como podria solucionarlo?

Gracias por leerme,
Manu~
 

Leer las respuestas

#1 RFOG
27/06/2007 - 13:51 | Informe spam
Estás intentnado pasar un objeto Byte[] en donde espera un IntPtr. Es
decir, un objeto Byte tiene, aparte del buffer donde está la cadena, 8
bytes de cabecera para el GC, más posiblemente el tamaño del buffer, y
posiblemente todavía más cosas, y la dll espera recibir un puntero (es
decir, una variable del tipo Int32 que contiene la dirección física en
donde está el buffer).

Aparte de eso tienes que "pinnear" (bloquear) los byte[] dentro del
montículo manejado para que el GC no los vaya moviendo de acá para allá.
En C# no sé cómo se hace, pero en C++/CLI hay una construcción para ello:
pin_ptr.

La conversión de Byte[] a IntPtr la tienes que hacer a través de la clase
Marshall...

"Pinnear" algo en el montículo manejado es una tarea harto peligrosa que
debe durar lo mínimo posible, es decir, pinneas, llamas y despinneas,
porque si no podrías impedir la recolección de basura, impedir
asignaciones de memoria nuevas y en general terminar tumbando tu
aplicación con alguna excepción de OutOfMemory etc.

PS: Por eso yo utilizo el C++/CLI: todas esas cosas son mucho, pero mucho
más fáciles que en C#.

En Wed, 27 Jun 2007 13:12:27 +0200, escribió:

Buenas,

Cargo una libreria programada en ensamblador de la siguiente manera:
[DllImport("packet.dll", EntryPoint= "XTEA")]
private static extern Int16 XTEA(bool encriptar, Int16 tibiaID, byte[]
key,
byte[] packet, byte[] packetEncriptado, bool safeArray);

y la llamo asi:
byte[] key = ASCIIEncoding.ASCII.GetBytes("0123456789ABCDEF");
byte[] packet = ASCIIEncoding.ASCII.GetBytes("Hello this is a test");
byte[] encriptado = new byte[packet.Length];
XTEA(true, 0, key, packet, encriptado, true);

Cuando llama a la funcion, me devuelve una excepcion
AccessViolationException, con el mensaje de: "Intento de leer o
escribir en
la memoria protegida. A menudo, esto indica que hay otra memoria
dañada."

En la documentacion de la libreria dicen que el prototipo de la
funcion es:
DWORD XTEA(
BOOL Encrypt,
DWORD ProcessID,
POINTER Key,
POINTER Packet,
POINTER XTEApacket,
BOOL SafeArray,
);


A que puede ser debido este problema y como podria solucionarlo?

Gracias por leerme,
Manu~






Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
El veloz murciélago hindú comia feliz cardillo y kiwi, La cigueña tocaba
el saxofón detrás del palenque de paja.
dónde la sacaron?).

Preguntas similares